如何用gcc改变C程序的入口点?

asi*_*tm9 27 c program-entry-point entry-point

如何更改用gcc编译的C程序的入口点?
就像在下面的代码中一样

#include<stdio.h>
int entry()  //entry is the entry point instead of main
 {
   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

Foo*_*Bah 33

这是一个链接器设置:

-Wl,-eentry
Run Code Online (Sandbox Code Playgroud)

-Wl,...事情参数传递给链接器和链接器将一个-e参数设置项功能

  • 这是我用这个选项编译 hello world C 程序时得到的:`$ gcc -Wl,-emymain t27.c /usr/lib/gcc/i686-redhat-linux/4.8.2/../.. /../crt1.o:在函数“_start”中:(.text+0x18):对“main”的未定义引用 (3认同)
  • @LeeDuhem,这是因为您将程序与标准c运行时库链接.与c运行时库链接的程序中的入口点是_start.Start有一个对程序的main()的引用(它希望你的程序有main()函数而不是你的自定义函数).尽量不要链接到crt并将入口点指定为your_main,看看会发生什么. (3认同)
  • `-nartartfiles`是你想要的实际标志,这省略了包含_start的crt*.o文件,但仍然允许你使用libc(除非你也使用-nostdlib或-nodefaultlibs,在这种情况下你仍然可以手动指定它们使用-lc -lgcc等...) (2认同)

Sam*_*iao 8

您可以将源代码修改为:

#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);
}
Run Code Online (Sandbox Code Playgroud)

".interp"部分将让您的程序能够调用外部共享库.退出调用将使您的输入函数退出程序而不是返回.

然后将程序构建为可执行的共享库:

$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main
Run Code Online (Sandbox Code Playgroud)


Rud*_*ela 7

如果您使用的是提供GNU Binutils(如Linux)的系统,则可以使用该objcopy命令将新的入口点作为任意函数.

假设一个名为program.c包含该entry函数的文件:

$ cat > program.c
#include <stdio.h>
int entry()
{
    return 0;
}
^D
Run Code Online (Sandbox Code Playgroud)
  1. 首先使用它来编译它-c以生成可重定位目标文件:

    $ gcc -c program.c -o program.o
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后你重新定义entrymain:

    $ objcopy --redefine-sym entry=main program.o
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在使用gcc编译新的目标文件:

    $ gcc program.o -o program
    
    Run Code Online (Sandbox Code Playgroud)

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

objcopy --redefine-sym oldmain=main program.o
Run Code Online (Sandbox Code Playgroud)