Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: ScAr_TeX am 19. February 2012, 17:34

Titel: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTP
Beitrag von: ScAr_TeX am 19. February 2012, 17:34
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?
Titel: Re: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTP
Beitrag von: bluecode 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.
Titel: Re: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTP
Beitrag von: ScAr_TeX 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.
Titel: Re: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTP
Beitrag von: bluecode 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?
Titel: Re: Error: cannot represent relocation type BFD_RELOC_X86_64_GOTP
Beitrag von: ScAr_TeX 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 ;)