解析动态重定位时符号查找的搜索顺序是什么?
当解析共享库的符号时,加载程序首先在“主可执行文件”中搜索(以让主可执行文件覆盖定义...)还是什么?
根据我的理解,每个可执行对象都有自己的“查找范围”:
- 主可执行文件通常是“全局”查找范围中的第一个对象。这意味着主可执行文件中定义的符号将覆盖依赖共享库中的符号。使用添加的共享对象
LD_PRELOAD
设施被添加到全局查找范围,就在主可执行文件之后。
- 但是,如果正在加载的共享对象使用
DF_SYMBOLIC
标志,则源自该对象的符号引用将在全局查找范围中搜索之前查找该对象内的定义。
- 使用打开的共享对象
dlopen()
可能有自己的依赖关系。如果RTLD_GLOBAL
调用期间未设置标志dlopen()
,这些依赖项将添加到该对象的查找范围中,但不会影响全局查找范围。如果RTLD_GLOBAL
标志被传递给dlopen()
,那么共享对象(及其依赖项)将被添加到“全局”查找范围,从而更改后续符号查找的行为。
乌尔里希·德雷珀的指南“如何编写共享库” 推荐阅读有关该主题的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)