一个GNU ld的问题

小魔菇 2009-12-29 12:48:21
我的程序分了几个文件夹
每个文件夹都有个makefile 每个下的makefile都用ld把该目录下多个.o连接成一个.o
我用的命令是ld -r -o A.o a.o b.o ...
然后在顶层的makefile把这些生成的.o 最终连接成可执行文件
我用的命令是ld -s -o exec A.o B.o
但是执行的时候出错了

然后我换了种方式 不在每个文件夹下用ld
而是只在顶层的makefile用了一次ld,把所有的.o连接成一个可执行文件 成功了

想请教的是 为什么会这样的情况?
ld除了重定位数据和符号之外 还做了什么事情?
...全文
211 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
小魔菇 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 haierpro 的回复:]
用ar先打包成库,最后再链接也行啊
[/Quote]

解决办法有了
我只想讨论一下 为什么多次ld不成功的原因
小魔菇 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mymtom 的回复:]
ld 的输出文件格式是执行文件或共享库不是 .o(目标文件)
[/Quote]
不是可以通过-r选项 进行部分连接的吗?
mymtom 2009-12-31
  • 打赏
  • 举报
回复
ld 的输出文件格式是执行文件或共享库不是 .o(目标文件)
blackbillow 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 eclipse_2 的回复:]
我的程序分了几个文件夹
每个文件夹都有个makefile 每个下的makefile都用ld把该目录下多个.o连接成一个.o
我用的命令是ld -r -o A.o a.o b.o ...
然后在顶层的makefile把这些生成的.o 最终连接成可执行文件
我用的命令是ld -s -o exec A.o B.o
但是执行的时候出错了

[/Quote]
出错信息是什么,这个很关键
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cangyingzhijia 的回复:]
链接N次没听说过,n次的话它的地址怎么处理?
[/Quote]

重定位
myullian 2009-12-29
  • 打赏
  • 举报
回复
帮顶,顺便学习
cattycat 2009-12-29
  • 打赏
  • 举报
回复
多个.o文件能链接成一个.o吗?我没用过,不过你可以把不同文件夹下的.o最终链接成一个可执行的。
比如最终的执行程序是program,
program: /direct1/*.o /direct2/*.o
gcc program /direct1/*.o /direct2/*.o
大概这个样子吧。
苍蝇①号 2009-12-29
  • 打赏
  • 举报
回复
链接N次没听说过,n次的话它的地址怎么处理?
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oopgp 的回复:]
楼主去写编译器吧。
[/Quote]
自己写编译器干吗?
OoPgP 2009-12-29
  • 打赏
  • 举报
回复
楼主去写编译器吧。
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hoya5121 的回复:]
http://blog.chinaunix.net/u/15960/showart_151189.html
[/Quote]

谢谢哈 你给的是ld的手册
我觉得我的ld用法 也是符合ld的语法的
不知道哪儿出了问题 请指教
hoya5121 2009-12-29
  • 打赏
  • 举报
回复
http://blog.chinaunix.net/u/15960/showart_151189.html
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
请高手指教哈
自己顶一下
haierpro 2009-12-29
  • 打赏
  • 举报
回复
用ar先打包成库,最后再链接也行啊
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 haierpro 的回复:]
`-r'
`--relocateable'
产生可重定位的输出, 比如,产生一个输出文件它可再次作为'ld'的输入.这经常被叫做"部分连接".
作为一个副作用,在支持标准Unix魔数的环境中,这个选项会把输出文件的魔数设置为'OMAGIC'. 如
果这个选项没有被指定,一个绝对文件就会被产生.当连接C++程序时,这个选项就不会解析构造函数的
引用;要解析,必须使用'-Ur'

如果输入文件跟输出文件的格式不同,只有在输入文件不含有重定位信息的时候部分连接才被支持.输
出格式不同的时候会有更多的限制.比如,有些'a.out'的格式在输入文件是其他格式的时候完全不支
持部分连接.
[/Quote]
偶都是把它编译成ELF格式的
应该都支持
充电宝111 2009-12-29
  • 打赏
  • 举报
回复
如果想直接使用ld 来连接的话,那么你就需要自己指明开始代码(crt0.o)等信息。
你可以在上面加上-v参数来观察gcc使用ld的情况。
haierpro 2009-12-29
  • 打赏
  • 举报
回复
`-r'
`--relocateable'
产生可重定位的输出, 比如,产生一个输出文件它可再次作为'ld'的输入.这经常被叫做"部分连接".
作为一个副作用,在支持标准Unix魔数的环境中,这个选项会把输出文件的魔数设置为'OMAGIC'. 如
果这个选项没有被指定,一个绝对文件就会被产生.当连接C++程序时,这个选项就不会解析构造函数的
引用;要解析,必须使用'-Ur'

如果输入文件跟输出文件的格式不同,只有在输入文件不含有重定位信息的时候部分连接才被支持.输
出格式不同的时候会有更多的限制.比如,有些'a.out'的格式在输入文件是其他格式的时候完全不支
持部分连接.
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cattycat 的回复:]
多个.o文件能链接成一个.o吗?我没用过,不过你可以把不同文件夹下的.o最终链接成一个可执行的。
比如最终的执行程序是program, 
program: /direct1/*.o  /direct2/*.o
gcc  program /direct1/*.o  /direct2/*.o
大概这个样子吧。
[/Quote]

用ld -r -o 就可以把多个.o连接成一个.o
你看我最开始发的问题
就是把所有的.o文件连接成一个可执行的 用一次ld 执行正确
如果中间用ld过度一下,也就是用了两次ld 执行失败
小魔菇 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 blackbillow 的回复:]
引用楼主 eclipse_2 的回复:
我的程序分了几个文件夹
每个文件夹都有个makefile 每个下的makefile都用ld把该目录下多个.o连接成一个.o
我用的命令是ld -r -o A.o a.o b.o ...
然后在顶层的makefile把这些生成的.o 最终连接成可执行文件
我用的命令是ld -s -o exec A.o B.o
但是执行的时候出错了


出错信息是什么,这个很关键
[/Quote]
编译之后没有错 但是执行的时候出错

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