关于编译,连接,定位

ytruyutyrruyuryyu 2006-04-30 03:39:24
连接和定位究竟是干什么的?特别是对于定位不了解.
...全文
213 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovefreex 2006-05-01
  • 打赏
  • 举报
回复
好东西,顶一下
vsfan 2006-04-30
  • 打赏
  • 举报
回复
简单来说连接就是把编译好的二进制代码变为可以被操作系统识别并且载入运行的格式

比如如果你遵守COFF格式进行编译
那么不同的连接器理论上可以连接成为不同操作系统下的可执行文件
tb01412 2006-04-30
  • 打赏
  • 举报
回复
当你在程序中写上一个全局变量或者是一个函数时,这个定位过程会经历几个阶段:
1.在这个目标文件中的相对定位,一个目标文件中会此文件中的所有函数,变量进行符号描述,比如一个变量A,它所占的相对地址是多少?是全局的?或者是静态的,或者是外部的??
2.在连接多个目标成一个可执行文件时,会再次对这个变量进行重定位,也就是在这个可执行文件中进行对此变量进行描述,同目标文件中的描述差不多,只不过此变量不再有外部,内部之分,都成了本地变量,并且会将所有全局变量存放在一定的逻辑地址中,这是通过连接脚本文件与各个目标文件中的相对地址共同决定的
3.最终的操作系统加载这个可执行文件时,会对这些变量与函数地址再次进行重定位,其方式就是首先分析这个可执行文件中的不同段,读出相应的描述表,然后通过逻辑地址与物理地址进行映射出,最终就将可执行的二进制码加进了真实的物理内存了,关于分析可执行文件格式与物理地址的转换,不同的CPU与操作系统的实现方式会有不同之处
bo.cui 2006-04-30
  • 打赏
  • 举报
回复
DING~~ 谢谢! 还头一次听说 重定位
ChoiceYi 2006-04-30
  • 打赏
  • 举报
回复
运行时地址也就是EXE的相对地址吧?
angelanpan 2006-04-30
  • 打赏
  • 举报
回复
比如说两个编译后的可重定位目标文件obj1.o和obj2.o
在obj1.o里面定义了一个全局变量glob(在obj1里面记录了glob相对于该文件数据段的相对地址), 而obj2.0里面又引用了这个全局变量glob。
链接的重定位就是要确定在链接后的可执行程序中glob的地址,而不是相对于obj1的地址,从而使obj2也能通过地址调用glob。

当然重定位并不只是全局变量,还包括外部函数,指令等运行时地址的确定
bombwang 2006-04-30
  • 打赏
  • 举报
回复
麻烦把定位讲清楚一点
angelanpan 2006-04-30
  • 打赏
  • 举报
回复
编译器编译后产生的目标文件是可重定位的程序模块,并不能直接运行,链接就是把目标文件和其他分别进行编译生成的程序模块(如果有的话)及系统提供的标准库函数连接在一起,生成可运行的可执行文件的过程。
重定位是链接器在完成符号解析后(知道了各个输入模块的代码段和数据段的大小)的一个步骤,其作用顾名思义就是重新定位,确定比如指令,全局变量等在运行时的存储器地址。

69,377

社区成员

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

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