考虑以下可以在任何程序执行之前预加载的库:
// g++ -std=c++11 -shared -fPIC preload.cpp -o preload.so
// LD_PRELOAD=./preload.so <command>
#include <iostream>
struct Goodbye {
Goodbye() {std::cout << "Hello\n";}
~Goodbye() {std::cout << "Goodbye!\n";}
} goodbye;
问题是,虽然goodbye
始终调用全局变量的构造函数,但某些程序不调用析构函数,例如ls
:
$ LD_PRELOAD=./preload.so ls
Hello
对于其他一些程序,析构函数按预期调用:
$ LD_PRELOAD=./preload.so man
Hello
What manual page do you want?
Goodbye!
你能解释一下为什么在第一种情况下不调用析构函数吗?编辑:上面的问题已经回答了,也就是说一个程序很可能使用_exit(), abort() 来退出。
然而:
有没有办法在预加载的程序退出时强制调用给定的函数?