Где определяется "generic_start_main ()"? - PullRequest
0 голосов
/ 03 сентября 2018

Я получил ошибку сегментации при запуске программы. Команда backtrace в gdb показывает, что стек вызовов равен

#0  0x000000001048d594 in .__libc_csu_init ()
#1  0x000000001048ce20 in .generic_start_main ()
#2  0x000000001048d030 in .__libc_start_main ()
#3  0x0000000000000000 in ?? ()

Может кто-нибудь сказать мне, где определено generic_start_main()? Я пытался искать в glibc с grep -R generic_start_main * но только получил

sysdeps/unix/sysv/linux/powerpc/libc-start.c:29:#define LIBC_START_MAIN generic_start_main
sysdeps/unix/sysv/linux/powerpc/libc-start.c:102:  return generic_start_main (stinfo->main, argc, argv, auxvec,

Я запускаю программы на 3.10.0 Linux на 64-разрядной машине PowerPC.

1 Ответ

0 голосов
/ 03 сентября 2018

но получил только

Ты слишком легко сдаешься. Посмотрите на sysdeps/unix/sysv/linux/powerpc/libc-start.c, и вы увидите, что оно #include <csu/libc-start.c> после определения LIBC_START_MAIN, а csu/libc-start.c имеет :

STATIC int
LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
                  int argc, char **argv,
#ifdef LIBC_START_MAIN_AUXVEC_ARG
                  ElfW(auxv_t) *auxvec,
#endif
                  __typeof (main) init,
                  void (*fini) (void),
                  void (*rtld_fini) (void), void *stack_end)
 { ...

Обновление:

Я не очень хорошо знаю, как работает макрос #define.

#define создает текстовое замещение для препроцессора. Например:

#define FOO Bar

говорит препроцессору: каждый раз, когда вы видите FOO, заменяйте его на Bar (есть некоторые подробности, которые я здесь рассматриваю, но они не важны для этого вопроса).

Итак, учитывая:

#define LIBC_START_MAIN generic_start_main
int LIBC_START_MAIN() { ... }

Вот что компилятор видит после предварительной обработки:

int generic_start_main() { ... }
...