【发布时间】:2020-03-30 18:45:28
【问题描述】:
我已经开始阅读 Miro Samek 的 "Building Bare-Metal ARM Systems with GNU" 并发现自己被困在某个点上。在 PDF 第 10 页上的注释之一中可以找到导致我困惑的原因:
注意:函数 low_level_init() 可以用 C/C++ 编写,但有以下限制。该函数必须在 ARM 状态下执行,并且不能依赖于 .data 部分的初始化或 .bss 部分的清除。另外,如果要执行内存重映射,则必须在 low_level_init() 函数内部进行,因为该函数返回后代码不再与位置无关
代码“不再与位置无关”究竟如何?从low_level_init/_cstartup 标签返回后,引用的代码(可在 PDF 中的第 7-9 页查看)似乎仍然与位置无关。 _cstartup 标签之后的指令似乎唯一不同的是它们引用了链接描述文件中定义的标签(指南的第 3 节)。
那么重映射究竟如何影响它后面的指令是否与位置无关?
【问题讨论】:
-
你问的时候作者说了什么?
-
@old_timer 对不起,恐怕我听不懂。我从来没有问过作者。
-
这是您在提出问题时要开始的地方,我们应该如何知道作者想说什么。那么如果答案没有意义,那么拥有比您这里更多的信息的 SO 可能是一个问题的地方。
-
@old_timer 很好。我会联系作者并直接询问他们。如果我的问题得到解答,我一定会更新这篇文章。
标签: assembly arm gnu remap position-independent-code