如何用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 
  1. 首先使用-c编译它以生成可重定位目标文件:

     $ gcc -c program.c -o program.o 
  2. 然后重新定义entrymain

     $ objcopy --redefine-sym entry=main program.o 
  3. 现在使用gcc编译新的目标文件:

     $ gcc program.o -o program 

注意:如果您的程序已经有一个名为main的函数,则在步骤2之前,您可以执行单独的objcopy调用:

 objcopy --redefine-sym oldmain=main program.o