Chinaunix

标题: 为什么ld默认是找_start而不是main? 如何让ld找main呢? [打印本页]

作者: cdsfiui    时间: 2016-09-20 19:55
标题: 为什么ld默认是找_start而不是main? 如何让ld找main呢?
$ cat n.c

  1. #include<stdlib.h>
  2. void main()
  3. {
  4.   exit(0);
  5. }
复制代码

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

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

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

  1. #include<stdlib.h>
  2. void _start()
  3. {
  4.   exit(0);
  5. }
复制代码

$ 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是怎么链接出正确可执行文件的。这不是很显然么?





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2