Autor Thema: GCC für OS compilieren  (Gelesen 30801 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 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 ein bisschen abschauen, was man am gcc patchen muss, damit man das Target für sein OS bekommt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 am: 17. March 2015, 00:21 »
Danke für deine Antwort.
Muss ich dann einfach die Anweisungen in diesem Artikel befolgen?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #4 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?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #6 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #8 am: 17. April 2015, 12:13 »
Das heisst, wenn meine libc posix conform wäre, dann bräuchte ich die newlib nicht?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 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).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #10 am: 19. April 2015, 00:15 »
Also könnte ich auch meine eigene libc verwenden?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 19. April 2015, 12:56 »
Wenn du deine eigene libc verwendest, dann hast du keine newlib. Und ja, das funktioniert natürlich auch.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #12 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?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #13 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.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #14 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #15 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.
« Letzte Änderung: 01. May 2015, 13:16 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #16 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #17 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}
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #18 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #19 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?
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen