为什么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也不行。太奇怪了,明明就在当前目录下,为什么不能运行呢?
谢谢。
回复 1# cdsfiui
先用 gcc -v n.c 看看 gcc 是怎么编译链接你的 n.c 的。 回复 2# MMMIX
我看了一下,输出挺多的,那一行是我的问题所在呢?
Plus:
我尝试了一下gcc n.c>gcc_v然后发现gcc_v是空文件。gcc n.c 2>&1 >gcc_v,可是发现gcc_v还是空文件。
这是什么问题?
回复 3# cdsfiui
输出挺多的,那一行是我的问题所在呢?
你自己链接的可执行文件有问题,那你看看gcc是怎么链接出正确可执行文件的。这不是很显然么?
页:
[1]