“ generic_start_main()”在哪里定义?

时间:2018-09-03 18:20:59

标签: glibc libc

我从运行程序时遇到了分段错误。 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,

我正在64位PowerPC机器上的3.10.0 Linux上运行程序。

1 个答案:

答案 0 :(得分:0)

  

但只有

您太容易放弃。查看sysdeps/unix/sysv/linux/powerpc/libc-start.c,在定义#include <csu/libc-start.c>LIBC_START_MAIN has之后,您会看到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() { ... }