(在Windows中)PE文件格式包含带有Module\Dll Name的导入表,该表告诉PE加载程序在哪里搜索符号,例如KERNEL32.dll -> CreateFileW

在ELF文件格式中,带有Symbol table字段的info告诉符号是否为Global\Local\Weak\etc.

我的问题是Unix加载器如何知道共享的模块是什么对象在哪里搜索此符号,例如???? -> snprintf

我注意到objdump可以转储此信息objdump -T /bin/ls

GLIBC_2.2.5 snprintf

对ELF文件格式有更多了解的人可以在Unix上有所启发动态链接?

#1 楼


Unix加载器如何知道模块是什么,
共享对象在哪里搜索该符号

简短的回答:不能。它仅搜索已加载模块的整个列表,直到找到(或未找到)符号为止。通过版本化符号可以对更精确的符号匹配进行少量控制,但否则几乎是免费的。

通过设计,ELF符号空间是全局的(或平坦的),因此任何符号都可以被另一个模块抢占。例如,当通过LD_PRELOAD_LIBRARY环境变量挂钩符号时,将使用此方法。