我有以下设置:
- 一个相当复杂的基于Qt+QML的应用程序 - 一个共享的Linux库,也具有一些Qt功能
通过LD_PRELOAD技巧注入共享库到应用程序中后,它将启动一个TCP服务器,通过该服务器公开应用程序内部对象。目标是访问应用程序内部而不特定修改应用程序源代码。
我看到的奇怪现象是,共享库被加载两次,我无法理解原因。由于库和应用程序都依赖于Qt,如果Linux加载多个相同的Qt库,则可以理解。
但应用程序不依赖于共享库,我也没有覆盖应用程序本身的任何函数。
我想知道:
- 如何防止共享库被加载两次(我正在考虑使用shell环境变量,但这似乎是一个丑陋的hack) - 可能会导致共享库被加载两次的原因是什么
编辑:
Employed-Russian的评论引导了我解决第二个问题。目标应用程序正在启动子进程,该进程继承环境变量,包括LD_PRELOAD。子进程是导致库被加载两次的原因。
至于问题#1,我也遵循他的建议:库初始化函数简单地取消设置环境变量LD_PRELOAD。结果,子进程不再重新加载库。
- 一个相当复杂的基于Qt+QML的应用程序 - 一个共享的Linux库,也具有一些Qt功能
通过LD_PRELOAD技巧注入共享库到应用程序中后,它将启动一个TCP服务器,通过该服务器公开应用程序内部对象。目标是访问应用程序内部而不特定修改应用程序源代码。
我看到的奇怪现象是,共享库被加载两次,我无法理解原因。由于库和应用程序都依赖于Qt,如果Linux加载多个相同的Qt库,则可以理解。
但应用程序不依赖于共享库,我也没有覆盖应用程序本身的任何函数。
我想知道:
- 如何防止共享库被加载两次(我正在考虑使用shell环境变量,但这似乎是一个丑陋的hack) - 可能会导致共享库被加载两次的原因是什么
编辑:
Employed-Russian的评论引导了我解决第二个问题。目标应用程序正在启动子进程,该进程继承环境变量,包括LD_PRELOAD。子进程是导致库被加载两次的原因。
至于问题#1,我也遵循他的建议:库初始化函数简单地取消设置环境变量LD_PRELOAD。结果,子进程不再重新加载库。