我正在构建一个嵌入式 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 架构。)
谢谢
约翰