Если вы хотите перехватить дополнительный код перед запуском main()
в уже скомпилированной программе, вы можете использовать комбинацию атрибута constructor
и LD_PRELOAD
следующим образом:
#include <stdio.h>
void __attribute__((constructor)) init() {
printf("Hello, world!\n");
}
Скомпилируйте и запустите:
$ gcc -shared demo_print.c -o demo_print.so -fPIC
$ LD_PRELOAD=$PWD/demo_print.so true
Hello, world!
Если вы вообще не хотите нормально запускать main()
, просто завершите работу (с exit()
и т. Д.) До запуска main()
. Обратите внимание, что вы не сможете получить адрес main()
для вызова вручную - просто вернитесь из конструктора, чтобы продолжить нормальный запуск.