某些应用程序在启动后不久就停止使用 LD_PRELOAD

Some applications stop using LD_PRELOAD shortly after starting

提问人:Zeti_Zero 提问时间:4/20/2023 更新时间:4/20/2023 访问量:152

问:

我一直在尝试LD_PRELOAD,具体来说,我想用我自己的实现替换 malloc 和 free,它打印有关在 malloc 的情况下分配的字节数和在 free 的情况下释放的地址的信息。

不幸的是,我的实验在许多程序上都没有成功,包括 Firefox、Discord、MS Teams 和 Telegram。虽然这些程序最初使用我的内存分配器版本,但它们很快就停止使用它。

最初,我尝试在终端中运行命令: LD_PRELOAD=<my_library_name.so> ./<program>

但是,我后来发现,对于上面提到的一些程序,<program>不是实际的二进制文件,而是运行二进制文件的脚本。然后,我尝试找到实际的二进制文件并运行它们,但结果仍然相同。

我的问题是,是否有一种方法可以将LD_PRELOAD传播到所有子进程,或者是否有另一种方法可以确保一致地使用我的实现。这不仅仅是关于查看 malloc 和免费使用的日志,这是我可以使用 ltrace 实现的,而是关于实验和学习一些东西。我想确切地了解是什么导致了我的问题以及如何解决它。

运行 Discord 的日志示例:

> LD_PRELOAD=./my_malloc.so /snap/discord/151/usr/share/discord/Discord

allocated: 32 bytes, at: 0x5578afe902a0
allocated: 32 bytes, at: 0x5578afe902d0
allocated: 32 bytes, at: 0x5578afe90300
allocated: 2 bytes, at: 0x5578afe90330
allocated: 5 bytes, at: 0x5578afe90350
free at: 0x5578afe90350
allocated: 120 bytes, at: 0x5578afe90370
allocated: 12 bytes, at: 0x5578afe90350
allocated: 792 bytes, at: 0x5578afe903f0
allocated: 104 bytes, at: 0x5578afe90710
allocated: 1328 bytes, at: 0x5578afe90780
allocated: 208 bytes, at: 0x5578afe90cc0
allocated: 424 bytes, at: 0x5578afe90da0
allocated: 96 bytes, at: 0x5578afe90f50
allocated: 80 bytes, at: 0x5578afe90fc0
Discord 0.0.26
Starting app.
Starting updater.
2023-04-19T21:31:47.995Z [Modules] Modules initializing
2023-04-19T21:31:47.995Z [Modules] Distribution: remote
2023-04-19T21:31:47.995Z [Modules] Host updates: enabled
2023-04-19T21:31:47.995Z [Modules] Module updates: enabled
2023-04-19T21:31:47.996Z [Modules] Module install path: /home/test_user/.config/discord/0.0.26/modules
2023-04-19T21:31:47.996Z [Modules] Module installed file path: /home/test_user/.config/discord/0.0.26/modules/installed.json
2023-04-19T21:31:47.996Z [Modules] Module download path: /home/test_user/.config/discord/0.0.26/modules/pending
2023-04-19T21:31:48.139Z [Modules] No updates to install
2023-04-19T21:31:48.139Z [Modules] Checking for host updates.
[89694:0419/233148.276510:ERROR:shared_image_factory.cc(575)] Could not find SharedImageBackingFactory with params: usage: Gles2|Raster|DisplayRead|Scanout, format: BGRA_8888, share_between_threads: 0, gmb_type: shared_memory
[89694:0419/233148.276681:ERROR:shared_image_factory.cc(575)] Could not find SharedImageBackingFactory with params: usage: Gles2|Raster|DisplayRead|Scanout, format: BGRA_8888, share_between_threads: 0, gmb_type: shared_memory
[89694:0419/233148.276749:ERROR:shared_image_factory.cc(575)] Could not find SharedImageBackingFactory with params: usage: Gles2|Raster|DisplayRead|Scanout, format: BGRA_8888, share_between_threads: 0, gmb_type: shared_memory
[89694:0419/233148.276813:ERROR:shared_image_factory.cc(575)] Could not find SharedImageBackingFactory with params: usage: Gles2|Raster|DisplayRead|Scanout, format: BGRA_8888, share_between_threads: 0, gmb_type: shared_memory

正如你在开始时看到的,有我的日志,但在“Discord 0.0.26”之后,我的带有 malloc 和 free 的库突然停止使用。

C++ C Linux 共享库 ld-preload

评论

3赞 Barmar 4/20/2023
环境变量会自动传播到所有子进程及其子进程。因此,除非其中一个孩子正在重置,否则它应该会坚持下去。LD_PRELOAD
1赞 user17732522 4/20/2023
如果向您展示了您感兴趣的/,那么请看一下它的实现。它必须处理同样的问题。(不是操作系统机制)也不能保证所有内存分配都通过 。例如,如果这样的应用程序使用自定义分配器,例如通过调用支持,我不会感到惊讶。ltracemallocfreeltracemallocmmap
3赞 John Bollinger 4/20/2023
...但是,某些进程在启动子进程时丢弃环境变量,这是完全合理的。这样做是一种很好的安全实践 - 例如,为了防止您尝试执行的那种操作。
0赞 Andrew Henle 4/20/2023
补充@JohnBollinger的观点,如果一个进程对其环境进行更改并重新执行其自身,您无能为力(轻松*)。* - 它是你的操作系统,有你的内核和,所以如果你真的愿意,你可以解决进程试图做的任何事情。

答: 暂无答案