我有以下设置:
使用LD_PRELOAD技巧将共享库注入到应用程序中。加载后,它会启动一个TCP服务器,通过该服务器公开应用程序内部对象。目标是访问应用程序内部,而无需专门修改应用程序的源代码。
我看到的奇怪的事情是共享库被加载了两次,我无法理解为什么。由于库和应用程序都依赖于Qt,我会理解Linux是否会加载相同Qt库的多个副本。
但是应用程序不依赖于共享库,我没有覆盖应用程序本身的任何函数。
我想知道:
如何防止共享库被加载两次(我正在考虑使用shell环境变量,但这似乎是一个丑陋的黑客攻击)
什么可能导致共享库被加载两次
Employed-Russian的评论(见下文)引导我朝着解决问题#2的正确方向前进。目标应用程序正在启动子进程,该进程继承了包含的LD_PRELOAD环境变量。子进程是库加载两次的原因。
关于问题#1,我也遵循了他的建议:库初始化函数只是取消设置环境变量LD_PRELOAD。因此,子进程不再重新加载库。
答案 0 :(得分:2)
什么可能导致共享库被加载两次
加载程序需要花费很长时间才能不加载相同的共享库两次。
您极有可能将代码链接到两个单独的共享库中,并且 会导致所有混淆。
设置LD_DEBUG=libs,files
应该清楚地显示从哪些路径加载库。