ZHCADC4A September 2011 – March 2014
当一个对象引用在另一对象中定义的全局符号时,此对象为导入符号,定义的对象为导出符号。假设两个不同对象定义和导出同一符号。其中一个定义优先于并抢占 另一定义。抢占使动态链接的行为与静态链接相同:可执行文件的定义抢占库的定义,因此不会链接库的实例。在动态链接情况下,库可能已加载,并且只有一个客户端需要共享实例中的定义。
抢占意味着即使一个符号在静态链接时似乎在模块内定义,但实际上它可能在动态链接时替换为不同定义。这会对编译器产生影响,编译器必须生成代码,就像导入符号一样。因此,抢占的成本很高(即使它实际并未发生)。节 6.8讨论了性能影响。Linux 使用称为“作为自有导入”的技术(如节 15.9所述)来减轻可执行文件的损失。
ELF 符号表中的符号可见性字段指示符号的可抢占性。标记为 STV_HIDDEN 或 STV_INTERNAL 的符号不会导出(因此不可抢占)。标记为 STV_PROTECTED 的符号将导出,但无法被抢占。标记为 STV_DEFAULT 的符号可以被抢占。
特定于平台和工具链的不同约定适用于哪些符号可以被抢占以及编程器如何指定可见性。