elf 格式的可执行文件包含各种段,如代码、数据、bss、堆栈等。如果我们说段 xyz 是静态重定位的,那意味着什么?
elf 格式的二进制文件包含每个段的相对地址。当我们说静态重定位时,是否意味着相对地址实际上是物理地址?
elf 格式的可执行文件包含各种段,如代码、数据、bss、堆栈等。如果我们说段 xyz 是静态重定位的,那意味着什么?
elf 格式的二进制文件包含每个段的相对地址。当我们说静态重定位时,是否意味着相对地址实际上是物理地址?
静态重定位意味着在程序运行之前移动数据或编码并为其分配绝对位置。例如:- 链接器是静态重定位的一个例子,它移动程序的几个模块并将它们组合到程序中。
静态重定位是指在程序开始执行之前进行地址转换。典型的硬件指令周期如下所示:
loop
w := M[instr_ctr]; (* fetch instruction *)
oc := Opcode(w);
adr := Address(w);
instr_ctr := instr_ctr + 1;
case oc of
1: reg := reg+M[adr]; (* add *)
2: M[adr] := reg; (* store *)
3: instr_ctr := adr; (* branch *)
...
end
end (* loop *)
在没有内存抽象的情况下(程序直接访问物理内存)它是这样的:程序 A 使用地址 x 程序 B 在某些时候也使用地址 x
为了使两个程序同时运行,一些操作系统/早期计算机(例如 IBM 360)在加载程序 B 时会即时修改程序 B 的地址,以便它不会使用程序 A 使用的内存地址
当在地址 16,384 加载程序时,在加载过程中将常量 16,384 添加到每个程序地址。