如何用gcc改变C程序的入口点?
如何更改用gcc编译的C程序的入口点?
就像在下面的代码中一样
#include int entry() //entry is the entry point instead of main { return 0; }
这是一个链接器设置:
-Wl,-eentry
-Wl,...
事件将参数传递给链接器,链接器使用-e
参数来设置条目函数
您可以将源代码修改为:
#include 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
如果您使用的是提供GNU Binutils (如Linux)的系统,则可以使用objcopy
命令将任意函数作为新的入口点。
假设一个名为program.c
的文件包含entry
函数:
$ cat > program.c #include 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