Как я могу заменить main () в уже скомпилированном приложении? - PullRequest
1 голос
/ 06 октября 2009

Мне нужна дополнительная инициализация по сравнению с существующим в динамически связанном приложении.

Ответы [ 2 ]

4 голосов
/ 06 октября 2009

Если вы хотите перехватить дополнительный код перед запуском 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() для вызова вручную - просто вернитесь из конструктора, чтобы продолжить нормальный запуск.

1 голос
/ 06 октября 2009

Если вы пишете разделяемую библиотеку, которая требует специальной инициализации при запуске, вы можете использовать расширение GCC «Конструктор»:

void foo() __attribute__ ((constructor))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...