此使用.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
。