怎么用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文件呢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
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
请问应该怎么做才对啊?
你的lds写的有问题吧? 可以尝试修改默认的那个,用ld --verbose查看
entry symbol 可以在命令行上定义 用-e --entry
也可以在link script file 文件中定义.
如果上述都没有定义,那么ld 会寻找start 符号作为起始地址
如果上述都没有找到,那么默认的link 地址一般是你的script 文件中定义的最开始的地址
不会吧,我的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的