2016-05-05 55 views
0

我正在寫一些自定義的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 

這就是你可以看到上面的偏移量是從哪裏來的)

+0

糾正我,如果我錯了,是不是加載程序分配的BSS部分就像任何其他部分?它只是在目標文件中不佔用空間。另外,BSS部分中的數據可以像DATA部分一樣被覆蓋,對嗎?如果是這樣,爲什麼它不應該搬遷?我不是GAS輸出的專家,但它的哪部分表示「*相對於其自己的部分的基地址重定位值」? –

+0

@MargaretBloom,由於BSS部分在對象文件中不佔空間,因此它不能包含任何指針,所以沒有理由將重定位(=在二進制數據中調整指針的值)應用到它。在上面的'readelf -r'輸出中,可以看到BSS有重定位,BSS中(不存在的)指針相對於其重定位的「符號值」是BSS的字節0 = BSS。 –

+0

@AlexD:如果不移動到'.text'部分,您不會編寫代碼嗎? – ninjalj

回答

4

看起來您的代碼或數據在您的.bss部分中引用了這些變量。只是創造,只有你的示例代碼彙編文件不重現該問題:

$ cat t115a.s 
     .bss 
keybuffer: 
     .space 256 

     .bss 
     mov  $keybuffer, %eax 
     .long anotherbuffer 

     .bss 
anotherbuffer: 
     .space 4 

$ as --32 t115a.s 
$ readelf -r a.out 

Relocation section '.rel.bss' at offset 0xe0 contains 2 entries: 
Offset  Info Type   Sym.Value Sym. Name 
00000101 00000301 R_386_32   00000000 .bss 
00000105 00000301 R_386_32   00000000 .bss 

的事實:

$ cat t115.a 
     .bss 
keybuffer: 
     .space 256 

     .bss 
anotherbuffer: 
     .space 4 

$ as --32 t115.a 
$ readelf -r a.out 

There are no relocations in this file. 

不過,我可以在.bss段引用符號重現問題您的示例輸出中的偏移量0000010b甚至沒有向我暗示您意外地將代碼放入了.bss部分。

重新定位是你期望的。它們與段.bss不相關,它們針對本地符號.bss應用,其值是此文件中.bss節開頭的地址。使用R_386_32重定位類型時,符號的值將添加到重定位目標(「加數」)中存儲的值中。因爲在這種情況下,重定位的目標位於沒有任何內容(.bss)的節中,所以加數的值爲0.如果它是具有內容(例如.text或.data)的節,則重定位將包含對象文件中.bss節開頭的偏移量。

+0

就是這樣!我不小心把代碼放在'.bss'部分!謝謝......這讓我非常困惑。 –