我正在编写一个内存泄漏跟踪器,并希望在库卸载时打印跟踪程序中的统计信息。
这个库将与LD_PRELOAD技巧一起使用,我们的程序有将被很晚销毁的静态变量,所以我想要确信,在程序中的所有静态变量都被销毁后,统计信息将被打印出来,以避免虚惊。
用LD_PRELOAD加载的库会在最后一个(比被黑客攻击的程序晚)中卸载吗?
发布于 2020-12-31 17:03:29
将在最后一次卸载带有LD_PRELOAD的库吗?
您假设LD_PRELOADED库将被卸载,但这一点根本不能保证会发生。
下面是一个测试用例:
// main.c
#include <unistd.h>
int main(int argc, char *argv[]) {
if (argc > 1) _exit(0);
return 0;
}
// preload.c
#include <stdio.h>
__attribute__((constructor)) void init() { fprintf(stderr, "Init\n"); }
__attribute__((destructor)) void fini() { fprintf(stderr, "Fini\n"); }像这样建造它们:
gcc main.c && gcc -fPIC -shared -o preload.so preload.c现在观察初始化和最后确定的顺序:
LD_DEBUG=files LD_PRELOAD=./preload.so ./a.out |& grep 'calling .*ini'
18310: calling init: /lib/x86_64-linux-gnu/libc.so.6
18310: calling init: ./preload.so
18310: calling fini: ./a.out [0]
18310: calling fini: ./preload.so [0]
LD_DEBUG=files LD_PRELOAD=./preload.so ./a.out 1 |& grep 'calling .*ini'
18312: calling init: /lib/x86_64-linux-gnu/libc.so.6
18312: calling init: ./preload.so请注意,在_exit()的情况下,库根本没有完成。
还请注意,任何共享库都将依赖于libc.so.6,因此将在libc.so.6之前完成。
但是,如果没有信号或_exit()终止,是的:库将按照初始化的相反顺序完成(加载和卸载实际上不是这里使用的合适术语),这确实意味着LD_PRELOADed库将最后定稿。
https://stackoverflow.com/questions/65516467
复制相似问题