Linux 共享库被加载两次

Linux shared library is being loaded twice

我有以下设置:

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

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

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

我想知道:

  1. 如何防止共享库被加载两次(我正在考虑使用 shell 环境变量,但它看起来很丑陋)

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

编辑

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

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

what could possibly cause the shared library to be loaded twice

加载器竭尽全力加载同一个共享库两次。

极有可能您将代码链接到两个 单独的 共享库,而 正是造成所有混乱的原因.

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