Autor Thema: Task nach ausführung beenden  (Gelesen 6217 mal)

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« am: 25. June 2011, 13:13 »
Guten Tag,
also ich habe bereits funktionierendes Multitasking im meim System, kann Module laden und Syscalls ausführen.
Eine Sache bleibt mir aber Schleierhaft:
Wenn ich am ende, sagen wir einer Mainfunktion bin, würde ich jetzt mal sagen, dass ein Programm wenn es lieb ist, am ende exit(EXIT_CODE); aufruft. Aber da ich davon ausgehen kann, das nicht jedes Programm so lieb ist und dass die funktion durch einen Return auch nicht wieder woanders hinspringen wird (da ich sie ja nicht als Funktion aufrufe sondern sie nur "Missbrauche" als Symbol.), was ich mache, wenn es nicht aufgerufen wird ohne gleich eine GPF zu bekommen, weil der Prozessor versucht Daten auszuführen?

Lieben Gruß, Sebi2020
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. June 2011, 13:38 »
Doch, du kannst davon ausgehen, dass jeder Programm lieb ist, weil jedes Programm deine libc benutzt, und der Einsprungspunkt in der libc liegt. Ein Programm geht ja in Wirklichkeit nicht bei main() los, sondern bei _start(). Das ist eine Funktion, die erstmal alles mögliche initialisiert, was die libc so brauchen kann, dann main() aufruft und am Ende eben den Syscall zum Beenden.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #2 am: 25. June 2011, 16:44 »
Okay, das macht soweit Sinn, nur hänge ich dann wieder mit diesem ar Tool. DAs klappt soweit alles, das packen der Objectdateien. Aber wenn es dann darum geht, dass der Linker sie auch dazu linkt, sieht das dann ungefähr so aus:
/home/sebastian/Desktop/Infortus-OS/apps/TestModul/mod.c:6: undefined reference to `print'Habs auch schon mit dem L-Schalter von ld probiert. Aber irgendwie meckert er weiter.
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 25. June 2011, 16:51 »
Versuch mal die Reihenfolge der ld-Parameter umzudrehen, die spielt nämlich eine Rolle. Oder du kannst mit --start-group und --end-group außenrum bewirken, dass er grundsätzlich alles durchsucht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #4 am: 25. June 2011, 16:58 »
Hm, ich glaube, aber ich hab auch irgendwas vielleicht beim Packen falsch gemacht. Ich kenn mich mit ar nicht so gut aus.

Hier mal die Parameter, wie ich sie übergebe:
ld -m elf_i386 -L "lib/libc.a" -T link.ld mod.o -o test.mod
Um das ar-Archiv zu erstellen habe ich folgendes Kommando genommen:
ar cr lib/libc.a lib/o/stdio.o lib/o/string.o
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. June 2011, 17:01 »
Ich benutze immer "ar rs ...", versuch mal, das s dazuzunehmen.

Und bist du sicher, dass das mit dem -L so tut? Ich kenne das nur so, dass man die Lib direkt angibt, ohne Option.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #6 am: 25. June 2011, 17:09 »
Habs jetzt mal so probiert, wie du gesagt hast. Also der aufruf von ld heist jetzt:
ld -m elf_i386 -T link.ld lib/libc.a mod.o -o test.modUnd ar hab ich jetzt so aufgerufen:
ar rs lib/libc.a lib/o/string.o lib/o/stdio.oDie Header Dateien habe ich übrigens auch genauso benannt, halt mit h am ende.
Was ich mich noch frage ist, ob ich extern angeben muss in den Headern. Das hab ich nämlich
auch schon probiert, bin dadurch aber auch nicht weiter gekommen.
Weil, wenn ich so gelinkt habe (also direkt die objekte ohne archiv) musste ich das nicht.

Oder kompiliere ich die Objekte falsch? Ich kompiliere sie genauso wie den Rest:
gcc -Wall -m32 -ffreestanding -nostdinc - c [QUELLDATEI] ... usw
Oder vielleicht fehlt was in meinem Linkerscript?:

OUTPUT_ARCH("i386:i386")
OUTPUT_FORMAT("elf32-i386")
ENTRY(main)
SECTIONS {
. = 0x200000;
.text : {
*(.text)
}
.data : ALIGN(4096) {
*(.data)
}
.rodata : ALIGN(4096) {
*(.rodata)
}
.bss : ALIGN(4096) {
*(.bss)
}
}
« Letzte Änderung: 25. June 2011, 17:21 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 25. June 2011, 17:41 »
Hast du schon (wie anfangs vorgeschlagen) ausprobiert, die Library ans Ende des Linkeraufrufs zu stellen?
Dieser Text wird unter jedem Beitrag angezeigt.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #8 am: 25. June 2011, 18:11 »
Ich hatte erst nur den -L parameter verschoben. Aber das wars. ich hab die bib nach die mod.o hingeschrieben und jetzt gehts!
Super! Danke
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

 

Einloggen