怎么用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文件呢 cc -v main.o test.o -o kilik
你可以看到那些参数。如果对ldscript没有特殊指定的话,用cc代替ld是比较方便的。 加个 -s 参数试试.
真不明白你干嘛弄这个麻烦的东西. 加了 -s 问题依旧
我是为了使用自定义的ldscript才用ld的
命令如下
ld -T ./ldscript.lds -o kilik main.o cmp.o
结果报错
ld:./ldscript.lds:1: parse error
请问应该怎么做才对啊?
回复 #4 gta 的帖子
你的lds写的有问题吧?可以尝试修改默认的那个,用ld --verbose查看回复 #1 gta 的帖子
entry symbol 可以在命令行上定义 用-e --entry也可以在link script file 文件中定义.
如果上述都没有定义,那么ld 会寻找start 符号作为起始地址
如果上述都没有找到,那么默认的link 地址一般是你的script 文件中定义的最开始的地址 原帖由 albcamus 于 2007-11-22 12:24 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
你的lds写的有问题吧?可以尝试修改默认的那个,用ld --verbose查看
不会吧,我的lds是这样来的ld --verbose > ldscript.lds 原帖由 gta 于 2007-11-22 20:21 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
不会吧,我的lds是这样来的ld --verbose > ldscript.lds
除了lds, --verbose输出的其他信息strip掉了吗? 这个......如果你理解了链接的作用就知道了。
_start作为入口,会调用main函数,这本身在链接前就是存在一个都需要去链接的对象文件之中,而非你编译好的对象文件。
_start一般可能结构(结构大致描述,非汇编)
......//比方加载库啥的啊
call main
call exit
而
exit:可能
.......//清系统中的一些东西,比方标准输出缓冲区啥的
if(atexit)
call atexit
call _exit
这些个玩意都需要链接进去的
[ 本帖最后由 cjaizss 于 2007-11-27 09:22 编辑 ] 你可以用strace跟踪一下,看看gcc是如何ld的:)
页:
[1]
2