首页新闻找找看学习计划

liunx C 的一个小问题

0
[待解决问题]

请大家帮我看看
代码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。。。。而且可以正确执行!!
请问这是怎么回事????

网名还没想好的主页 网名还没想好 | 初学一级 | 园豆:46
提问于:2011-12-26 20:17
< >
分享
所有回答(3)
0

我查了一下,gcc 应该连接了另外的,所以,我们还是应该直接用 gcc, 不用ld

ChatinCode | 园豆:2272 (老鸟四级) | 2011-12-27 13:07
0

因了个为的,ld add.o main.o xxx... -o app

一个程序的真正开始不是main函数,而是__start(汇编文件中),所以,看似简单的gcc实际包括很多的步骤。

其中的ld,还要连接很多东西(xxx...) ,比如:libc的各种库。

详细情况,可以使用了解下

gnu binutils

工具

郝壹贰叁 | 园豆:199 (初学一级) | 2011-12-28 21:33
0

gcc在连接时,除非你用了参数-nostdlib,否则默认会自动连接系统或标准库的库文件,例如libc.so,crti.o之类的文件,最后生成的可执行文件入口是在系统库的_start,执行一段程序后(通常是初始化堆和栈)才转到main执行的,因此用gcc时不会找不到_start,然而,用ld的话,除非你自己用-l参数把相关的系统库连接起来,否则不会自动连接这些系统库文件,因此会提示找不到_start。

解决办法有两种:用-l把系统库也连接起来。或者把main当成入口地址,用参数-e main可以指定main为入口点,但是这样执行不保证没有问题,你可以试试。

kenzhang1031 | 园豆:198 (初学一级) | 2013-11-15 20:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册