重定向是计算机技术中非常底层的概念和操作。它指的是将程序中涉及到的变量名与变量在计算机内存中的位置关联起来。当在代码中执行类似x=1;的语句时,编译器需要通过重定向信息找到变量x对应的内存位置,然后将数值1写入该内存,因此重定向既跟程序的加载链接有关,又于编译原理有关,因此对计算机体系结构不了解,或只关注上层应用开发,对底层技术理解不多的同学对它进行掌握就会有些困难。
为了准确将变量对应到具体的内存位置,就必须要有相关信息来描述变量名与内存之间的关系,这些信息就叫重定向记录(relocation records),程序中描述的“变量”不仅仅指int,float类型的数据变量,还会涉及到函数的入口地址,而函数或者变量的入口地址常常在链接或动态装载时才会确定。例如下面代码:
void _start() {
foo()
}
如果boo实现放在一个obj1.c文件,函数foo实现放在boj2.c文件,那么编译后_start函数对应的二进制指令存储在obj1.o中,foo对应的二进制指令存储在obj2.o中,于是整个程序要顺利执行,就必须将obj1.o和obj2.o整合在一起,负责整合工作的就是连接器,它位于Linux系统的目录/bin/ld中。问题是如何将他们整合在一起,在执行boo函数时,内部调用foo函数时,IP寄存器能准确的指向foo函数第一条指令所在位置