Gcc 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

我正在构建一个嵌入式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。我还尝试手动添加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之间,否则会引入新问题…)。这就解决了问题。链接器最终必须修复

约翰