cdsfiui 发表于 2016-09-20 19:55

为什么ld默认是找_start而不是main? 如何让ld找main呢?

$ cat n.c

#include<stdlib.h>
void main()
{
exit(0);
}

我先直接gcc n.c然后
$ a.out
可以执行,没问题
我尝试分开编译和链接的过程:

$ gcc -c n.c && ld n.o -o n -lc && n
ld: 警告: 无法找到项目符号 _start; 缺省为 0000000000400260

于是我把main改成了_start,看起来可以没有main函数:

#include<stdlib.h>
void _start()
{
exit(0);
}

$ gcc -c n.c && ld n.o -o n -lc
$ n
bash: ./n: 没有那个文件或目录
我在bash下面a.out没有问题,n就不行,./n也不行。太奇怪了,明明就在当前目录下,为什么不能运行呢?
谢谢。

MMMIX 发表于 2016-09-20 23:10

回复 1# cdsfiui

先用 gcc -v n.c 看看 gcc 是怎么编译链接你的 n.c 的。

cdsfiui 发表于 2016-09-21 12:00

回复 2# MMMIX

我看了一下,输出挺多的,那一行是我的问题所在呢?
Plus:
我尝试了一下gcc n.c>gcc_v然后发现gcc_v是空文件。gcc n.c 2>&1 >gcc_v,可是发现gcc_v还是空文件。

这是什么问题?

MMMIX 发表于 2016-09-21 16:46

回复 3# cdsfiui

输出挺多的,那一行是我的问题所在呢?


你自己链接的可执行文件有问题,那你看看gcc是怎么链接出正确可执行文件的。这不是很显然么?
页: [1]
查看完整版本: 为什么ld默认是找_start而不是main? 如何让ld找main呢?