请大家帮我看看
代码1,add.c,
extern int num[2];
int b=2;
int add(void)
{
int a;
a=num[0];
return a+b;
}
代码2 main.c ,
extern int add(void);
int num[2]={1,2};
int main()
{
int c;
c=add();
return 0;
}
然后编译,gcc -c add.c main.c 没有问题,然后链接,ld add.o main.o -o app,出问题了,
报错“ld: warning: cannot find entry symbol _start; defaulting to 0000000008048094
不过还是生成了app,然后我执行它 ./app 无法执行,报错:段错误(吐核)
然后,我直接执行这个命令gcc add.c main.c -o app, 这时它又生成了可执行文件app。。。。而且可以正确执行!!
请问这是怎么回事????
我查了一下,gcc 应该连接了另外的,所以,我们还是应该直接用 gcc, 不用ld
因了个为的,ld add.o main.o xxx... -o app
一个程序的真正开始不是main函数,而是__start(汇编文件中),所以,看似简单的gcc实际包括很多的步骤。
其中的ld,还要连接很多东西(xxx...) ,比如:libc的各种库。
详细情况,可以使用了解下
工具
gcc在连接时,除非你用了参数-nostdlib,否则默认会自动连接系统或标准库的库文件,例如libc.so,crti.o之类的文件,最后生成的可执行文件入口是在系统库的_start,执行一段程序后(通常是初始化堆和栈)才转到main执行的,因此用gcc时不会找不到_start,然而,用ld的话,除非你自己用-l参数把相关的系统库连接起来,否则不会自动连接这些系统库文件,因此会提示找不到_start。
解决办法有两种:用-l把系统库也连接起来。或者把main当成入口地址,用参数-e main可以指定main为入口点,但是这样执行不保证没有问题,你可以试试。