Можно ли запустить __libc_start_main из C кода? - PullRequest
1 голос
/ 21 марта 2020

Функция __libc_start_main определена в libc.so с сигнатурой функции ниже

void __libc_start_main(  int (*main) (int, char * *, char * *),
                    int argc, char * * ubp_av,
                    void (*init) (void),
                    void (*fini) (void),
                    void (*rtld_fini) (void),
                    void (* stack_end)); 

При обычном использовании эта функция вызывается функцией _start, определенной в C RunTime объект crt1.o.

Вопросы:

  1. Можно ли назвать __libc_start_main в C коде?

Сложности:

  1. Я не смог найти способ определить значение последнего аргумента stack_end в C коде. Реализация crt1.o находится в сборке, которая может определить stack_end.

PS: Мне просто любопытно, можем ли мы вызвать __libc_start_main в C коде.

1 Ответ

0 голосов
/ 22 марта 2020

Как правило, это невозможно, поскольку __libc_start_main должен вызываться только один раз для каждого процесса, и если вы попытаетесь вызвать его из кода C, он уже будет запущен или будет вызван позже, во второй раз. Ни один из них не будет работать надежно, и будущие изменения glib c могут сломать такой код.

Вам следует опубликовать новый вопрос с фактической проблемой, которую вы пытаетесь решить.

...