在不同的动态加载对象中以不同方式解析符号
问题描述:
阅读thesequestions后,我正在查找有关如何控制符号解析顺序的更多详细信息。在不同的动态加载对象中以不同方式解析符号
在我的问题中,我有主要可执行文件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
。
我想呼吁在exec
foo
解决到exec
“在b.so
的实现,并呼吁决心c.so
的实现。这种类型的东西在不同的对象中具有不同的符号查找可能吗?
答
不幸的是,没有办法在每个库级别调整符号分辨率,所以没有简单的方法来实现这一点。
如果foo
在主要可执行实际执行(不只是copy-relocated它)有什么可以做,因为从主可执行文件符号解析过程中获得最高的优先级(除非你确定与GOT的最终哈克运行时的修补其你不是)。
但如果
-
foo
在c.so - 实现和你拼命足够
,你可以做到以下几点:
- 获取返回内拦截地址在a.so(使用
__builtin_return_address
) - 匹配它b.so的边界取决于结果
- (可以从
/proc/self/maps
获得),或者做特殊处理(如果呼叫者是在b.so)或RTLD_NEXT
此的前向呼叫当然有明显的局限性例如如果b.so调用另一个d.so的函数,则该函数将不起作用,然后调用foo
,但在很多情况下它可能已足够。是的,我已经看到这种方法在实践中部署。
我怎样才能用''dlsym''来做到这一点?我看到''a.so''怎么可以用''dlsym''来引用''c.so'''foo'',但是有没有办法使用''dlsym''来制作' 'b.so''使用它? –
对不起,误解了这个问题。我已经更新了答案,希望现在更有帮助。 – yugr
感谢您的编辑!然而,所有的依赖关系只在图中向下(''a.so''只能调用到''b。所以''),这意味着'__builtin_return_address'技巧将无法工作。另外,它实际上是在''exec''和''c.so''中''foo'的单独实现。 GOT黑客攻击中是否有任何资源(这不是我想去的道路,但是我想了解的东西)? –