如何更改 GNU C++ 程序的入口点函数?

how to change entry point function of GNU C++ program?

如何改变GNU c++程序的入口函数?

我可以更改 GCC C 程序的入口点。但是对 C++ 使用相同的编译选项会给我一个错误:找不到入口符号。

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

int test(int argc, char *argv[]) ;
int main(int argc, char *argv[]);

int main(int argc, char *argv[])
{
  printf("HELLO main\n" );
  printf("PRESS ANY KEY TO EXIT\n");

  return (0);
}

int test(int argc, char *argv[]) 
{
  int val;
  printf("HELLO test()\n");
  val = main(argc, argv);
  exit(val) ;
}

我可以编译 运行 使用 gcc:

gcc -etest  entry.c -o entry

但是用 g++ 编译不工作:

$ g++ -etest  entry.c -o entry
/usr/bin/ld: warning: cannot find entry symbol test; defaulting to 0000000000000610

必须使用 extern "C" 声明 test() 函数以避免 C++ 名称混淆:

extern "C" int test(int argc, char *argv[]);

请注意,C++ 程序的入口点是符号 _start。该函数建立C和C++标准库,调用全局对象的构造函数并最终调用main。通过更改入口点,您可以绕过该初始化,因此 printf 可能无法工作,因为 stdout 尚未初始化。