gta 发表于 2007-11-21 21:20

怎么用ld

下面是两个c文件:
main.c:

int test();
main()
{
test();
}


test.c:

test()
{}

运行命令cc -c main.c和cc -c test.c后,生成main.o和test.o

再运行ld -o kilik main.o test.o,结果报错ld: warning: cannot find entry symbol _start; defaulting to 08048074
请问应该怎样用ld把这两个目标文件连接成一个可执行elf文件呢

mingyanguo 发表于 2007-11-21 21:40

cc -v main.o test.o -o kilik

你可以看到那些参数。如果对ldscript没有特殊指定的话,用cc代替ld是比较方便的。

prolj 发表于 2007-11-21 21:56

加个 -s 参数试试.
真不明白你干嘛弄这个麻烦的东西.

gta 发表于 2007-11-22 10:39

加了 -s 问题依旧
我是为了使用自定义的ldscript才用ld的
命令如下
ld -T ./ldscript.lds -o kilik main.o cmp.o
结果报错
ld:./ldscript.lds:1: parse error
请问应该怎么做才对啊?

albcamus 发表于 2007-11-22 12:24

回复 #4 gta 的帖子

你的lds写的有问题吧?可以尝试修改默认的那个,用ld --verbose查看

ljgjh 发表于 2007-11-22 16:01

回复 #1 gta 的帖子

entry symbol 可以在命令行上定义 用-e --entry
也可以在link script file 文件中定义.
如果上述都没有定义,那么ld 会寻找start 符号作为起始地址
如果上述都没有找到,那么默认的link 地址一般是你的script 文件中定义的最开始的地址

gta 发表于 2007-11-22 20:21

原帖由 albcamus 于 2007-11-22 12:24 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
你的lds写的有问题吧?可以尝试修改默认的那个,用ld --verbose查看
不会吧,我的lds是这样来的ld --verbose > ldscript.lds

albcamus 发表于 2007-11-26 16:38

原帖由 gta 于 2007-11-22 20:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif

不会吧,我的lds是这样来的ld --verbose > ldscript.lds

除了lds, --verbose输出的其他信息strip掉了吗?

cjaizss 发表于 2007-11-27 01:46

这个......如果你理解了链接的作用就知道了。
_start作为入口,会调用main函数,这本身在链接前就是存在一个都需要去链接的对象文件之中,而非你编译好的对象文件。
_start一般可能结构(结构大致描述,非汇编)
......//比方加载库啥的啊
call main
call exit

exit:可能
.......//清系统中的一些东西,比方标准输出缓冲区啥的
if(atexit)
call atexit
call _exit
这些个玩意都需要链接进去的

[ 本帖最后由 cjaizss 于 2007-11-27 09:22 编辑 ]

cjaizss 发表于 2007-11-27 01:50

你可以用strace跟踪一下,看看gcc是如何ld的:)
页: [1] 2
查看完整版本: 怎么用ld