怎么用ld

发布于 2022-09-26 12:23:30 字数 361 浏览 25 评论 0

下面是两个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

太阳公公是暖光 2022-10-03 12:23:30

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

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

岁月染过的梦 2022-10-03 12:23:30

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

执妄 2022-10-03 12:23:30

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

一个人的旅程 2022-10-03 12:23:30

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

り繁华旳梦境 2022-10-03 12:23:30

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

森林迷了鹿 2022-10-03 12:23:30

原帖由 albcamus 于 2007-11-22 12:24 发表
你的lds写的有问题吧?  可以尝试修改默认的那个,用ld --verbose查看

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

坏尐絯 2022-10-03 12:23:30

原帖由 gta 于 2007-11-22 20:21 发表

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

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

_畞蕅 2022-10-03 12:23:30

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

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

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

來不及說愛妳 2022-10-03 12:23:30

你可以用strace跟踪一下,看看gcc是如何ld的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文