Как изменить точку входа программы на C, скомпилированной с помощью gcc?
Как в следующем коде
#include<stdio.h>
int entry() //entry is the entry point instead of main
{
return 0;
}
Если вы работаете в системе, которая предоставляет GNU Binutils (например, Linux), вы можете использовать команду objcopy
, чтобы сделать произвольную функцию новой точкой входа.
Предположим, файл с именем program.c
содержит функцию entry
:
$ cat > program.c
#include <stdio.h>
int entry()
{
return 0;
}
^D
Сначала вы компилируете его, используя -c
, для создания перемещаемого объектного файла:
$ gcc -c program.c -o program.o
Затем вы переопределяете entry
как main
:
$ objcopy --redefine-sym entry=main program.o
Теперь используйте gcc для компиляции нового объектного файла:
$ gcc program.o -o program
ПРИМЕЧАНИЕ. Если в вашей программе уже есть функция с именем main
, до шага 2 вы можете выполнить отдельный вызов objcopy
:
objcopy --redefine-sym oldmain=main program.o
Вы можете изменить свой исходный код следующим образом:
#include<stdio.h>
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
int entry() //entry is the entry point instead of main
{
exit(0);
}
Раздел «.interp» позволит вашей программе вызывать внешнюю общую библиотеку. Вызов выхода заставит вашу функцию входа выйти из программы вместо возврата.
Затем создайте программу как разделяемую библиотеку, которая является исполняемой:
$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main