Немного сложно, но выполнимо - создайте разделяемую библиотеку (назовем ее check_mem.so) с такой функцией:
__attribute__((constructor)) void runs_first(void) {
atexit(check_mem);
};
Обратите внимание, что check_mem должен быть определен в библиотеке, а не в вашей программе.
Теперь в execve поместите LD_PRELOAD = / path / to / check_mem.so в переменные окружения, переданные программе (последний аргумент для execve).
Что произойдет, когдановая программа запустится, она загрузит вашу библиотеку check_mem и запустит функцию run_first перед (почти) любым другим кодом.
Это будет работать только в том случае, если программа, которую вы выполняете, динамически связана, но AFAIK, которыйединственное ограничение.
РЕДАКТИРОВАТЬ: как правильно сказано в комментарии, он также не будет работать на программах setuid.Я все еще думаю, что есть большая вероятность, что он охватит ваш вариант использования.