Linux 共享库被加载两次
Linux shared library is being loaded twice
我有以下设置:
- 一个非常复杂的基于 Qt+QML 的应用程序
- 共享的 linux 库也有一些 Qt 功能
使用 LD_PRELOAD 技巧将共享库注入到应用程序中。一旦加载,它就会启动一个 TCP 服务器,通过它公开应用程序的内部对象。目标是在不专门修改应用程序源代码的情况下访问应用程序内部。
我看到的奇怪的事情是共享库被加载了两次,我不明白为什么。由于库和应用程序都依赖于 Qt,我会理解 Linux 是否会加载相同 Qt 库的多个副本。
但是应用程序不依赖于共享库,我也没有覆盖应用程序本身的任何功能。
我想知道:
如何防止共享库被加载两次(我正在考虑使用 shell 环境变量,但它看起来很丑陋)
什么可能导致共享库被加载两次
编辑
Employed-Russian 的评论(见下文)引导我朝着正确的方向解决问题 #2。目标应用程序正在启动一个继承环境变量的子进程,包括 LD_PRELOAD。子进程是库被加载两次的原因。
至于问题#1,我也听从了他的建议:库初始化函数只是取消设置环境变量LD_PRELOAD。因此,子进程不再重新加载库。
what could possibly cause the shared library to be loaded twice
加载器竭尽全力不加载同一个共享库两次。
极有可能您将代码链接到两个 单独的 共享库,而 正是造成所有混乱的原因.
设置LD_DEBUG=libs,files
应该清楚地显示从哪些路径加载了哪些库。
我有以下设置:
- 一个非常复杂的基于 Qt+QML 的应用程序
- 共享的 linux 库也有一些 Qt 功能
使用 LD_PRELOAD 技巧将共享库注入到应用程序中。一旦加载,它就会启动一个 TCP 服务器,通过它公开应用程序的内部对象。目标是在不专门修改应用程序源代码的情况下访问应用程序内部。
我看到的奇怪的事情是共享库被加载了两次,我不明白为什么。由于库和应用程序都依赖于 Qt,我会理解 Linux 是否会加载相同 Qt 库的多个副本。
但是应用程序不依赖于共享库,我也没有覆盖应用程序本身的任何功能。
我想知道:
如何防止共享库被加载两次(我正在考虑使用 shell 环境变量,但它看起来很丑陋)
什么可能导致共享库被加载两次
编辑
Employed-Russian 的评论(见下文)引导我朝着正确的方向解决问题 #2。目标应用程序正在启动一个继承环境变量的子进程,包括 LD_PRELOAD。子进程是库被加载两次的原因。
至于问题#1,我也听从了他的建议:库初始化函数只是取消设置环境变量LD_PRELOAD。因此,子进程不再重新加载库。
what could possibly cause the shared library to be loaded twice
加载器竭尽全力不加载同一个共享库两次。
极有可能您将代码链接到两个 单独的 共享库,而 正是造成所有混乱的原因.
设置LD_DEBUG=libs,files
应该清楚地显示从哪些路径加载了哪些库。