① Linux c 符号的重定位信息
当编译器生成一个目标文件后,其并不知道代码和变量最终的存储位置,也不知道定义在其他文件中的外部符号。因此编译器会生成一个重定位表目,里面存储着关于每一个符号的信息。这个表目告知链接器在合并目标文件时应该如何修改每个目标文件中对符号的引用。这种重定位表目存储在.rel.text 段中和.rel.data 段中。该表目可以理解为一个结构体,其中存储着每一个符号的重定位信息。
offset表示该符号在存储的段中的偏移值。symbol 代表该符号的名称,字符串实际存储在.strtab 段中,这里存储的是该字符串首地址的下标。type表示重定位类型,链接器只关心两种类型,一种是与PC相关的重定位引用,另一种是绝对地址引用。
PC相关的重定位引用表示将当前的PC值(这个值通常是下一条指令的存储位置)加上该符号的偏移值。绝对地址引用表示将当前指令中已经指定的地址引用直接作为跳转的地址,不需要进行任何修改。
有了这些信息,链接器就可以将符号在存储段中的偏移值加上该段在重定位后该段的新地址,这样就得到了一个新的引用地址,而这个引用地址就是该符号的最终地址。同样,在程序所有引用该地址的部分都要作修改,使用这个新的绝对地址代替旧的偏移地址。当新的符号地址被修改完毕之后,链接器的工作就结束了。
② 编译完成之后得到的.o文件,为什么叫可重定位目标文件
c语言编译.c和.cpp文件为.o文件,是将所有的.c和.cpp文件都生成.o文件。再把所有的.o文件链接成为可执行程序。而每一个.o目标文件对应不同的源文件,所以叫可重定位目标文件。
③ 什么是重定位重定位有哪几种类型2为什么要进行重定位
1.什么是重定位?由于一个作业装入到与其地址空间不一致的存储空间,对有关地址部分的调整过程称为重定位。2.重定位有哪几种类型?分为静态重定位和动态重定位两种类型。3.为什么要进行重定位?我们写正常程序的时候根本不用去关心变量(常量)的位置,因为源程序在编译的时候它的内存中的位置郡被计算好了。程序装入内存时,系统不会为它重定位。我们需要用到变量 (常量)的时候直接用变量名访问它就行了。有的程序不可避免也要用到变量 (常量),各个变量 (常量)在内存中的位置自然也不相同。既然这些变量没有固定的地址,那么程序在运行的过程中只有重定位,才可以正常地访问相关资源。
④ C符号的重定位信息
当编译器生成一个目标文件后,其并不知道代码和变量最终的存储位置,也不知道定义在其他文件中的外部符号。因此编译器会生成一个重定位表目,里面存储着关于每一个符号的信息。这个表目告知链接器在合并目标文件时应该如何修改每个目标文件中对符号的引用。这种重定位表目存储在.rel.text 段中和.rel.data 段中。该表目可以理解为一个结构体,其中存储着每一个符号的重定位信息。
offset表示该符号在存储的段中的偏移值。symbol 代表该符号的名称,字符串实际存储在.strtab 段中,这里存储的是该字符串首地址的下标。type表示重定位类型,链接器只关心两种类型,一种是与PC相关的重定位引用,另一种是绝对地址引用。PC相关的重定位引用表示将当前的PC值(这个值通常是下一条指令的存储位置)加上该符号的偏移值。绝对地址引用表示将当前指令中已经指定的地址引用直接作为跳转的地址,不需要进行任何修改。有了这些信息,链接器就可以将符号在存储段中的偏移值加上该段在重定位后该段的新地址,这样就得到了一个新的引用地址,而这个引用地址就是该符号的最终地址。同样,在程序所有引用该地址的部分都要作修改,使用这个新的绝对地址代替旧的偏移地址。当新的符号地址被修改完毕之后,链接器的工作就结束了。
⑤ 重定位的时机
将逻辑地址空间重定位到物理地址空间的时机有三种:
1、程序编译连接时。
2、程序装入内存时。
3、程序执行时。
重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程。它是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。
分类
对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。
静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。
动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。
⑥ 重定位是什么意思
一、定义:重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程,也就是说在装入时对目标程序中指令和数据的修改过程.他是实现多道程序在内存中同时运行的基础.重定位有两种,分别是动态重定位与静态重定位
二、分类
1、静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位.
2、动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址.动态重定位需要软件和硬件相互配合完成.
三、时机
将逻辑地址空间重定位到物理地址空间的时机有三种:
1、程序编译连接时.
2、程序装入内存时.
3、程序执行时.
四、扩展阅读:
重定位是由操作系统安排的.
在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址.在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位.
重定位与EXE文件无关,它是程序装入时的一种方式.利用重定位可提高内存空间的使用率.
⑦ 菜鸟求助:汇编代码的重定位
个人建议,不妨一试:
把"Local szCaption[5]: byte
Local szText[6]: byte "
这两个变量,改为全局变量!
补充:
那就这样吧,再试一次
.code
@test proc
Local szCaption[5]: byte
Local szText[6]: byte
pushad
call @F
@@:
pop ebx
sub ebx, offset @B
lea esi,szCaption
lea edi,szText
mov byte ptr[ebx+esi], 't'
mov byte ptr[ebx+esi+1], 'e'
mov byte ptr[ebx+esi+2], 's'
mov byte ptr[ebx+esi+3], 't'
mov byte ptr[ebx+esi+4], 0
mov byte ptr[ebx+edi], 'H'
mov byte ptr[ebx+edi+1], 'e'
mov byte ptr[ebx+edi+2], 'l'
mov byte ptr[ebx+edi+3], 'l'
mov byte ptr[ebx+edi+4], 'o'
mov byte ptr[ebx+edi+5], 0
invoke MessageBox, NULL, addr [ebx+szCaption], addr [ebx+szText], MB_OK
invoke ExitProcess, 0
popad
ret
@test endp
Start:
call @test
end Start
⑧ vc++6.0如何才能编译出可重定位的exe文件
相信自己 我能行 是真的