在我的 FASM 專案(物件)中,我正在嘗試創建一個跳轉表并dq用于每個跳轉地址,但有一個問題!
對于每個(跳轉地址定義),我的最終 .o 檔案的總大小將增加dq .jmp124 個位元組(加上地址的 8 個位元組(總共 32 個位元組))!
額外的 24 個位元組是什么?有什么辦法可以避免嗎?這只發生在目標檔案中,而不是可執行檔案中!.jmp1
每個跳轉地址不是 8 個位元組,而是定義了 32 個位元組!問題是什么?
format ELF64
section '.text'
func:
lea rax, [8*rax .jmp_table]
.jmp1:
.jmp_table:
dq .jmp1 ; 8 bytes 24 bytes !!! (to .o total size)
dq .jmp1 ; 8 bytes 24 bytes !!! (to .o total size)
但是當我創建一個可執行檔案時,每個dq只需要 8 個位元組(我期望的)......
format ELF64 EXECUTABLE
segment readable executable
func:
lea rax, [8*rax .jmp_table]
.jmp1:
.jmp_table:
dq .jmp1 ; 8-BYTE, no extra 24 bytes to .o total size
dq .jmp1 ; 8-BYTE, no extra 24 bytes to .o total size
uj5u.com熱心網友回復:
請記住,.o檔案不僅僅是您組裝的代碼和資料的平面影像;它還包含元資料,例如重定位。
由于dq .jmp1參考了一個符號,其絕對地址在鏈接之后才會知道,所以它需要一個重定位條目。上面的鏈接顯示 x86-64 上的 ELF 使用Elf64_Rela24 位元組的重定位條目。所以 8 位元組的實際資料,加上 24 位元組的元資料,正好說明檔案大小增加了 32 位元組。(在其他情況下可能或多或少,例如,可能是由于對齊要求的填充。)
鏈接完成后,重定位元資料不包含在可執行檔案中,因此可執行檔案大小僅增加了實際資料的大小。
所以你看到的是完全正常的,沒有什么可以避免的。跳轉表條目實際上將占用程式存盤器中的 8 個位元組,并且您的算術 lea rax, [8*rax .jmp_table]仍然正確。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/472517.html
上一篇:我應該如何正確學習GNU匯編?
下一篇:在python中平方所需的時間
