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

问题描述 投票:0回答:4

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

#include<stdio.h>
int entry()  //entry is the entry point instead of main
 {
   return 0;
 }
c program-entry-point entry-point
4个回答
55
投票

这是一个链接器设置:

-Wl,-eentry

-Wl,...
事物将参数传递给链接器,链接器采用
-e
参数来设置入口函数


11
投票

如果您使用的系统提供 GNU Binutils(如 Linux), 您可以使用

objcopy
命令 使任意函数成为新的入口点。

假设一个名为

program.c
的文件包含
entry
函数:

$ cat > program.c
#include <stdio.h>
int entry()
{
    return 0;
}
^D
  1. 首先使用

    -c
    编译它以生成可重定位的目标文件:

    $ gcc -c program.c -o program.o
    
  2. 然后你将

    entry
    重新定义为
    main

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

    $ gcc program.o -o program
    

注意: 如果您的程序已有一个名为

main
的函数,在步骤 2 之前,您可以执行单独的
objcopy
调用:

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

10
投票

您可以将源代码修改为:

#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

4
投票

最小可运行示例和其他答案的注释

main.c

#include <stdio.h>
#include <stdlib.h>

int mymain(void) {
    puts("hello");
}

编译并运行:

gcc -nostartfiles -Wl,--entry=mymain -o main.out main.c
# or -Wl,-emymain
./main.out 1 2 3

注意事项:

  • 没有

    -nostartfiles
    ,链接失败并显示:

    /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
    (.text+0x20): undefined reference to `main'
    collect2: error: ld returned 1 exit status
    

    大概是因为 _start

     在 main
    之前运行的 glibc 设置代码通常会调用
    main

  • 命令行参数不是为您设置的,大概是因为它们将由在 main 之前运行的 glibc 代码设置,因此尝试使用它们会打印未定义的值。我还没有找到适合他们的方法。

另一种选择是删除

-nostartfiles
,只定义一个虚拟对象
main
:

#include <stdio.h>
#include <stdlib.h>

int main(void) {}

int mymain(int argc, char **argv) {
    (void)argv;
    printf("%d\n", argc);
    exit(0);
}

然后编译并运行良好:

gcc -nostartfiles -Wl,--entry=mymain -o main.out main.c
# or -Wl,-emymain
./main.out 1 2 3

CLI 参数仍然损坏,但也许更多 stdlib 的东西会像这样工作。

在 Ubuntu 23.10 中测试。

© www.soinside.com 2019 - 2024. All rights reserved.