Lowlevel
Lowlevel => Softwareentwicklung => Thema gestartet von: OsDevNewbie am 16. March 2015, 15:12
-
Hallo liebe Community,
ich möchte gerne den GCC für mein OS compilieren, so dass man mit ihm dann Programme auf meinem OS compilieren kann. Nur wie sage ich dem configure Skript, dass es meine Library verwenden soll?
Ich habe jetzt einfach mal die neueste GCC Version heruntergeladen. Kann man dann überhaupt das configure-Skript verwenden, welches sich im Ordner befindet oder muss man alles selber machen?
Was muss ich sonst noch beachten?
Das ist das erste Programm, das ich portiere und somit mache ich hiermit erste Erfahrungen.
Ich freue mich jetzt schon auf Rückmeldungen. Danke.
-
Erster Schritt, falls du den noch nicht gemacht hast, ist, dass du einen Crosscompiler bzw. eine komplette Crosstoolchain für dein OS baust. Das Ziel ist, dass du einen Compiler bekommst, mit dem du direkt mit z.B. "i386-pc-tyndur-gcc -o test test.c" eine Binary für dein OS bauen kannst.
Wenn du das hast, kannst du dann beim gcc-configure die Optionen --host und --target auf deinen Crosscompiler zeigen lassen, so dass der gcc für dein OS gebaut wird.
Eventuell kannst du dir beim tyndur-lbuild (http://git.tyndur.org/?p=lbuilds.git;a=blob;f=patches/gcc/4.5.2/gcc-4.5.2.patch) ein bisschen abschauen, was man am gcc patchen muss, damit man das Target für sein OS bekommt.
-
Danke für deine Antwort.
Muss ich dann einfach die Anweisungen in diesem Artikel (http://www.lowlevel.eu/wiki/Cross-Compiler) befolgen?
-
Vom Ansatz her ist das das gleiche, aber das Vorgehen dort wird nicht ganz reichen. Die Vereinfachung in dem Artikel ist, dass man den Crosscompiler für ein generisches ELF-Target baut. Das ist für einen Kernel in Ordnung, weil du da sowieso mit Linkerskripts usw. rumhantierst, aber für Userspaceprogramme willst du das nicht machen. Da soll der gcc einfach die passende libc dazulinken und direkt eine Binary ausspucken, die auf deinem OS funktioniert. Und dafür musst du dem gcc erstmal ein neues Target beibringen, das zu deinem OS passt.
-
Achso jetzt verstehe ich.
Aber ich verstehe noch nicht wie die Dateien in /gcc/config/i386 und /gcc/config aufgebaut sein muss, denn dort steht überall etwas anderes drin. Gibt es dort eine Art Vorlage?
Und wie kann ich dann einen GCC bauen, der auf meinem OS lauffähig ist? Welche Funktionen muss meine Library bereitstellen?
-
Kann ich jetzt aus dem Stegreif auch nicht beantworten. Das letzte Mal als ich das gemacht habe, habe ich mich am tyndur-Patch orientiert und dann solange daran rumgefeilt, bis es funktioniert hat. ;)
Ein Compiler ist in der Regel relativ genügsam, was libc-Funktionen angeht, um ihn auf deinem OS laufen zu lassen. Der tyndur-Patch implementiert auch ein paar wenige OS-spezifische Funktionen, z.B. zum Starten von Kindprozessen. Das sind die pex_*-Sachen. Auch dabei würde einfach mal grob nachmachen, was dort steht.
-
Ich habe jetzt von Martin Erhardt ein tool gefunden, welches gcc für ein beliebiges OS einrichtet (mit ein bisschen Vorarbeit). Was ich dabei nicht verstehe ist, für was werden die newlib-files verwendet?
Funktioniert dieses Tool auch für neuere GCC Versionen (5.1) oder nur für die für die es erstellt wurde (4.5.0)?
Ich danke für alle bisherigen Antworten.
-
newlib gehört nicht zu gcc, sondern ist eine (POSIX-basierte) libc, die du auf dein OS portieren kannst, wenn du das willst.
Das Tool von Martin kenne ich nicht, aber vielleicht kann er selber etwas dazu sagen.
-
Das heisst, wenn meine libc posix conform wäre, dann bräuchte ich die newlib nicht?
-
Wenn du newlib benutzt, hast du keine eigene libc. newlib ist die libc. Das einzige, was du beim Portieren wirklich schreibst, sind ein paar Funktionen, die newlib braucht, um Syscalls aufzurufen (und diese Syscalls sind natürlich recht unixartig).
-
Also könnte ich auch meine eigene libc verwenden?
-
Wenn du deine eigene libc verwendest, dann hast du keine newlib. Und ja, das funktioniert natürlich auch.
-
Die libc mit der man gcc compiliert, ist die dann auch die libc, mit der gcc dann die Programme compiliert?
-
Nö, du kannst mit dem gcc auch programme ohne libc compilieren. Oder mit einer beliebigen.
Der gcc selber braucht natürlich auch eine lib, die er benutzt bzw. mit der er gebaut wird. Wichtig ist, dass diese mit deinem System funktioniert.
-
Ich habe jetzt mal versucht binutils-2.25 zu kompilieren mit target mein os.
Leider schlägt es irgendwo fehl und ich weiss nicht wo. Vielleicht wisst ihr ja was das Problem ist. Hier der log des Befehls make:
make[1]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie« wird betreten
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/libiberty« wird betreten
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/libiberty/testsuite« wird betreten
make[3]: Für das Ziel »all« ist nichts zu tun.
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/libiberty/testsuite« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/libiberty« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/intl« wird betreten
make[2]: Für das Ziel »all« ist nichts zu tun.
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/intl« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird betreten
Making info in doc
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/doc« wird betreten
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/doc« wird verlassen
Making info in po
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/po« wird betreten
make[3]: Für das Ziel »info« ist nichts zu tun.
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/po« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird betreten
make[3]: Für das Ziel »info-am« ist nichts zu tun.
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird verlassen
make all-recursive
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird betreten
Making all in doc
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/doc« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/doc« wird verlassen
Making all in po
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/po« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd/po« wird verlassen
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird betreten
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/bfd« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes« wird betreten
make all-recursive
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes« wird betreten
Making all in .
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes« wird betreten
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes« wird verlassen
Making all in po
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes/po« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes/po« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/opcodes« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas« wird betreten
make all-recursive
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas« wird betreten
Making all in doc
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas/doc« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas/doc« wird verlassen
Making all in po
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas/po« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas/po« wird verlassen
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas« wird betreten
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gas« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird betreten
Making info in doc
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/doc« wird betreten
make[3]: Für das Ziel »info« ist nichts zu tun.
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/doc« wird verlassen
Making info in po
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/po« wird betreten
make[3]: Für das Ziel »info« ist nichts zu tun.
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/po« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird betreten
make[3]: Für das Ziel »info-am« ist nichts zu tun.
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird verlassen
make all-recursive
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird betreten
Making all in doc
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/doc« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/doc« wird verlassen
Making all in po
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/po« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils/po« wird verlassen
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird betreten
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/binutils« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/etc« wird betreten
make[2]: Für das Ziel »all« ist nichts zu tun.
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/etc« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof« wird betreten
make all-recursive
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof« wird betreten
Making all in po
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof/po« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof/po« wird verlassen
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof« wird betreten
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof« wird verlassen
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/gprof« wird verlassen
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird betreten
make all-recursive
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird betreten
Making all in po
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld/po« wird betreten
make[4]: Für das Ziel »all« ist nichts zu tun.
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld/po« wird verlassen
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird betreten
/bin/bash ./libtool --tag=CC --mode=link gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -static-libstdc++ -static-libgcc -o ld-new ldgram.o ldlex-wrapper.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o plugin.o ldbuildid.o eelf_x86_64_youros.o eelf_x86_64.o ../bfd/libbfd.la ../libiberty/libiberty.a -lz -ldl -ldl
libtool: link: gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -static-libstdc++ -static-libgcc -o ld-new ldgram.o ldlex-wrapper.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o plugin.o ldbuildid.o eelf_x86_64_youros.o eelf_x86_64.o ../bfd/.libs/libbfd.a ../libiberty/libiberty.a -lz -ldl
ldemul.o:(.data+0x0): undefined reference to `ld_elf_x86_64_youros_emulation'
collect2: error: ld returned 1 exit status
make[4]: *** [ld-new] Fehler 1
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird verlassen
make[3]: *** [all-recursive] Fehler 1
make[3]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird verlassen
make[2]: *** [all] Fehler 2
make[2]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird verlassen
make[1]: *** [all-ld] Fehler 2
make[1]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie« wird verlassen
make: *** [all] Fehler 2
Ich würde mich enorm freuen wenn jemand den Grund für diesen Fehler findet.
-
Ich habe so etwas mit den binutils zwar bis her noch nicht gemacht, aber vielleicht hilft dir das ja trotzdem.
Ich habe jetzt mal versucht binutils-2.25 zu kompilieren mit target mein os.
Leider schlägt es irgendwo fehl und ich weiss nicht wo. Vielleicht wisst ihr ja was das Problem ist.
Hier ist der Fehler:
make[4]: Verzeichnis »/home/pascal/Dokumente/cross/src/binutils-2.25_Kopie/ld« wird betreten
/bin/bash ./libtool --tag=CC --mode=link gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -static-libstdc++ -static-libgcc -o ld-new ldgram.o ldlex-wrapper.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o plugin.o ldbuildid.o eelf_x86_64_youros.o eelf_x86_64.o ../bfd/libbfd.la ../libiberty/libiberty.a -lz -ldl -ldl
libtool: link: gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -g -O2 -static-libstdc++ -static-libgcc -o ld-new ldgram.o ldlex-wrapper.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o plugin.o ldbuildid.o eelf_x86_64_youros.o eelf_x86_64.o ../bfd/.libs/libbfd.a ../libiberty/libiberty.a -lz -ldl
ldemul.o:(.data+0x0): undefined reference to `ld_elf_x86_64_youros_emulation'
collect2: error: ld returned 1 exit status
ld_elf_x86_64_youros_emulation ist nicht definiert oder kann nicht gefunden werden.
Dateien die eventuell von Interesse sind:
ld/ldemul.{c,h}
(ldemul.o verweist auf das entsprechende Label)
ldemul-list.h
wird automatisch generiert und könnte einen Verweis 'ld_elf_x86_64_youros_emulation' enthalten.
ld/emulparams/
ld/emultempl/
wegen des namens
Du solltest mal versuchen raus zu finden wie dieses 'ld_elf_x86_64_youros_emulation' für andere target platformen definiert ist und das dann entsprechend für YourOS machen.
Es wird sich dabei vermutlich um eine Struktur des Types "ld_emulation_xfer_struct"(ldemul.h) handeln.
Ich hoffe ich konnte ein wenig helfen.
[EDIT:]
Schau dir mal ganz speziell ld/emultempl/linux.em an. Das sieht so aus als würde genau dass für YourOS fehlen.
-
Nachdem ich die binutils endlich kompilieren konnte habe ich jetzt veruscht gcc zu kompilieren. Leider kommen irgendwann folgende Meldungen:
/bin/bash ../.././gcc/../move-if-change tmp-output.c insn-output.c
echo timestamp > s-output
g++ -c -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -I. -I. -I../.././gcc -I../.././gcc/. -I../.././gcc/../include -I../.././gcc/../libcpp/include -I../.././gcc/../libdecnumber -I../.././gcc/../libdecnumber/dpd -I../libdecnumber -I../.././gcc/../libbacktrace -o insn-output.o -MT insn-output.o -MMD -MP -MF ./.deps/insn-output.TPo insn-output.c
../.././gcc/config/i386/i386.md: In function ‘const char* output_774(rtx_def**, rtx_insn*)’:
../.././gcc/config/i386/i386.md:13225:12: error: ‘ASM_BYTE’ was not declared in this scope
fputs (ASM_BYTE "0x66\n", asm_out_file);
^
../.././gcc/config/i386/i386.md:13228:10: error: ‘ASM_SHORT’ was not declared in this scope
fputs (ASM_SHORT "0x6666\n", asm_out_file);
^
../.././gcc/config/i386/i386.md: In function ‘const char* output_775(rtx_def**, rtx_insn*)’:
../.././gcc/config/i386/i386.md:13225:12: error: ‘ASM_BYTE’ was not declared in this scope
fputs (ASM_BYTE "0x66\n", asm_out_file);
^
../.././gcc/config/i386/i386.md:13228:10: error: ‘ASM_SHORT’ was not declared in this scope
fputs (ASM_SHORT "0x6666\n", asm_out_file);
^
make[1]: *** [insn-output.o] Fehler 1
make[1]: Verzeichnis »/home/pascal/Dokumente/cross/src/gcc-5.1.0/host-x86_64-unknown-linux-gnu/gcc« wird verlassen
make: *** [all-gcc] Fehler 2
Ich habe alles nach Vorlage gemacht und im Internet habe ich auch nichts hilfreiches zu diesem Fehler gefunden. Anscheinend fehlen aber die Definitionen von ASM_BYTE und ASM_SHORT. Wo sollten diese definiert sein? Ich hoffe es kann mir jemand von euch helfen.
-
Wo sollten diese definiert sein?
Kennst du grep?
grep -r ASM_BYTE ${GCC_SOURCE_FOLDER}
grep -r "i386/att.h" ${GCC_SOURCE_FOLDER}
-
Also in i386/att.h werden zwar ASM_BYTE und ASM_SHORT definiert, aber warum gibt es dann die Meldung, dass es nicht definiert ist. Was macht denn eigentlich diese .md Datei?
Vielen Dank für deine rasche Antwort, auch wenn sie mir nicht sehr viel weiterhilft.
-
Die Änderungen, die du am GCC vorgenommen hast, um Unterstützung für dein OS einzubauen, sind sicherlich ein Faktor. Hast du zufällig ein git-Repository oder ähnliches, wo jemand mit Ahnung davon (=nicht ich) deine Änderungen einsehen könnte?
-
Für mich sieht es so aus als würde in i386.md etwas bezüglich der Code-Generierung konfiguriert.
Und wenn du dir mal gcc/config.gcc angesehn hast, das ist die einzige Datei in der i386/att.h mal erwähnt wird. Passiert das abhängig vom Compiler TARGET.
Ich nehme also an du musst für dein TARGET in tm_file i386/atth mit aufnehmen.
Oder dein Target so umbenennen das es auf eine dieser Zeilen passt.
1368 i[34567]86-*-elf*)
1369 tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/i386elf.h"
1370 ;;
1371 x86_64-*-elf*)
1372 tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h newlib-stdint.h i386/i386elf.h i386/x86-64.h"
1373 ;;
-
Hier ist ein git Repository mit den Änderungen von mir: https://github.com/Gurgel100/gcc
Hier ist noch der dazugehörige Patch:
diff --git a/config.sub b/config.sub
index 6d2e94c..71fcbe5 100755
--- a/config.sub
+++ b/config.sub
@@ -118,7 +118,7 @@ case $maybe_os in
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
knetbsd*-gnu* | netbsd*-gnu* | \
- kopensolaris*-gnu* | \
+ kopensolaris*-gnu* | youros* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
@@ -1526,6 +1526,9 @@ case $os in
-nacl*)
;;
-none)
+ ;;
+ -youros*)
+ os=-youros
;;
*)
# Get rid of the `-' at the beginning of $os.
diff --git a/fixincludes/mkfixinc.sh b/fixincludes/mkfixinc.sh
index 6653fed..ef2f2ab 100755
--- a/fixincludes/mkfixinc.sh
+++ b/fixincludes/mkfixinc.sh
@@ -11,6 +11,7 @@ target=fixinc.sh
# Check for special fix rules for particular targets
case $machine in
+ *-youros* | \
i?86-*-cygwin* | \
i?86-*-mingw32* | \
x86_64-*-mingw32* | \
diff --git a/gcc/config.gcc b/gcc/config.gcc
index cb08a5c..6bbcc00 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -868,6 +868,11 @@ case ${target} in
*) echo 'Unknown thread configuration for VxWorks'; exit 1 ;;
esac
;;
+*-*-youros*)
+ gas=yes
+ gnu_ld=yes
+ default_use_cxa_atexit=no
+ ;;
*-*-elf|arc*-*-elf*)
# Assume that newlib is being used and so __cxa_atexit is provided.
default_use_cxa_atexit=yes
@@ -1739,6 +1744,8 @@ i[34567]86-*-interix[3-9]*)
tm_file="${tm_file} dbxcoff.h"
fi
;;
+x86_64-*-youros*)
+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/x86-64.h youros.h"
ia64*-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h newlib-stdint.h ia64/sysv4.h ia64/elf.h"
tmake_file="ia64/t-ia64"
diff --git a/libgcc/config.host b/libgcc/config.host
index 4b15895..cee3721 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -718,6 +718,10 @@ x86_64-*-mingw*)
extra_parts="$extra_parts vtv_start.o vtv_end.o vtv_start_preinit.o vtv_end_preinit.o"
fi
;;
+x86_64-*-youros*)
+ extra_parts="$extra_parts crtbegin.o crtend.o"
+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic"
+ ;;
i[34567]86-*-interix[3-9]*)
tmake_file="$tmake_file i386/t-interix i386/t-chkstk"
;;
diff --git a/libstdc++-v3/crossconfig.m4 b/libstdc++-v3/crossconfig.m4
index 10247f9..8c5ffac 100644
--- a/libstdc++-v3/crossconfig.m4
+++ b/libstdc++-v3/crossconfig.m4
@@ -269,6 +269,12 @@ case "${host}" in
AC_DEFINE(HAVE_TANF)
AC_DEFINE(HAVE_TANHF)
;;
+ *-youros*)
+ GLIBCXX_CHECK_COMPILER_FEATURES
+ GLIBCXX_CHECK_LINKER_FEATURES
+ GLIBCXX_CHECK_MATH_SUPPORT
+ GLIBCXX_CHECK_STDLIB_SUPPORT
+ ;;
*)
AC_MSG_ERROR([No support for this host/target combination.])
;;
-
Ist die fehlermeldung schon von diesem Code?
Hier erst mal ein Fix:
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 6bbcc00..68b3f7e 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1746,6 +1746,7 @@ i[34567]86-*-interix[3-9]*)
;;
x86_64-*-youros*)
tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/x86-64.h youros.h"
+ ;;
ia64*-*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h newlib-stdint.h ia64/sysv4.h ia64/elf.h"
tmake_file="ia64/t-ia64"
Wie compilierst du? Was sind die Konfigurationsparameter?
Eventuell könnte das hier beim Debuggen helfen:
$ env -i sh -c 'set -a;target=x86_64-unknown-youros;source gcc/config.gcc;env' > /tmp/youros
$ env -i sh -c 'set -a;target=x86_64-redhat-linux-gnu;source gcc/config.gcc;env' > /tmp/redhat
$ diff -u3 /tmp/youros /tmp/redhat
Es zeigt den unterschied zwischen zwei Target Configurationne an. x86_64-unknown-youros und x86_64-redhat-linux-gnu
-
Ist die fehlermeldung schon von diesem Code?
Ja die Fehlermeldung ist von diesem Code.
Danke für deinen Fix. Ich glaube es funktioniert jetzt. Auf jeden Fall kommt jetzt die nächste Fehlermeldung:
g++ -c -g -O2 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../.././gcc -I../.././gcc/build -I../.././gcc/../include -I../.././gcc/../libcpp/include \
-o build/genpreds.o ../.././gcc/genpreds.c
In file included from ./tm.h:24:0,
from ../.././gcc/genpreds.c:26:
../.././gcc/config/youros.h:13:8: error: attempt to use poisoned "STANDARD_INCLUDE_DIR"
#undef STANDARD_INCLUDE_DIR
^
../.././gcc/config/youros.h:14:9: error: attempt to use poisoned "STANDARD_INCLUDE_DIR"
#define STANDARD_INCLUDE_DIR ="/lib/include"
^
make[1]: *** [build/genpreds.o] Fehler 1
make[1]: Verzeichnis »/home/pascal/Dokumente/cross/src/gcc-5.1.0/host-x86_64-unknown-linux-gnu/gcc« wird verlassen
make: *** [all-gcc] Fehler 2
Was muss ich denn jetzt anstelle von STANDARD_INCLUDE_DIR verwenden? Kann man das irgendwo nachsehen, was man da alles für Makros definieren kann?
Ich danke vielmals für eure Antworten.
-
grep sagt zu dem Makro, das du der einzige bist der es nutzt und
869 /* Other obsolete target macros, or macros that used to be in target
870 headers and were not used, and may be obsolete or may never have
871 been used. */
gcc/config.gcc hat am Anfang eine liste mit variablen und deren Beschreibung. (native_system_header_dir)
-
Habe ich das richtig verstanden, dass in "native_system_header_dir" die Headerdateien der Library meines OS's sein müssen?
Und welche Binaries muss ich jetzt benutzen zum kompilieren? Ich habe nämlich einen bin Ordner und dann und dort sind die Binaries mit dem Namen x86_64-pc-youros-* und dann hab ich noch einen Ordner mit dem Namen x86_64-pc-youros/bin und dort befinden sich nochmal einige Binaries (so wie ich das sehe vor allem von binutils).
Ich danke euch nochmals für eure Antworten.
-
Es hat soweit alles geklappt und ich habe jetzt mal versucht eine kleine Anwendung zu kompilieren und zwar so:
~/Dokumente/test/env/bin/x86_64-pc-youros-gcc -v -o main main.c
Und ich bekomme folgende Fehlermeldung:
/tmp/cci2MKYd.o: In function `thread':
main.c:(.text+0x5): relocation truncated to fit: R_X86_64_32 against `.rodata'
/tmp/cci2MKYd.o: In function `main':
main.c:(.text+0x30): relocation truncated to fit: R_X86_64_32 against `.rodata'
main.c:(.text+0x73): relocation truncated to fit: R_X86_64_32 against symbol `thread' defined in .text section in /tmp/cci2MKYd.o
main.c:(.text+0x7d): relocation truncated to fit: R_X86_64_32 against `.rodata'
main.c:(.text+0x82): relocation truncated to fit: R_X86_64_32 against `.rodata'
main.c:(.text+0x97): relocation truncated to fit: R_X86_64_32 against `.rodata'
/tmp/cci2MKYd.o: In function `parseFile':
main.c:(.text+0x11c): relocation truncated to fit: R_X86_64_32 against `.rodata'
main.c:(.text+0x18d): relocation truncated to fit: R_X86_64_32 against `.rodata'
main.c:(.text+0x1bc): relocation truncated to fit: R_X86_64_32 against `.rodata'
main.c:(.text+0x1cd): relocation truncated to fit: R_X86_64_32 against `.rodata'
collect2: error: ld returned 1 exit status
Ich verstehe aber nicht wieso die .text und die .rodata Sektionen soweit auseinander sein sollten. Bei Binutils habe ich einfach nur elf-x86-64.sh in mein Skript eingebunden und die TEXT_START_ADDRESS geändert. Muss ich da noch mehr ändern?
-
Es sieht so aus als würde er beim linken versuchen 64-Bit Adressen in ein 32-Bit Format zu stopfen.
Hilft ein '-m64' ?
Produziert youros-gcc 64-Bit elf (beim compiliren / linken)?
welches format haben die anderen dateien, gegen die du likst (crt0, oder wie die heißt)
-
Hilft ein '-m64' ?
Nein.
Also meine Emulparams/elf_x86_64_youros.em sieht so aus:
. ${srcdir}/emulparams/elf_x86_64.sh
TEXT_START_ADDR=0x8000000000
Und die elf_x86_64.sh sieht so aus:
. ${srcdir}/emulparams/plt_unwind.sh
SCRIPT_NAME=elf
ELFSIZE=64
OUTPUT_FORMAT="elf64-x86-64"
NO_REL_RELOCS=yes
TEXT_START_ADDR=0x400000
MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
ARCH="i386:x86-64"
MACHINE=
TEMPLATE_NAME=elf32
GENERATE_SHLIB_SCRIPT=yes
GENERATE_PIE_SCRIPT=yes
NO_SMALL_DATA=yes
LARGE_SECTIONS=yes
LARGE_BSS_AFTER_BSS=
SEPARATE_GOTPLT="SIZEOF (.got.plt) >= 24 ? 24 : 0"
IREL_IN_PLT=
# Reuse TINY_READONLY_SECTION which is placed right after .plt section.
TINY_READONLY_SECTION=".plt.bnd ${RELOCATING-0} : { *(.plt.bnd) }"
if [ "x${host}" = "x${target}" ]; then
case " $EMULATION_LIBPATH " in
*" ${EMULATION_NAME} "*)
NATIVE=yes
esac
fi
# Linux/Solaris modify the default library search path to first include
# a 64-bit specific directory.
case "$target" in
x86_64*-linux*|i[3-7]86-*-linux-*)
case "$EMULATION_NAME" in
*64*)
LIBPATH_SUFFIX=64
BNDPLT=yes
;;
esac
;;
*-*-solaris2*)
LIBPATH_SUFFIX=/amd64
ELF_INTERPRETER_NAME=\"/lib/amd64/ld.so.1\"
;;
esac
Alle Objekt Dateien sind 64-bit.
Produziert youros-gcc 64-Bit elf (beim compiliren / linken)?
Ich vermute eher, dass die Sektionen zu weit ausseinander liegen, so dass eine 32-bit relative Addresse nicht mehr ausreicht.
-
Ist das Absicht, dass in deinem Script was von i386 und elf32 steht?
-
Ich dachte das muss so sein. Ich habe folgende Anleitung verwendet:
http://wiki.osdev.org/OS_Specific_Toolchain
-
TEXT_START_ADDR=0x8000000000
Passt nicht in 32-Bit. Also musst du entweder auf die Platzsparende Variante von 32-Bit Adressen verzichten, oder deinen Code wo anders hinlegen.
[edit]
-fpic
könnte aber evtl auch helfen.
-
-fpic
könnte aber evtl auch helfen.
So funktioniert es. Es gibt auf jeden Fall keine Fehlermeldung mehr. Wo muss ich das Einstellen, dass der gcc dieses Flag automatisch einsetzt?
Danke für eure Hilfe.