Рассмотрим следующую библиотеку, которая может быть предварительно загружена перед выполнением любой программы:
// 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!
Можете ли вы объяснить, почему деструктор не вызывается в первом случае? EDIT: на этот вопрос уже был дан ответ, это программа, которая может использовать функции _exit(), abort() для выхода.
Однако:
Есть ли способ заставить заданную функцию вызываться, когда выгруженная программа заканчивается?