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参数设置项功能
您可以将源代码修改为:
#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)
如果您使用的是提供GNU Binutils(如Linux)的系统,则可以使用该objcopy命令将新的入口点作为任意函数.
假设一个名为program.c包含该entry函数的文件:
$ cat > program.c
#include <stdio.h>
int entry()
{
return 0;
}
^D
Run Code Online (Sandbox Code Playgroud)
首先使用它来编译它-c以生成可重定位目标文件:
$ gcc -c program.c -o program.o
Run Code Online (Sandbox Code Playgroud)然后你重新定义entry为main:
$ objcopy --redefine-sym entry=main program.o
Run Code Online (Sandbox Code Playgroud)现在使用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)