Autor Thema: Funktionsaufrufen von Programmen  (Gelesen 5590 mal)

pgahlen

  • Gast
Gespeichert
« am: 12. July 2010, 18:56 »
Also ich denke gerade mal etwas weiter, da ich meinen Kernel gerade ziemlich gelungen finde, und deswegen wollte ich ihn jetzt so umbauen, dass er Programme laden kann.

Wie ich nun Programme lade ist mir eigentlich klar, ich baue es einfach so, als wenn das Programm als Modul geladen wird.

Nun stellt sich mir aber die Frage wie ein Programm z.B. auf scanf des kernels zugreifen kann.

Ich weiss, das es bei Linux so etwas wie Librarys gibt, in denen die Funktionen stehen. Also eigentlich wie DLLs unter Windows.

Also könnte ich ja so etwas auch machen, die Frage ist nur wie, muss ich diese dann auch laden, und woher weiss ein Programm wo die Library ist?

danke aber schon mal an alle die sich die Mühe machen zu antworten!!!

Programm Noob

  • Gast
Gespeichert
« Antwort #1 am: 12. July 2010, 20:27 »
Moin

Shared Libarys, so nennt man das, was du vorhast wirst du noch nicht hinbekommen. Implmentiere ein paar Syscalls für die Speicherverwaltung und static libarys für die Funktionen. Das würde ich für den Anfnag empfehlen. zu Sycalls einfach OS-DEV für Einsteiger Teil 8 Lesen.

Programm Noob

pgahlen

  • Gast
Gespeichert
« Antwort #2 am: 13. July 2010, 15:16 »
Ok das habe ich jetzt so weit gemacht mit  den Syscalls, klappt auch alles.

Nun stellt sich mir nur die Frage was sind stytic librarys, ok was das ist kann ich mir vorstellen, aber wie mache ich so eine?

Und was muss ich da reinschreiben.

Ich meine es würde ja auch alles über syscalls machbar sein, aber ich finde es ziemlich mühsam für jeden einzelnen Buchstaben eine ganze Assemblerreihe zu schreiben.

Danke aber schon mal an Programm Noob

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 13. July 2010, 15:23 »
Statische Bibliotheken sind in .a-Dateien. Das ist eigentlich ein Archiv (erstellt mit ar), das .o-Dateien enthält. Wenn du eine .a-Datei dazulinkst, nimmt er sich automatisch alle Objektdateien aus dem Archiv, die er eben so braucht, um die Binary zu bauen.

Das heißt, du schreibst ein paar Funktionen, kompilierst die Dateien (ohne sie zu linken), packst alles zusammen in eine libc.a und linkst diese libc.a zu jedem Programm dazu.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

pgahlen

  • Gast
Gespeichert
« Antwort #4 am: 13. July 2010, 15:35 »
Ah ok danke hat alles geklappt.

pgahlen

  • Gast
Gespeichert
« Antwort #5 am: 13. July 2010, 19:04 »
Also das kompilieren und zusammenpacken hat geklappt.

Wenn ich nun aber versuche die Library zu verlinken, kommt eine Meldung, das das linken nicht möglich ist.
folglich kann die Funktion im Programm auch nicht aufgelöst werden.

Ich habe jetzt nur die .o Dateien in die Library gepackt, muss ich die .c und .h Dateien auch da reinpacken?

Und wen ja kann ich in der Library iergendwie Ordner anlegen, weil sonst wirds ja iergendwann unübersichtlich?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. July 2010, 19:14 »
Soweit ich mich da auskenne, hast du für jede einzelne Funktion eine .o im Archiv, meist mit dem Namen der Funktion (z.B. printf.o).

Eine Ordnerstruktur ist m.W. nicht möglich, aber dafür kannst du ja verschiedene Libraries erzeugen.

Hast du beim Linken sowohl den Ordner mit der Library (libxyz.a) mit "-L" angegeben, als auch die Library selbst (-lxyz) ?

Die .c und .h sollten in der Library nichts zu suchen haben, weil das die Quelltext sind.

pgahlen

  • Gast
Gespeichert
« Antwort #7 am: 13. July 2010, 19:21 »
Öhm nein hatte ich noch nich.
Das lag aber daran, dass ich mich mit Librarys noch gar nicht auskenne.
So langsam verstehe och aber wie das funktionieren soll.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. July 2010, 21:30 »
Soweit ich mich da auskenne, hast du für jede einzelne Funktion eine .o im Archiv, meist mit dem Namen der Funktion (z.B. printf.o).
Das hängt davon ab, welche Objektdateien du reinpackst. Diese Aufteilung steht dir völlig frei. Es ist nur sinnvoll, pro Funktion eine Datei zu machen, weil Objektdateien ganz oder gar nicht gelinkt werden. Indem man die einzelnen Objektdateien klein hält, vermeidet man also, unnötige Funktionen in die Binary einzubauen.

