我正在寫一些自定義的ELF二進制後處理代碼,它可以在.o
文件上工作。部分處理包括對二進制數據執行重定位。輸入文件由GNU彙編程序從我自己的彙編代碼生成。.bss中的ELF重定位是什麼,但相對於.bss,是什麼意思?
看GNU彙編產生這些瘋狂的重定位:
所有的Relocation section '.rel.bss' at offset 0x3b8 contains 2 entries: Offset Info Type Sym.Value Sym. Name 0000010b 00000301 R_386_32 00000000 .bss 00000110 00000301 R_386_32 00000000 .bss
首先,它沒有任何意義的.bss
重新定位數據。根據定義,.bss
中的數據全爲零,無法調整爲其他值。
所有其次,它沒有任何意義搬遷相對值來自己的部分的基址。這將是一個沒有操作。
那麼,什麼給?這些搬遷應該是什麼意思?
(從而走進這個二進制的彙編代碼中包含類似:
.bss
keybuffer:
.space 256
...後來:
.bss
anotherbuffer:
.space 4
這就是你可以看到上面的偏移量是從哪裏來的)
糾正我,如果我錯了,是不是加載程序分配的BSS部分就像任何其他部分?它只是在目標文件中不佔用空間。另外,BSS部分中的數據可以像DATA部分一樣被覆蓋,對嗎?如果是這樣,爲什麼它不應該搬遷?我不是GAS輸出的專家,但它的哪部分表示「*相對於其自己的部分的基地址重定位值」? –
@MargaretBloom,由於BSS部分在對象文件中不佔空間,因此它不能包含任何指針,所以沒有理由將重定位(=在二進制數據中調整指針的值)應用到它。在上面的'readelf -r'輸出中,可以看到BSS有重定位,BSS中(不存在的)指針相對於其重定位的「符號值」是BSS的字節0 = BSS。 –
@AlexD:如果不移動到'.text'部分,您不會編寫代碼嗎? – ninjalj