在阅读these questions后,我正在寻找有关如何控制符号解析顺序的更多细节。
在我的问题中,我有主要的可执行文件exec
。 exec
动态链接到a.so
和c.so
。 a.so
动态链接到b.so
。 b.so
调用函数foo
,该函数通常由c.so
提供,但在这种情况下也由exec
提供。 b.so
仅适用于c.so
foo
的实施。
情况图:
exec (foo caller and provider)
| \
a.so |
| |
b.so | (foo caller)
| /
c.so (foo provider)
我只能控制a.so
的编译/来源,并使用a.so
将exec
与LD_PRELOAD
相关联。
我希望拨打foo
中的exec
来解析exec
的实施,并拨打b.so
来解析c.so
1}}的实施。这种类型的东西在不同的对象中可能有不同的符号查找吗?
答案 0 :(得分:0)
不幸的是,没有办法在每个库级别调整符号解析,所以没有简单的方法来实现这一点。
如果 foo
实际上是在主可执行文件中实现的(不仅仅是copy-relocated),那么你无能为力,因为主要可执行文件中的符号在解析期间获得最高优先级(除非你没事最终是对GOT进行hacky运行时修补,但事实并非如此。
但是如果
foo
在c.so 您可以执行以下操作:
__builtin_return_address
)/proc/self/maps
获得)RTLD_NEXT
这当然有明显的局限性,例如如果b.so从另一个d.so调用函数然后调用 foo
,则无效,但在许多情况下可能就足够了。是的,我已经看到这种方法在实践中得到了部署。