课程:
Linux c 符号的重定位信息?
当编译器生成一个目标文件后,其并不知道代码和变量最终的存储位置,也不知道定义在其他文件中的外部符号。因此编译器会生成一个重定位表目,里面存储着关于每一个符号的信息。这个表目告知链接器在合并目标文件时应该如何修改每个目标文件中对符号的引用。这种重定位表目存储在.rel.text 段中和.rel.data 段中。该表目可以理解为一个结构体,其中存储着每一个符号的重定位信息。
offset表示该符号在存储的段中的偏移值。symbol 代表该符号的名称,字符串实际存储在.strtab 段中,这里存储的是该字符串首地址的下标。type表示重定位类型,链接器只关心两种类型,一种是与PC相关的重定位引用,另一种是绝对地址引用。
PC相关的重定位引用表示将当前的PC值(这个值通常是下一条指令的存储位置)加上该符号的偏移值。绝对地址引用表示将当前指令中已经指定的地址引用直接作为跳转的地址,不需要进行任何修改。
有了这些信息,链接器就可以将符号在存储段中的偏移值加上该段在重定位后该段的新地址,这样就得到了一个新的引用地址,而这个引用地址就是该符号的最终地址。同样,在程序所有引用该地址的部分都要作修改,使用这个新的绝对地址代替旧的偏移地址。当新的符号地址被修改完毕之后,链接器的工作就结束了。
C符号的重定位信息?
当编译器生成一个目标文件后,其并不知道代码和变量最终的存储位置,也不知道定义在其他文件中的外部符号。因此编译器会生成一个重定位表目,里面存储着关于每一个符号的信息。这个表目告知链接器在合并目标文件时应该如何修改每个目标文件中对符号的引用。这种重定位表目存储在.rel.text 段中和.rel.data 段中。该表目可以理解为一个结构体,其中存储着每一个符号的重定位信息。
offset表示该符号在存储的段中的偏移值。symbol 代表该符号的名称,字符串实际存储在.strtab 段中,这里存储的是该字符串首地址的下标。type表示重定位类型,链接器只关心两种类型,一种是与PC相关的重定位引用,另一种是绝对地址引用。PC相关的重定位引用表示将当前的PC值(这个值通常是下一条指令的存储位置)加上该符号的偏移值。绝对地址引用表示将当前指令中已经指定的地址引用直接作为跳转的地址,不需要进行任何修改。有了这些信息,链接器就可以将符号在存储段中的偏移值加上该段在重定位后该段的新地址,这样就得到了一个新的引用地址,而这个引用地址就是该符号的最终地址。同样,在程序所有引用该地址的部分都要作修改,使用这个新的绝对地址代替旧的偏移地址。当新的符号地址被修改完毕之后,链接器的工作就结束了。
C语言中什么是重定向?
重定向不是C语言而是是shell(命令行窗口)做的事情,它把文件接到程序的标准输入、标准输出、或标准错误流上。
如果程序准备用重定向来做,直接从标准输入读数据,比如scanf或者cin,然后往标准输入写结果,printf或者cout。
然后程序执行的时候,在命令行窗口下使用重定向来指定将输出重定向到一个文件:
例如,当你的程序名叫做test.exe:
执行 test.exe essayct.txt。
C语言如何实现移动重定位表
程序放在不连续的实际物理空间中,要进行逻辑地址到物理地址的转换,实现动态重定位
page table记录了所有逻辑地址到物理地址的转换信息,进城切换的时候需要冲洗硬件上的page table
C语言中什么是重定向?
是指输入/输出流重定向吧?
比如printf和scanf就是默认的通过标准输入输出来传送的函数。
但是比如设置一个文件指针,再用重定向把输出指向一个文本,类似
fprintf
(fp,"12345",string);那么就是把程序的输出接收由显存替换成fp指向的文本,这就是输出流的重定向。