我已经开始阅读 Miro Samek 的“使用 GNU 构建裸机 ARM 系统”并发现自己陷入了某个问题。在 PDF 第 10 页的注释之一中可以找到导致我困惑的原因:
注意:函数 low_level_init() 可以用 C/C++ 编码,但有以下限制。该函数必须在 ARM 状态下执行,并且不能依赖于 .data 部分的初始化或 .bss 部分的清除。此外,如果内存重映射完全执行,它必须发生在 low_level_init() 函数内部,因为该函数返回后代码不再与位置无关
代码“不再与位置无关”究竟如何?似乎引用的代码(可在 PDF 的第 7 - 9 页上查看)在从标签返回low_level_init/返回后仍然与位置无关_cstartup。_cstartup标签后面的指令似乎唯一不同的是它们引用了链接描述文件中定义的标签(指南的第 3 节)。
那么重映射究竟如何影响它后面的指令是否与位置无关呢?