Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: OsDevNewbie am 16. March 2015, 15:12

Titel: GCC für OS compilieren
Beitrag 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.
Titel: Re: GCC für OS compilieren
Beitrag von: kevin am 16. March 2015, 15:55
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 17. March 2015, 00:21
Danke für deine Antwort.
Muss ich dann einfach die Anweisungen in diesem Artikel (http://www.lowlevel.eu/wiki/Cross-Compiler) befolgen?
Titel: Re: GCC für OS compilieren
Beitrag von: kevin am 17. March 2015, 09:23
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 17. March 2015, 12:21
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?
Titel: Re: GCC für OS compilieren
Beitrag von: kevin am 17. March 2015, 14:08
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 16. April 2015, 09:14
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.
Titel: Re: GCC für OS compilieren
Beitrag von: kevin am 16. April 2015, 13:14
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 17. April 2015, 12:13
Das heisst, wenn meine libc posix conform wäre, dann bräuchte ich die newlib nicht?
Titel: Re: GCC für OS compilieren
Beitrag von: kevin am 17. April 2015, 13:54
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).
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 19. April 2015, 00:15
Also könnte ich auch meine eigene libc verwenden?
Titel: Re: GCC für OS compilieren
Beitrag von: Svenska am 19. April 2015, 12:56
Wenn du deine eigene libc verwendest, dann hast du keine newlib. Und ja, das funktioniert natürlich auch.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 20. April 2015, 12:42
Die libc mit der man gcc compiliert, ist die dann auch die libc, mit der gcc dann die Programme compiliert?
Titel: Re: GCC für OS compilieren
Beitrag von: micha am 22. April 2015, 00:23
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 01. May 2015, 00:43
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.
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 01. May 2015, 13:13
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:
Zitat
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 10. July 2015, 22:27
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.
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 10. July 2015, 22:55
Wo sollten diese definiert sein?
Kennst du grep?

grep -r ASM_BYTE ${GCC_SOURCE_FOLDER}
grep -r "i386/att.h" ${GCC_SOURCE_FOLDER}
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 11. July 2015, 02:47
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.
Titel: Re: GCC für OS compilieren
Beitrag von: Jidder am 11. July 2015, 04:46
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?
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 11. July 2015, 12:40
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.

Code: (gcc/config.gcc) [Auswählen]
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     ;;
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 12. July 2015, 02:21
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.])
    ;;
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 12. July 2015, 11:42
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
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 12. July 2015, 14:05
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.
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 12. July 2015, 14:18
grep sagt zu dem Makro, das du der einzige bist der es nutzt und
Code: (gcc/system.h) [Auswählen]
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)
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 18. July 2015, 02:38
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 25. July 2015, 15:31
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?
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 25. July 2015, 17:13
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)

Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 26. July 2015, 00:26
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.
Titel: Re: GCC für OS compilieren
Beitrag von: Svenska am 26. July 2015, 01:09
Ist das Absicht, dass in deinem Script was von i386 und elf32 steht?
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 26. July 2015, 02:54
Ich dachte das muss so sein. Ich habe folgende Anleitung verwendet:
http://wiki.osdev.org/OS_Specific_Toolchain
Titel: Re: GCC für OS compilieren
Beitrag von: MNemo am 26. July 2015, 12:50
Zitat
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.
Titel: Re: GCC für OS compilieren
Beitrag von: OsDevNewbie am 26. July 2015, 23:48
-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.