Lowlevel

Lowlevel => Softwareentwicklung => Thema gestartet von: OsDevNewbie am 02. November 2012, 13:57

Titel: Library und Programme
Beitrag von: OsDevNewbie am 02. November 2012, 13:57
Hallo Community,
ich habe jetzt mein Programm (die Shell) von meinem Kernel getrennt. Dabei habe ich auch die User-Library aus dem Kernel genommen und in einen seperaten Ordner geschoben. Ich wollte nun mein Programm, mit der neuen Konstellation compilieren, und da gibt der Linker tonnenweise Fehler aus. Diese Fehler lauten in etwa so: "undefined reference to `malloc'" oder der entsprechenden Funktion in der Library.
Ich programmiere mit Eclipse und ich habe dort auch eingestellt, dass der Compiler den Lib-Ordner includen soll und dem Linker habe ich auch gesagt, dass er in diesem Ordner suchen soll. Aber die Fehlermeldungen bleiben. Beim Aufruf der eclipseinternen Konsole habe ich herausgefunden, dass der Linker auch "_start" nicht findet, obwohl ich diese Datei auch include. Was muss ich genau wie einstellen?
Ich danke euch schonmal im Voraus.
Titel: Re: Library und Programme
Beitrag von: tiger717 am 02. November 2012, 16:01
Bist du dir sicher, dass du die Entsprechenden Dateien auch mitlinkst?
Poste doch mal deine Flags.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 02. November 2012, 23:11
Die Flags lauten:
gcc
-nostdinc -I"/home/[username]/Dokumente/YourOS/User/Programs/Terminal/V0.1" -I/home/[username]/Dokumente/YourOS/User/ -I/home/[username]/Dokumente/YourOS/User/Lib/V0.1 -O0 -g3 -w -Wall -Wextra -c -fmessage-length=0 -m64 -ffreestanding

ld
-nostartfiles -nodefaultlibs -nostdlib -static -L/home/[username]/Dokumente/YourOS/User/Lib/V0.1 -T../../../../program.ld -z max-page-size=0x1000

as
-64

[username] steht dabei für den Benutzer, unter dem ich arbeite.
Titel: Re: Library und Programme
Beitrag von: tiger717 am 03. November 2012, 14:27
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 03. November 2012, 19:31
Hi,
also die Library ist nicht gelinkt. Sie liegt als Quelltext vor. Was muss ich einstellen, dass ich sie mit dem Programm mitcompilieren kann oder was muss ich tun um die Library zu linken?
Titel: Re: Library und Programme
Beitrag von: tiger717 am 03. November 2012, 21:18
ld -o lib<name>.a <Objektdateien>, würde ich mal sagen.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 04. November 2012, 02:05
Und wie muss ich Eclipse einstellen, dass es nicht compiliert?
Titel: Re: Library und Programme
Beitrag von: Jidder am 04. November 2012, 03:25
Und wie muss ich Eclipse einstellen, dass es nicht compiliert?
Die meisten hier im Forum verwenden keine IDEs, um ihre Projekte zu erstellen, sondern Makefiles. Die Frage ist deswegen vermutlich besser in einem Eclipse-Forum aufgehoben.

Libraries werden übrigens mit ar erstellt, nicht mit ld.
Titel: Re: Library und Programme
Beitrag von: tiger717 am 04. November 2012, 17:33
Libraries werden übrigens mit ar erstellt, nicht mit ld.
Wieder was gelernt.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 06. November 2012, 18:16
Danke für deine Hilfe. Ich werde es demnächst mal ausprobieren.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 14. February 2013, 00:17
Also ich habe mir jetzt ein Makefile zusammengestellt und mir dabei ein Makefile von prettyos als Vorlage genommen, da ich mich nicht genug mit Makefile-Syntax auskenne aber in gut interpretieren kann. Hier ist mein Makefile:
RM= rm -f
NASM= nasm
CC= gcc
AR= ar

ifeq ($(COMPILER),CLANG)
CC= clang
endif

# Folders
STDLIBC= ./V0.1
OBJDIR= .

