Autor Thema: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTP  (Gelesen 6110 mal)

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
Hallo zusammen,

mein BS-Loader ist jetzt erfolgreich in der Lage 32-bit PE-Dateien zu laden.
Nun wollte ich auch den Support für 64-bit PE-Dateien hinzufügen und habe dabei folgendes Problem:

Mein Kernel ist eine 64-bit Anwendung und soll per Loader an 0xFFFF800000000000 "relocated" werden.
Dies ist jedoch leider nicht möglich, da ich das Memory-Model (mcmodel) von gcc nicht auf 'large' ändern kann.

Sobald ich dies tue bekomme ich beim kompilieren folgende Meldung:

/usr/local/cross/lib/gcc/x86_64-w64-mingw32/4.6.2/../../../../x86_64-w64-mingw32/bin/as: BFD (GNU Binutils) 2.22 assertion fail ../../binutils-2.22/bfd/coff-x86_64.c:681
/tmp/ccYUYli4.s: Assembler messages:
/tmp/ccYUYli4.s:9: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTPC64
make[1]: *** [hal.o] Fehler 1

Wenn ich das Memory-Model auf small oder medium lasse, kann ich die EXE zwar erzeugen, jedoch habe ich dann 32-bit Relocs im Code - Daten werden korrekt nur mit 64-bit Relocations erzeugt.

Genutzt wird ein selbst kompilierter x86-64-Bit Cross-Compiler unter Ubuntu (x86_64-w64-mingw32).
GCC-Version: 4.6.2
Binutils-Version: 2.22

Kompiliert wird mit folgender Befehlszeile:

x86_64-w64-mingw32-gcc -march=core2 -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow -O2 -fno-stack-protector -c -ffreestanding -nostdinc -Wall -mno-red-zone -m64 -ffreestanding -nostdlib -mcmodel=large -I. -o hal.o hal.c

Bintuils erzeugt mit:

export PREFIX=/usr/local/cross
export TARGET=x86_64-w64-mingw32
cd build-binutils
../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX --enable-64-bit-bfd --disable-nls
make all install

GCC wird erzeugt mit:

export PREFIX=/usr/local/cross
export TARGET=x86_64-w64-mingw32
export PATH=$PATH;$PREFIX/bin
cd build-gcc
../gcc-4.6.2/configure --target=$TARGET --prefix=$PREFIX --disable-nls --enable-languages=c --without-headers
make -k all-gcc install-gcc

Hat zufällig jemand einen Lösungsansatz für dieses Problem?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 23. February 2012, 20:12 »
Hat zufällig jemand einen Lösungsansatz für dieses Problem?
-mcmodel=kernel, wobei du damit auch nicht an die Adresse die du dir vorstellst kommst, sondern halt an -2GB.
« Letzte Änderung: 23. February 2012, 20:13 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #2 am: 23. February 2012, 20:50 »
Das Problem ist, dass gcc beim Kompilieren mit mcmodel=kernel immer folgendes zu meckern hat:

hal_gdt.c:1:0: error: code model kernel does not support PIC mode
hal_gdt.c:1:0: error: code model 'kernel' not supported in the 64 bit mode

Habe das Problem jetzt vorläufig erst einmal mit mcmodel=medium und den intensiven Einsatz von "movabsq" in Assembler-Bereichen behoben.
Somit werden zur Zeit (mal schauen wir lange ^^) die gewünschten 64-Bit Relocations angelegt.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 23. February 2012, 22:23 »
Also ich hab für meinen x64 Port des Kernels kein PIC genommen, sagt meine configure-Datei. Warum willst du das denn nehmen?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #4 am: 11. March 2012, 20:51 »
Habe das Problem mittlerweile lösen können.

GCC kommt anscheinend nicht richtig mit Relocation's innerhalb von asm-Blöcken klar.
Dank "movabs" bekomme ich aber die von mir gewünschten Relocation-Einträge :)

@bluecode: PIC im Kernel? Mhhh... keine Ahnung warum. Ich wollte es einfach mal ausprobieren ;)

 

Einloggen