Gcc LMA不等于VMA
我正在构建一个嵌入式Linux,我遇到了一个错误,原因是各个部分的LMA和VMA地址不相等:Gcc LMA不等于VMA,gcc,linker,linux-kernel,ld,Gcc,Linker,Linux Kernel,Ld,我正在构建一个嵌入式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 802
> /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。我还尝试手动添加AT for.data,这样脚本中就有了.data:AT(ADDR(.data))
,但这也不会将.data移回正确的位置。有趣的是,LMA和VMA的差异为0x470字节,这正是_modver部分的大小。有人能解释我为什么会有这种行为吗
(我正在使用buildroot 2011.11、uClibc 0.9.32.1、gcc 4.6和linux 3.2作为mips体系结构。)
谢谢
John所以,我在回答我自己的问题,以防其他人遇到同样的问题,这可能会节省他们一些时间——结果是链接器中有一个bug。modver部分为空,但包含ALIGN指令。这似乎混淆了链接器,并将所有后续部分的LMA抛在脑后。解决方法是强制在modver中包含一个单字节变量(但不能在start_modver和end_modver之间,否则会引入新问题…)。这就解决了问题。链接器最终必须修复
John所以,我在回答我自己的问题,以防其他人遇到同样的问题,这可能会节省他们一些时间——结果是链接器中有一个bug。modver部分为空,但包含ALIGN指令。这似乎混淆了链接器,并将所有后续部分的LMA抛在脑后。解决方法是强制在modver中包含一个单字节变量(但不能在start_modver和end_modver之间,否则会引入新问题…)。这就解决了问题。链接器最终必须修复 约翰