Linux共享库正在加载两次

时间:2016-06-28 20:32:23

标签: c++ linux qt shared-libraries

我有以下设置:

  • 一个非常复杂的基于Qt + QML的应用程序
  • 一个也有一些Qt功能的共享linux库

使用LD_PRELOAD技巧将共享库注入到应用程序中。加载后,它会启动一个TCP服务器,通过该服务器公开应用程序内部对象。目标是访问应用程序内部,而无需专门修改应用程序的源代码。

我看到的奇怪的事情是共享库被加载了两次,我无法理解为什么。由于库和应用程序都依赖于Qt,我会理解Linux是否会加载相同Qt库的多个副本。

但是应用程序不依赖于共享库,我没有覆盖应用程序本身的任何函数。

我想知道:

  1. 如何防止共享库被加载两次(我正在考虑使用shell环境变量,但这似乎是一个丑陋的黑客攻击)

  2. 什么可能导致共享库被加载两次

  3. 修改

    Employed-Russian的评论(见下文)引导我朝着解决问题#2的正确方向前进。目标应用程序正在启动子进程,该进程继承了包含的LD_PRELOAD环境变量。子进程是库加载两次的原因。

    关于问题#1,我也遵循了他的建议:库初始化函数只是取消设置环境变量LD_PRELOAD。因此,子进程不再重新加载库。

1 个答案:

答案 0 :(得分:2)

  

什么可能导致共享库被加载两次

加载程序需要花费很长时间才能加载相同的共享库两次。

您极有可能将代码链接到两个单独的共享库中,并且 会导致所有混淆。

设置LD_DEBUG=libs,files应该清楚地显示从哪些路径加载库。