为什么我的 ELF 文件的符号表中会出现带有本地绑定的符号?

逆向工程 linux 小精灵
2021-06-13 03:03:52

我发现ELF 可执行文件/库的符号表 ( ) 中有带有binding=LOCALvisibility=HIDDEN的符号.symtab他们需要什么?它们不参与重定位过程,也不能从外部调用。它们是否包含在用于异常处理的符号表中?

1个回答

符号绑定和符号可见性

他们需要什么?

链接编辑器( ld)必须有一种方法可以在链接时确定符号的范围。换句话说,符号绑定允许链接编辑器区分仅在被链接的特定文件中可见的符号(本地范围)与可以从位于其他文件中的函数中引用的符号(全局范围)。

符号可见属性(默认情况下,保护,隐藏或内部)有特殊含义runtime-(动态)连接器(ld-linux.so.*,告诉它哪个符号表的符号由内部可执行对可能由其它可执行文件中使用的符号使用在程序运行时动态链接到它。

为什么符号可见性好

ELF 有两个相关的概念来管理程序中的符号。第一个概念是符号绑定全局绑定意味着符号在正在构建的文件之外可见;局部绑定是相反的,它只保持符号局部(静态),弱就像全局,但暗示符号可以被覆盖。

这一切都很好,但是当您想要加载许多不同的模块并保持严格的 API(例如,动态库!)时,就会开始崩溃。

绑定属性对于链接器将目标文件放在一起很有用;但不是一个完整的解决方案。

为了解决这个问题,ELF 提供了可见性属性。符号可以是默认的、受保护的、隐藏的或内部的。使用这些属性,我们可以为动态加载器标记额外的信息,以便它知道哪些符号供公众使用,哪些仅供内部使用。

使用此功能的最合乎逻辑的方法是默认隐藏所有符号-fvisibility=hidden,然后“在墙上打孔”使您希望看到的那些符号可见。

符号和重定位

他们不参与搬迁过程

这是错误的。

来自System V ABI 版本 4.1(通用),第 4 章:对象文件,重定位

重定位是将符号引用与符号定义连接起来的过程。例如,当程序调用一个函数时,相关的调用指令必须在执行时将控制转移到正确的目标地址。

来自Oracle 链接器和库指南,第 I 部分:使用链接编辑器和运行时链接器,第 2 部分:链接编辑器符号处理

在输入文件处理期间,来自输入可重定位对象的所有本地符号都被传递到输出文件图像。来自输入可重定位对象的所有全局符号,以及来自共享对象依赖项的全局符号,都在链接编辑器内部累积。

符号和程序运行时

也不能在外部调用它们

在程序运行时永远不会调用符号。在运行期间,CPU 中的指令指针跳转到位于链接编辑器(重定位)计算出的偏移量处的指令的虚拟内存中的内存地址。如果符号在运行时相关,则无法从可执行二进制文件中删除(剥离)符号表。