1

我正在构建一个嵌入式 Linux,我遇到了由于各个部分的 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/kernel/vmlinux.lds)具有以下行:

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

对我来说,这表明 .init.text VMA 应该等于 .init.text 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 架构。)

谢谢

约翰

4

1 回答 1

1

所以,我正在回答我自己的问题,以防其他人遇到同样的问题,这可能会节省他们一些时间——事实证明链接器中有一个错误。modver 部分是空的,但包含一个 ALIGN 指令。似乎这使链接器感到困惑,并且它抛弃了所有后续部分的 LMA。对此的解决方案是强制将单字节变量包含在 modver 中(但不在 start_modver 和 end_modver 之间——否则会引入新问题......)。这解决了问题。链接器最终必须被修复。

约翰

于 2012-04-17T19:32:20.603 回答