Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: scanish am 11. November 2009, 20:41

Titel: ld gibt falsche Addressen raus
Beitrag von: scanish am 11. November 2009, 20:41
Hi,

ja eigentlich wollte ich an was anderem Arbeiten, aber nachdem ich mein Ubuntu geupdatet hab, weigerte sich GRUB plötzlich, meinen Kernel zu laden. Nach einem kurzen Blick auf die Datei erklärte sich die Weigerung: Die Datei war ohne zusätzlichen Code oder irgendwelche Änderungen von 12 KB auf 1.0012 MB gewachsen. Weil der ld nach dem Update die 1 MB Grenze in die Datei eingefügt hatte (der typ ist .elf). Ich hab es mir im Hexcode angesehen, das erstem Megabyte ist mit 0x00 gefüllt.

Ich hab nicht mal was am linkerscript geändert. Ich werd das hier mal posten:
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386)
ENTRY(start)
phys = 0x100000;
SECTIONS
{
.text phys : AT(phys)
{
code = .;
*(.text)
*(.rodata)
start_ctors = .; *(.ctors) end_ctors = .;
start_dtors = .; *(.dtors) end_dtors = .;
. = ALIGN(0x1000);
}

.data : AT(phys + (data - code))
{
data = .;
*(.data)
}

.bss : AT(phys + (bss - code))
{
bss = .;
*(COMMON)
*(.bss)
. = ALIGN(0x1000);
}
end = .;
}

Ist die selbe, die ich immer nehme. Hab ich vielleicht eine gravierende Änderung verpasst? Ich hab nichtmal bemerkt, dass es so einen großen Versionssprung beim ld gab...

Ich hoffe ihr könnt mir helfen, weil mich das nervt, dass ich sonst nicht weiterarbeiten kann =/
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: SHyx0rmZ am 12. November 2009, 08:00
Versuch mal, dem ld --nmagic als Parameter mitzugeben.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: scanish am 12. November 2009, 10:32
Jetzt geht's.  :?

Vielen Dank.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: SHyx0rmZ am 15. November 2009, 02:06
Soweit ich das verstehe, veranlasst --nmagic den Linker dazu, das Pagealigning abzuschalten.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: Tobiking am 15. November 2009, 03:18
Ich hab wegen dem Problem mal recherchiert, weil es das gleiche Problem ist warum man Grub legacy nicht mehr mit dem Ubuntu 9.10 bauen kann.

Der Übeltäter ist wohl das neue Feature build-id (https://fedoraproject.org/wiki/Releases/FeatureBuildId) in Binutils 2.20. Eigentlich soll es nur eine ID in das Binary schreiben, damit man z.B. core dumps genau zuordnen kann, aber es scheint dafür das Binary erstmal auf "echte" Größe zu bringen. Mit --build-id=none kann man das deaktiveren, vielleicht steckt das in --nmagic irgendwie drin.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: kevin am 15. November 2009, 12:49
Hm, brauche ich die Option dann auch in meinem Beispielkernel? Kannst du das mal kurz mit tutorial.git ausprobieren, wenn du ein betroffenes System da hast?

Ansonsten wäre es vielleicht nicht schlecht, wenn du in den GRUB-Artikel einen Absatz zum Bauen einbauen könntest. Ich nehme an, das Problem wird in Zukunft öfter auftreten.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: Tobiking am 15. November 2009, 16:20
Ich krieg den Fehler auf den Tutorial Kernel nicht reproduziert. Selbst wenn ich das Linkerscript von scanish benutze. Es scheint also noch etwas anderes nötig zu sein damit der Fehler auftritt.

Zum Thema Grub hab ich noch keine ordentliche Lösung gefunden. Das Problem ist, dass Grub schon beim configure Schritt prüft ob die Binutils richtig arbeiten und ich keinerlei Ahnung von autoconf habe.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: kevin am 15. November 2009, 18:26
LDFLAGS="--build-id=none" ./configureIrgendwie sowas vielleicht?
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: Tobiking am 15. November 2009, 19:59
Das haut irgendwie nicht hin. In den Tests übernimmt der gcc implizit das linken und er der macht aus dem --build-id -fbuild-id und beschwert sich das der Parameter unbekannt ist.

Dann hab ich mir den autoconf Kram angeguckt, überall den Parameter eingetragen aber das configure script läuft immer noch nicht durch.

So langsam glaube ich da ist noch ein anderes Problem. Dieses build-id soll wohl doch schon in vorherigen Binutils versionen vorhanden gewesen sein.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: XanClic am 15. November 2009, 21:32
Dann würde ich
LDFLAGS="-Xlinker --build-id=none" ./configureprobieren, wenn der gcc selbst --build-id nicht kennt.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: Tobiking am 15. November 2009, 22:17
Mit "CFLAGS="-fno-stack-protector -Wl,--build-id=none" ./configure" hab ich es jetzt geschafft Grub zu bauen, aber es bootet nicht. Stage1 sieht zwar in ordnung aus und hat die Bootsignatur, aber nach dem installieren über die grub shell fehlt die Bootsignatur.

Edit: Es klappt doch, also die CFLAGS sind die Lösung.
Titel: Re: ld gibt falsche Addressen raus
Beitrag von: scanish am 16. November 2009, 15:23
Na ja ich hab den GRUB ja nicht gebaut, das ist noch eine uralt-version. Seit Ewigkeiten benutz ich die weil sie ja immer funktioniert hat. Gebaut hab ich die noch auf Ubuntu 8.04, glaub ich.

Aber es klappt ja und das kernelende wird offenbar auch ordentlich aligned mit --nmagic.