我从运行程序时遇到了分段错误。 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
上运行程序。
答案 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() { ... }