Конструктор глобальной переменной не вызывался при изменении точки входа программы - PullRequest
0 голосов
/ 10 октября 2018

Я хочу изменить точку входа программы с главной на самоопределяемую функцию, но кажется, что в этом случае конструктор глобальной переменной не может быть вызван.

код, подобный этому:

    #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 голосов
/ 10 октября 2018

Компиляция с опцией -e дает замену для подпрограммы _start, а не main.
Когда вы используете альтернативу для start, вы потеряете инициализации, которые будут частью _startрутина.

В этом конкретном случае вы теряете вызов конструктора для A, потому что a является глобальным.Вы также не можете использовать аргументы командной строки.

...