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 中的库符号和用户符号的主要内容,如果未能解决你的问题,请参考以下文章