dre*_*wag 44 c unix gcc shared-libraries dynamic-linking
我链接两个不同的共享库.两个库都定义了一些共享名称但具有不同实现的符号.我不能让每个库使用自己的实现而不是另一个.
例如,两个库都定义了一个bar()内部调用的全局函数.库1调用它foo1(),库2调用它foo2().
Lib1.so:
T bar
T foo1() // calls bar()
Run Code Online (Sandbox Code Playgroud)
Lib2.so:
T bar
T foo2() // calls bar()
Run Code Online (Sandbox Code Playgroud)
如果我将我的应用程序链接到Lib1.so然后链接到Lib2.so即使在调用时也会调用Lib1.so中的bar实现foo2().另一方面,如果我将我的应用程序链接到Lib2.so然后链接到Lib1.so,则始终从Lib2.so调用bar.
有没有办法让库总是更喜欢自己的实现高于任何其他库?
nin*_*alj 47
有几种方法可以解决这个问题:
通过-Bsymbolic或-Bsymbolic-functions以链接.这具有全局效果:对-Bsymbolic-functions可以解析为库中符号的全局符号(函数类型)的每个引用都将解析为该符号.这样就无法使用LD_PRELOAD将内部库调用插入到这些符号中.符号仍然被导出,因此可以从库外部引用它们.
使用版本脚本将符号标记为库的本地符号,例如使用类似于:{local: bar;};并传递--version-script=versionfile给链接器.不导出符号.
使用适当的可见性标记符号(可见性的GCC信息页面),它将是隐藏的,内部的或受保护的.保护可见性符号被导出为.protected,隐藏符号不会被导出,内部符号也不会被导出,您不应该从库外部调用它们,甚至是通过函数指针间接调用它们.
您可以检查导出的符号objdump -T.
您必须创建两个“包装器”共享库,每个现有库一个。每个都应该使用 --dynamic-list 构建,该列表仅列出定义 API 的一些不冲突的符号。您还需要 -Bsymbolic 以避免任何全局组合。
通过 dlopen 使用合适的选项访问生成的库可能会压力更小。
| 归档时间: |
|
| 查看次数: |
21996 次 |
| 最近记录: |