2012-04-12 17 views
1

Ich baue ein eingebettetes Linux, und ich bin der Begegnung einen Fehler verursacht durch die LMA und VMA Adressen verschiedener Abschnitte nicht gleich sind:LMA nicht gleich 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 
... 

Das Problem Ich bin ist, dass der auto-Linker-Skript (arch/mips/kernel/vmlinux.lds) hat die folgende Zeile generiert:

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

Was mir, dass die .init.text VMA zum .init sollte gleich angeben würde. Text LMA. Ich habe auch versucht, ein AT für .data manuell hinzuzufügen, so dass ich .data : AT(ADDR(.data)) im Skript hatte, aber das verschiebt .data nicht an den richtigen Ort entweder. Ein interessanter Punkt ist, dass sich die LMA und VMAs um 0x470 Bytes unterscheiden, was genau der Größe des __modver-Abschnitts entspricht. Kann irgendjemand ein Licht darauf werfen, warum ich dieses Verhalten bekomme?

(Ich verwende buildroot 2011.11, uClibc 0.9.32.1, gcc 4.6 und Linux 3.2 für MIPS-Architektur.)

Dank

John

Antwort

1

Also, ich bin die Beantwortung meiner eigene Frage für den Fall, dass jemand anderes auf dasselbe Problem stößt, könnte es ihnen etwas Zeit sparen - es stellt sich heraus, dass es im Linker einen Fehler gibt. Der Modver-Abschnitt war leer, enthielt jedoch eine ALIGN-Anweisung. Es scheint, als ob dies den Linker verwirrt, und es wirft die LMAs aller nachfolgenden Abschnitte ab. Die Lösung dafür war, eine einzelne Bytevariable in den Modver einzufügen (aber nicht zwischen start_modver und end_modver - sonst stellst du neue Probleme ein ...). Dies behebt das Problem. Der Linker muss eventuell repariert werden.

John