# Compiler-/Linker-Flags
NASMFLAGS= -Ox -f elf
ifeq ($(COMPILER),CLANG)
CCFLAGS= -c -std=c99 -march=i486 -Wshadow -m64 -Werror -Wall -ffunction-sections -fdata-sections -O -ffreestanding -nostdinc -fno-builtin -fno-stack-protector -fomit-frame-pointer -fno-common -Iinclude -Xclang -triple=i386-pc-unknown
else
CCFLAGS= -c -std=c99 -march=i486 -Wshadow -m64 -Werror -Wall -ffunction-sections -fdata-sections -O -ffreestanding -nostdinc -fno-pic -fno-builtin -fno-stack-protector -fomit-frame-pointer -fno-common -Iinclude
endif
ARFLAGS= rs

TARGET= YourOSlibc.a

# targets to build one asm or c-file to an object file
vpath %.o $(OBJDIR)
%.o: %.c
$(CC) $< $(CCFLAGS) -I$(STDLIBC) -o $(OBJDIR)/$@
#%.o: %.asm
# $(NASM) $< $(NASMFLAGS) -o $(OBJDIR)/$@

# dependancies
TARGETOBJ := $(patsubst %.c, %.o, $(wildcard *.c))
 #$(patsubst %.asm, %.o, $(wildcard *.asm))

# targets to build the userprog
.PHONY: clean all

all: $(TARGET)

$(TARGET): $(TARGETOBJ)
$(AR) $(ARFLAGS) $(TARGET) $(addprefix $(OBJDIR)/,$(TARGETOBJ))