Zitat
Hast du beim Linken sowohl den Ordner mit der Library (libxyz.a) mit "-L" angegeben, als auch die Library selbst (-lxyz) ?
Ist nicht unbedingt nötig, wenn man direkt die .a-Datei angibt. Aber vielleicht ist es mit -l schöner.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Programm Noob

  • Gast
Gespeichert
« Antwort #9 am: 13. July 2010, 21:56 »
Schön das ich dir helfen konnte.

Hir mal mein makefile von meiner libc.
SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = i586-elf-gcc
AR = i586-elf-ar

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -ffreestanding -fno-stack-protector -nostdinc -I include
ARFLAGS = -rcs

libc: $(OBJS)
$(AR) $(ARFLAGS) libc.a $^

%.o: %.S
$(CC) $(ASFLAGS) -c -o $@ $^

%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^

clean:
rm $(OBJS)

.PHONY: clean

Vieleicht kannst du ja damit was anfangen.

Programm Noob

pgahlen

  • Gast
Gespeichert
« Antwort #10 am: 14. July 2010, 11:51 »
Ah ok so langsam verstehe ich das ganze etwas besser.

Das Problem bei mir war wahrscheinlich das ich anstatt -rcs nur -r genommen habe.

Bei dem Makefile fällt mir auf das du i586-elf-ar genommen hast, hat das eine Bedeutung weil bei ar --help steht bei mir das so etwas nur als Zusatz gilt?

Programm Noob

  • Gast
Gespeichert
« Antwort #11 am: 14. July 2010, 13:19 »
Moin

Da ich unter Windows arbeite benutze ich einen crosscompiler so wie er auch im Wiki zu finden ist. Auch gcc, g++, ld usw. haben alle i586-elf- davor.

Unter Welchen OS entwickelst du den?

Programm Noob

PS Du kannst gerne mal in den IRC Channel #NandOS @ irc.euirc.net kommen.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 14. July 2010, 13:28 »
PS Du kannst gerne mal in den IRC Channel #NandOS @ irc.euirc.net kommen.
Versuchst du, die deutsche Community so übers IRC zu verteilen, dass man garantiert nicht alle auf einmal erreichen kann? ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Programm Noob

  • Gast
Gespeichert
« Antwort #13 am: 14. July 2010, 13:34 »
PS Du kannst gerne mal in den IRC Channel #NandOS @ irc.euirc.net kommen.
Versuchst du, die deutsche Community so übers IRC zu verteilen, dass man garantiert nicht alle auf einmal erreichen kann? ;)

taljeth da swürde ich doch niemals versuchen wollen. aber um jemanden etwas in Ruhe erklären ist #Lost zum teil zu voll.

Programm Noob

pgahlen

  • Gast
Gespeichert
« Antwort #14 am: 14. July 2010, 14:52 »
also ich entwickle unter Ubuntu 10.10 Alpha 1.
Ist iergendwie das schnellste auf meinem alten PC.

Leider funktioniert es immer noch nicht so ganz.

meine LDLFLAGS im Programm, das ich mit der Library linken will , sehen folgendermassen aus:
-melf_i386 -Test.ld -L ../../lib/ -l libvideo.a

Er sagt nur immer das er die libvideo a nicht finden kann.

Ich habe auch schonmal die libvideo.a in den Ordner das Programms verschoben, in einen Unterordner lib/ und habe dann die Flags so geschrieben:
-melf_i386 -Test.ld -L lib/ -l libvideo.a

selbst mit -l video.a hab ichs versucht.

genau das gleiche.

Originalton des Linkers:
ld: cannot find -lvideo

so langsam verzweifle ich

Ich werde gleich mal versuchen das aus nem alten Linux Kernel auszulesen, wie das dort gelöst wurde.

Wenn euch was auffällt helft mir bitte.

Danke aber schonmal für die Antworten davor!

Programm Noob

  • Gast
Gespeichert
« Antwort #15 am: 14. July 2010, 15:19 »
adde mich mal bei ICQ

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 14. July 2010, 15:37 »
Wenn du libvideo.a mitlinken willst, kannst du entweder die .a-Datei direkt angeben (so wie ich das vorgeschlagen hatte):
gcc -o foo foo.c lib/libvideo.a
Oder aber du nimmt -l und gibst nur noch den Namen ohne lib und .a an:
gcc -o foo foo.c -L lib -lvideo
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen