首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用LD_PRELOAD加载的库会在最后一次卸载吗

用LD_PRELOAD加载的库会在最后一次卸载吗
EN

Stack Overflow用户
提问于 2020-12-31 03:59:28
回答 1查看 362关注 0票数 0

我正在编写一个内存泄漏跟踪器,并希望在库卸载时打印跟踪程序中的统计信息。

这个库将与LD_PRELOAD技巧一起使用,我们的程序有将被很晚销毁的静态变量,所以我想要确信,在程序中的所有静态变量都被销毁后,统计信息将被打印出来,以避免虚惊。

用LD_PRELOAD加载的库会在最后一个(比被黑客攻击的程序晚)中卸载吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-31 17:03:29

将在最后一次卸载带有LD_PRELOAD的库吗?

您假设LD_PRELOADED库将被卸载,但这一点根本不能保证会发生。

下面是一个测试用例:

代码语言:javascript
复制
// 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"); }

像这样建造它们:

代码语言:javascript
复制
gcc main.c && gcc -fPIC -shared -o preload.so preload.c

现在观察初始化和最后确定的顺序:

代码语言:javascript
复制
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库将最后定稿。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65516467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档