clean:
$(RM) $(OBJDIR)/*.o
Es erstellt zwar die YourOS.a-Datei, aber die ist nur 8 Bytes gross und wenn ich damit meine Konsole compilieren will meldet ld:
/usr/bin/ld: cannot find -l/home/[username]/Dokumente/YourOS/User/Lib/YourOSlibc.a
[username] steht für den Benutzer unter dem ich Arbeite.

Ich verstehe das nicht wieso findet ld die Datei nicht, wenn sie doch vorhanden ist? Liegt das daran, dass sie nur 8 Bytes gross ist? Ich glaube nämlich nicht, dass eine statische Library nur 8 Bytes gross ist oder?
Ich danke euch für eure Antworten schon im Voraus, wenn ihr nichts dagegen einzuwenden habt ;).
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 16. February 2013, 00:28
Hat denn keiner eine Idee?
Titel: Re: Library und Programme
Beitrag von: Jidder am 16. February 2013, 01:20
8 Bytes sieht nach einem leeren Archiv aus. Eventuell findet die Makefile und/oder ar die Objektdateien nicht, weil sie nicht existieren oder die Pfade in der Makefile nicht stimmen.
Titel: Re: Library und Programme
Beitrag von: Martin Erhardt am 16. February 2013, 01:32
Wenn du noch absolute pfade findest dann solltest du die wie besagt durch relative ersetzen, weil man bei langen normalen gern mal was vergisst  :-)
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 16. February 2013, 02:40
Also eigentlich sind nur relative Pfadangaben vorhanden.
Wie kann ich kontrollieren, ob gcc die Dateien findet und sie auch compiliert? Kann man da eine Ausgabe machen lassen?
Danke.
Titel: Re: Library und Programme
Beitrag von: Svenska am 16. February 2013, 03:14
Mit make -n führst du die Befehle nicht aus, sondern lässt sie dir nur anzeigen. Dann siehst du, was make genau ausführt.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 16. February 2013, 16:19
Komischerweise wird nur ar rs YourOSlibc.a ausgeführt. Warum compiliert er denn die Lib nicht?
Da steht doch als Abhängigkeit die Objektdateien drinnen oder nicht?
Titel: Re: Library und Programme
Beitrag von: Jidder am 16. February 2013, 16:56
Liegen die .c-Dateien in dem Verzeichnis, in dem du mit der Shell bist, wenn du make aufrufst?

Außerdem (möglicherweise im Zusammenhang damit) ist es ein Problem, dass du make einerseits mit %.o: %.c sagst, dass die .o-Dateien im selben Verzeichnis wie die .c-Dateien landen, aber andererseits werden die mittels -o $(OBJDIR)/$@ doch woanders hingetan. Das führt zu Problemen.

Änder mal die Zuweisung von TAROBJECT in
TARGETOBJ := $(addprefix $(OBJDIR)/,$(patsubst %.c, %.o, $(wildcard *.c)))
Und den Aufruf von AR nach
$(AR) $(ARFLAGS) $(TARGET) $(TARGETOBJ)
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 16. February 2013, 19:08
Also die *.c-Dateien befinden sich in einem Unterordner, von dem aus Make Objek-Dateien im aktuellen Ordner erstellen soll. Diese werden aber später dann wieder gelöscht.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 18. February 2013, 15:18
Also ich habe es jetzt geschafft, die Library zu linken, indem ich einfach die Make-Datei in den Ordner mit dem Source-Code geschoben habe und sie dort ausgeführt habe. Jetzt wurde die Library erstellt, aber wenn ich jetzt ein Programm an diese Lib linken möchte, meckert der Linker, dass er die Library nicht findet. Ich übergebe im den absoluten Pfad zur Lib mit dem Parameter "-l". Auch relative Pfadangaben funktionieren nicht. Ich habe verschiedene Optionen auisprobiert, aber keine hat funktioniert. Ich verzweifle noch  :cry:
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 21. February 2013, 19:09
Hat denn keiner eine Idee woran es liegen könnte :?
Titel: Re: Library und Programme
Beitrag von: kevin am 23. February 2013, 11:25
Wenn du eine statisch Bibliothek namens libfoo.a dazulinken willst, dann kannst du entweder libfoo.a ohne irgendeine Option davor angeben oder -lfoo. Wenn die Bibliothek einen bestimmten Pfad braucht, kannst du den mit -L in den Suchpfad aufnehmen und -l durchsucht den dann für jede Bibliothek. Wenn du sagst -llibfoo.a dann durchsucht der Linker den Suchpfad nach einer Bibliothek namens liblibfoo.a.a, was vermutlich nicht das ist, was du wolltest.

Mit --verbose hätte er dir das wahrscheinlich auch alles selber gesagt.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 23. February 2013, 13:56
Danke für den Tipp, aber es funktioniert immer noch nicht.
Ich habe mal das --verbose rein getan und dort konnte ich herauslesen, dass er die Lib im Ordner /usr/lib sucht. Aber ich übergebe ihm doch einen anderen Lib-Ordner und sage ihm auch er solle keine Standard-Lib verwenden. Hier die Konsolenausgabe und die Flags:
make all
Building target: V0.1
Invoking: GCC C Linker
gcc -nostartfiles -nodefaultlibs -nostdlib -static -L/home/[USERNAME]/Dokumente/YourOS/User/Lib/ -T../../../../program.ld -z max-page-size=0x1000 --verbose -o "V0.1"  ./main.o   -lYourOSlibc
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.3/:/usr/lib/gcc/x86_64-linux-gnu/4.4.3/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.3/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.4.3/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.4.3/:/usr/lib/gcc/x86_64-linux-gnu/4.4.3/:/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../:/lib/:/usr/lib/:/usr/lib/x86_64-linux-gnu/
COLLECT_GCC_OPTIONS='-nostartfiles' '-nodefaultlibs' '-nostdlib' '-static' '-L/home/[USERNAME]/Dokumente/YourOS/User/Lib/' '-T../../../../program.ld' '-z' 'max-page-size=0x1000' '-v' '-o' 'V0.1' '-mtune=generic'
 /usr/lib/gcc/x86_64-linux-gnu/4.4.3/collect2 --build-id -m elf_x86_64 --hash-style=both -static -o V0.1 -z relro -z max-page-size=0x1000 -L/home/[USERNAME]/Dokumente/YourOS/User/Lib/ -L/usr/lib/gcc/x86_64-linux-gnu/4.4.3 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.3 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../.. -L/usr/lib/x86_64-linux-gnu ./main.o -lYourOSlibc -T../../../../program.ld
/usr/bin/ld: cannot find -lYourOSlibc
collect2: ld returned 1 exit status
make: *** [V0.1] Fehler 1
Danke.
Titel: Re: Library und Programme
Beitrag von: kevin am 23. February 2013, 18:25
Deine Bibliothek heißt libYourOSlibc.a?
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 24. February 2013, 13:46
Nö sie heisst "YourOSlibc.a"
Titel: Re: Library und Programme
Beitrag von: Svenska am 24. February 2013, 14:39
Dann hast du das Problem gefunden.
Mit "-lblub" wird eine Datei mit dem Namen libblub.a gesucht.
Titel: Re: Library und Programme
Beitrag von: OsDevNewbie am 26. February 2013, 17:49
Ah, danke jetzt funktioniert es  :lol:. Aber warum funktioniert denn mein Makefile nicht, wenn der Sourcecode der Lib in einem Unterordner liegt?