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?