2012-04-12 30 views
1

我建立一個嵌入式Linux,和我遇到引發的各種段的LMA和VMA地址錯誤不相等:LMA不等於VMA

> /opt/tc/uclibc-crosstools-gcc-4.6/usr/bin/mips-linux-uclibc-objdump -h vmlinux 
... 
9 __modver  00000470 802b6b90 802b6b90 002aab90 2**0 
       ALLOC 
10 .data   002f5e20 802b8000 802b7b90 002abb90 2**14 
       CONTENTS, ALLOC, LOAD, DATA 
11 .init.text 0001c020 805ae000 805adb90 005a1b90 2**2 
       CONTENTS, ALLOC, LOAD, READONLY, CODE 
... 

我有問題是自動生成的鏈接腳本(ARCH/MIPS /內核/ vmlinux.lds)具有以下行:

.init.data : AT(ADDR(.init.data) - 0) { ...} 

這對我將表明.init.text VMA應該等於的.init。文本LMA。我也嘗試手動爲.data添加一個AT,這樣我在腳本中有.data : AT(ADDR(.data)),但是這不會將.data移回到正確的位置。其中一個值得注意的地方是LMA和VMA的差別是0x470字節,這正好是__modver部分的大小。任何人都可以闡明爲什麼我會得到這種行爲?

(我用的buildroot 2011.11,uClibc的0.9.32.1,GCC 4.6和Linux 3.2爲MIPS架構。)

感謝

約翰

回答

1

所以,我回答我如果有人遇到同一問題,可能會爲他們節省一些時間 - 原來鏈接器中存在一個錯誤。 modver部分是空的,但包含一個ALIGN指令。看起來好像這個混淆鏈接器,並且它拋出所有後續部分的LMA。解決這個問題的辦法是強制一個字節變量包含在mod中(但不能在start_modver和end_modver之間 - 否則引入新的問題......)。這解決了這個問題。鏈接器最終必須修復。

約翰