ELF 中的库符号和用户符号

Posted

技术标签:

【中文标题】ELF 中的库符号和用户符号【英文标题】:Library symbols and user symbols in ELF 【发布时间】:2011-10-07 06:11:16 【问题描述】:

我的问题与 ELF 中的符号有关。正如我们所知,ELF 的符号表包含定位和重定位程序的符号定义和引用所需的信息。

我的问题是,我们能否区分 b/w 库符号和用户定义符号(如果两者都是全局的)?考虑没有源代码可用并且您只有 ELF 的场景。

【问题讨论】:

“库符号”和“用户定义的符号”是什么意思? 来自“库符号”我的意思是库变量。与用户符号相同表示程序中的用户定义变量 但是是什么让它们与众不同?考虑实现一个库。这些符号是用户定义的还是库的? 哦,顺便问一下,你需要它做什么?也许这样说会让你更清楚你需要捕捉什么确切的差异。 来自库 我的意思是 glibc 变量和函数。我有一个 Linux ELF。我制作了一个运行时工具,它从 ELF 中选择函数,并动态查找与其他函数共享的全局变量。但我只想要用户定义的函数(程序中的函数)我不想包含 glibc 函数(例如 printf)。有没有办法从符号表中检测? 【参考方案1】:

静态库只是未链接目标文件的存档 (.o)(带有索引以加快链接器在其中搜索符号的速度)。当您链接到此类库时,链接器会获取每个未解析的符号并尝试在那里找到它。如果找到它,它会提取相应的对象并将其添加到要链接的集合中。所以不,你无法判断符号是否来自静态库

如果您有另一个与可执行文件所链接的对象足够接近的库实例,您可以查看它定义了哪些符号,然后假设所有这些符号以及所依赖的任何符号都来自该库。

当然可以告诉共享库中定义的符号,因为那仍然是不同的文件。

但还有一点:提供没有静态链接到 libc 的源的 Linux 二进制文件很可能是非法。也就是说,如果该 libc 是 GNU Libc,则绝对是非法的,因为它是根据 LGPL 的条款分发的,而 LGPL 要求提供(应要求)所有派生代码的源代码,但动态链接到它的代码除外。时间>。如果它使用不同的 libc,例如 sourceware newlib 或仿生 libc (android)(我找不到其他的)。然而,我不确定这样的代码在基于 GNU libc 的系统中的效果如何。

【讨论】:

以上是关于ELF 中的库符号和用户符号的主要内容,如果未能解决你的问题,请参考以下文章

PowerPC-object与elf中的符号引用

共享对象中的符号

将符号强制到 ELF 文件的顶部

elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系

程序运行之ELF 符号表

Linux下的库操作工具-nmarlddldconfig和ld.so