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环境变量挂钩符号时,将使用此方法。