Autor Thema: ld gibt falsche Addressen raus  (Gelesen 7815 mal)

scanish

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« 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 =/

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. November 2009, 08:00 »
Versuch mal, dem ld --nmagic als Parameter mitzugeben.
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

scanish

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. November 2009, 10:32 »
Jetzt geht's.  :?

Vielen Dank.

SHyx0rmZ

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 15. November 2009, 02:06 »
Soweit ich das verstehe, veranlasst --nmagic den Linker dazu, das Pagealigning abzuschalten.
@X="krJhbuaesrytre c a cnR.ohut";while@X[/(..)(.)/];@X=@X[3..-1]+$1;print$2;end
"Scheiß auf Perl, wir haben Kekse" - Emperor Ruby

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #4 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.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #6 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.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 15. November 2009, 18:26 »
LDFLAGS="--build-id=none" ./configureIrgendwie sowas vielleicht?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #8 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.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #9 am: 15. November 2009, 21:32 »
Dann würde ich
LDFLAGS="-Xlinker --build-id=none" ./configureprobieren, wenn der gcc selbst --build-id nicht kennt.

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #10 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.
« Letzte Änderung: 15. November 2009, 23:28 von Tobiking »

scanish

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #11 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.

 

Einloggen