Autor Thema: Library und Programme  (Gelesen 17070 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« 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.
« Letzte Änderung: 21. February 2013, 19:10 von OsDevNewbie »
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

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 02. November 2012, 16:01 »
Bist du dir sicher, dass du die Entsprechenden Dateien auch mitlinkst?
Poste doch mal deine Flags.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #2 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.
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

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. November 2012, 14:27 »
  • Ich empfehle, die absoluten Pfade durch relative zu ersetzen.
  • Hast du denn die Library auch gelinkt? -L gibt nur den Suchpfad für die fertige Library (lib<name>.a) an, linken und einbinden (mittels -l) musst du sie selber.
« Letzte Änderung: 03. November 2012, 21:19 von tiger717 »

OsDevNewbie

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

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 03. November 2012, 21:18 »
ld -o lib<name>.a <Objektdateien>, würde ich mal sagen.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #6 am: 04. November 2012, 02:05 »
Und wie muss ich Eclipse einstellen, dass es nicht 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

Jidder

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

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 04. November 2012, 17:33 »
Libraries werden übrigens mit ar erstellt, nicht mit ld.
Wieder was gelernt.

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #9 am: 06. November 2012, 18:16 »
Danke für deine Hilfe. Ich werde es demnächst mal ausprobieren.
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

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #10 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 ;).
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

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #11 am: 16. February 2013, 00:28 »
Hat denn keiner eine Idee?
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 #12 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.
Dieser Text wird unter jedem Beitrag angezeigt.

Martin Erhardt

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

OsDevNewbie

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

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #16 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?
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 #17 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)
Dieser Text wird unter jedem Beitrag angezeigt.

OsDevNewbie

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

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #19 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:
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

 

Einloggen