修改程序的入口点时未调用全局变量的构造函数

时间:2018-10-10 00:44:45

标签: c++ g++ ld elf

我想将程序的入口点从main更改为自定义函数,但是在这种情况下似乎无法调用全局变量的构造函数。

这样的代码:

    #include <stdin.h>
    #include <stdlib.h>

    const char my_interp[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2";

    class A {
      public:
        A() {
          printf("construct A\n");
        }
    };

    A a;

    int main() {
      printf("main start\n");
    }

    extern "C" {
    int smain() {
      printf("smain start\n");
      exit(0);
    }
    }

这样的编译命令:

g++ -g -Wl,-e,smain -o smain smain.cc

1 个答案:

答案 0 :(得分:2)

使用-e选项进行编译可以代替_start而不是main例程。
当您为start使用替代方法时,将丢失初始化,而初始化将成为_start例程的一部分。

在这种情况下,您将丢失对A的构造函数调用,因为a是全局的。 您也不能使用命令行参数。