此使用.reloc节是我面临AArch64问题的一个简化版本:从装配
我有这个宏,保持一些数据倾倒的部分。
#define GEN_DATA(_type) \ .pushsection .mydata_##_type, "aw"; \ .ifndef start; \ start:; \ .endif; \ .word 1; \ .reloc end_loc, R_AARCH64_ABS64, .; \ .popsection
我最终想捕捉相似类型的起点和终点在这样的结构:
.pushsection .head, "aw" .quad start end_loc: .quad 0 .popsection
我可以跟踪。其中,部分与start
符号开始。我不知道在构建中会有多少个GEN_DATA()
的调用,所以我无法定义end
。我也不知道有多少款_type
也会用,所以不能放置警戒符号脚本。因此,我决定离开end_loc
的重定位条目,以便链接器最终修复整个部分结束的位置。是的,同一个end_loc
会有多个重定位条目,但由于它们是绝对重定位,我认为它们不会发生冲突。
我有预感,但在最后的二进制文件中,end_loc
正在修复一个错误的地址。我会把它归咎于多个重定位条目,但奇怪的是,如果我还添加了一个虚拟的额外重定位条目 - 也就是一切都好 - 即。我修改上面的结构:
#define GEN_DATA(_type) \ .pushsection .mydata_##_type, "aw"; \ .ifndef start; \ start:; \ .endif; \ .word 1; \ .reloc end_loc, R_AARCH64_ABS64, .; \ .reloc dummy_loc, R_AARCH64_ABS64, .; \ .popsection
和:
.pushsection .head, "aw" .quad start end_loc: .quad 0 dummy_loc: .quad 0 .popsection
所以我想知道:
为什么
end_loc
搞定了错误?多重绝对重新定位条目有什么问题?链接器是否有望按顺序通过它们,而最后一个才能生效?为什么简单地添加一个虚拟重定位使一切正常?
基本上,发生了什么?!
最后,有没有其他方法可以尝试?
编辑:我现在把示例代码推到Git repository。使用make
和make broken=1
查看反汇编。需要Linaro AArch64 tool chain在$PATH
。