• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

C++: ld: crti.o: No such file

kevin@mac

Boskop
Registriert
09.02.08
Beiträge
212
Habe per macports den gcc installiert, leider kommt folgende Meldung beim Kompilieren des C++ Programms:
ld -e startup -T sections -o ./build/system ./build/_startup.o crti.o crtbegin.o ./build/_io_port.o ./build/cgastr.o ./build/guardian.o ./build/cgascr.o ./build/keyctrl.o ./build/main.o ./build/o_stream.o ./build/strbuf.o ./build/appl.o crtend.o crtn.o
ld: crti.o: No such file: No such file or directory

Kann mir jemand sagen wo ich die entsprechende crti.o finden kann bzw. installieren kann?
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Welches C++-Programm versuchst Du da zu compilieren? Ein eigenes?

Und wieso hast Du gcc über MacPorts installiert? Reicht der aus Xcode nicht?
 

kevin@mac

Boskop
Registriert
09.02.08
Beiträge
212
Wir haben ein OS von der Uni, welches wir erweitern sollen und dazu muss von Hand per make (Makefile ist von der Uni gegeben) kompiliert und die Bootdisk erstellt werden.
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Und das soll wirklich auf einem Mac funktionieren? Bootdisk?
Die Datei crti.o ist eine Objektdatei und sollte eigentlich vor dem Linker-Aufruf (ld) durch Kompilieren entstanden sein. Gibt es crti.c, crti.cc oder crti.cpp? Hat beim Kompilieren alles geklappt?
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Kann mir jemand sagen wo ich die entsprechende crti.o finden kann bzw. installieren kann?
C++ Programme werden über "g++" gelinkt, wenn man mittels "ld" linkt muß man die diversen Laufzeitbibliotheken von C++ von Hand einbinden.
 

kevin@mac

Boskop
Registriert
09.02.08
Beiträge
212
Die Bootdisk wird per Bochs emuliert.

Nunja das Makefile wurde vorgegeben:
# -----------------------------------------------------------------------------
#
# M A K E F I L E
#
# zum Uebungsbetriebssystem OO-Stubs der Lehrveranstaltung
# 'Betriebssysteme I'.
# -----------------------------------------------------------------------------
# Einstellungen in Abhaengigkeit vom Generierungssystem:
#
# GENSYS: Generierungssystem: Wahlweise 'Linux', 'Win98' oder 'WinNT'
# `WinNT` f�r Windows NT, 2000, XP
# ASMOBJFORMAT: Ausgabeformat fuer den Assembler. Das Format muss dem
# jeweiligen Format des verwendeten C++ Compilers angepasst
# werde, damit gemischte Objektdateien gelinkt werden koennen.
# OBJDIR: Verzeichnis, in dem die Objektdateien abgelegt werden
# sollen.
# DRIVE: Laufwerk, auf das das System-Image geschrieben wird.
# DELETE: Name des Kommandos zum Loeschen von Dateien
# ASM: Zu benutzender Assembler
# CC/CXX: Zu benutzender C/C++-Compiler.
# CFLAGS: Flags fuer den Compileraufruf.
# LD: Zu benutzender Linker.
# LDFLAGS: Flags fuer den Linkeraufruf
# LDLIBS: Dazuzulinkende Bibliotheken
# LDHEAD: Am Anfang zu linkende Dateien
# LDTAIL: Am Ende zu linkende Dateien
GENSYS = Linux
ASMOBJFORMAT = elf
OBJDIR = ./build
ASM = nasm
CC = gcc
CXX = g++
DELETE = rm
LD = ld
OBJCP = objcopy
TCC = gcc

ifeq ($(GENSYS),Linux)
ifneq ($(shell uname),$(GENSYS))
CC = gcc
CXX = g++
LD = ld
MAKE = gmake
OBJCP = i386-elf-objcopy
endif
DRIVE = /dev/fd0
LDHEAD = $(shell $(CXX) --print-file-name=crti.o && $(CXX) --print-file-name=crtbegin.o)
LDTAIL = $(shell $(CXX) --print-file-name=crtend.o && $(CXX) --print-file-name=crtn.o)
else
DRIVE = a:
LDHEAD = $(shell $(CXX) --print-file-name=crtbegin.o)
LDTAIL = $(shell $(CXX) --print-file-name=crtend.o)
C_SOURCES += ../inifini/inifini.c
endif

BOOT = ../boot
TOOLS = ../tools
BOOTDEVICE = 0:80:2:18:0:0:1
USRDIR = $(shell pwd | cut -c-4444)

# Liste der Quelltexte:
ASM_SOURCES = $(shell find . -name "*.asm")
C_SOURCES += $(shell find . -name "*.c")
CC_SOURCES += $(shell find . -name "*.cc")
# -------------------------------------------------------------------------

# Namen der Unterverzeichnisse mit den Quelltexten
# (wird automatisch aus den Quelltextdateien ermittelt und vom Compiler
# benutzt, um die Quelltexte zu finden.)
VPATH = $(sort $(dir $(CC_SOURCES) $(C_SOURCES) $(ASM_SOURCES)))

# Listen mit den Objektdateien, die beim Kompilieren entstehen:
# (werden automatisch aus den Quelltextdateinamen ermittelt)
ASM_OBJECTS = $(patsubst %.asm,_%.o, $(notdir $(ASM_SOURCES)))
C_OBJECTS = $(notdir $(C_SOURCES:.c=.o))
CC_OBJECTS = $(notdir $(CC_SOURCES:.cc=.o))

STARTUP_OBJ = $(OBJDIR)/_startup.o

OBJPRE = $(addprefix $(OBJDIR)/,$(filter-out _startup.o, $(ASM_OBJECTS)) $(C_OBJECTS) $(CC_OBJECTS))
# --------------------------------------------------------------------------

# Regeln zur Erzeugung der Objektdateien
CFLAGS := $(CFLAGS) -fleading-underscore -Wall -I. -fno-exceptions -m32
CXXFLAGS := $(CXXFLAGS) -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32

$(OBJDIR)/%.o : %.c
$(CC) -c $(CFLAGS) -o $@ $<

$(OBJDIR)/%.o : %.cc
$(CXX) -c $(CXXFLAGS) -o $@ $<

$(OBJDIR)/_%.o : %.asm
$(ASM) -f $(ASMOBJFORMAT) -o $@ $<

# -------------------------------------------------
# Default target
all: $(OBJDIR)/bootdisk.vmi

# -------------------------------------------------
# Linken des Systems
$(OBJDIR)/system: $(OBJDIR) $(STARTUP_OBJ) $(OBJPRE)
$(LD) -e startup -T sections -o $(OBJDIR)/system $(LDFLAGS) $(STARTUP_OBJ) $(LDHEAD) $(OBJPRE) $(LDTAIL) $(LDLIBS)

# -------------------------------------------------
# Regel zur Erzeugung des Objektdateiverzeichnisses
$(OBJDIR) :
mkdir $(OBJDIR)

# -------------------------------------------------------------------------
# Ab hier folgt die Definition der targets,
.PHONY: clean depend

# 'system.img' enthaelt die zu ladenden Sections des eigentlichen Systems
$(OBJDIR)/system.img : $(OBJDIR)/system
$(OBJCP) -O binary $< $@

# 'bootdisk.img' besteht aus dem 'system.img', das um den (parametrisierten)
# Bootblock und den Setup-Code erweitert wurde.
$(OBJDIR)/bootdisk.img : $(OBJDIR)/system.img $(TOOLS)/build $(BOOT)/bootsect $(BOOT)/setup
$(TOOLS)/build $(BOOT)/bootsect $(BOOT)/setup $< $(BOOTDEVICE) $@

# 'bootdisk.vmi' ist eine bootdisk, die auf 1.44 MB mit 0 aufgefuellt ist,
# damit VMware damit klarkommt.
$(OBJDIR)/bootdisk.vmi: $(OBJDIR)/bootdisk.img
dd if=$< of=$@ bs=1474560 conv=sync

# 'make depend'
depend:
$(DELETE) -f .depend
$(CC) -MM $(CFLAGS) $(C_SOURCES) | sed -e "s|.*:|$(OBJDIR)\/&|" >> .depend
$(CXX) -MM $(CFLAGS) $(CC_SOURCES) | sed -e "s|.*:|$(OBJDIR)\/&|" >> .depend

# 'make clean' loescht alle Objektdateien, das erzeugte System, Sicherheits-
# kopien des Editors und die Zwischendateien, die bei der Erzeugung von
# Objektdateien aus Assembler-Quelltexten temporaer entstehen.
clean:
@$(DELETE) -f $(OBJDIR)/*.[oO] $(OBJDIR)/*.img $(OBJDIR)/system *~ *.asp *.img
@$(DELETE) -rf ./build

# 'make bootdisk' erzeugt zunaechst das System, falls das noch nicht geschehen
# ist. Danach wird eine Bootdiskette mit dem System erzeugt.
ifeq ($(GENSYS),Linux)
bootdisk: $(OBJDIR)/bootdisk.img
cp $(OBJDIR)/bootdisk.img $(DRIVE)
else
bootdisk: $(OBJDIR)/bootdisk.img
$(TOOLS)/rawrite -f $(OBJDIR)/bootdisk.img -d $(DRIVE) -n
endif

# 'build' tool compilieren.
$(TOOLS)/build: $(TOOLS)/build.c
cd $(TOOLS) && $(TCC) -o $@ $<

# bootsector und protected mode setup code compilieren
$(BOOT)/bootsect $(BOOT)/setup: $(BOOT)/bootsect.asm $(BOOT)/setup.asm
$(MAKE) -C $(BOOT)

# test des erstellten Systems
evaluate: $(OBJDIR)/bootdisk.img
@../bochs/bochs.sh $(OBJDIR)/bootdisk.img
-include .depend
Es existiert keine crti.* im Verzeichnis.
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Kurze Recherche: crti.o gehört zur glibc, sollte also schon irgendwo im System existieren.

Diese Zeile hier
Code:
OBJCP = i386-elf-objcopy
macht mich stutzig. Unter OS X haben Objektfiles das Mach-O Format, kein ELF. Wird diese Umgebungsvariable irgendwo nochmal benutzt? Dann dürfte das Ganze sowieso nicht kompilieren -> neuen OS X-Zweig im Makefile erzeugen?
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Das hört sich danach an, daß es ein Crosscompiler ist.
 

kevin@mac

Boskop
Registriert
09.02.08
Beiträge
212
Ich danke euch,
habe jetzt die Objektdateien gefunden, die noch genutzt werden, bekomme leider folgenden Fehler beim Kompilieren:
mkdir ./build
nasm -f elf -o build/_startup.o startup.asm
nasm -f elf -o build/_io_port.o ./machine/io_port.asm
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/cgastr.o ./device/cgastr.cc
./device/cgastr.cc: In member function ‘virtual void CGA_Stream::flush()’:
./device/cgastr.cc:35: warning: unused variable ‘dif’
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/guardian.o ./guard/guardian.cc
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/cgascr.o ./machine/cgascr.cc
./machine/cgascr.cc: In function ‘void memcpy(void*, const void*, size_t)’:
./machine/cgascr.cc:19: warning: comparison between signed and unsigned integer expressions
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/keyctrl.o ./machine/keyctrl.cc
./machine/keyctrl.cc: In member function ‘void Keyboard_Controller::set_repeat_rate(int, int)’:
./machine/keyctrl.cc:219: warning: statement has no effect
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/main.o main.cc
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/o_stream.o ./object/o_stream.cc
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/strbuf.o ./object/strbuf.cc
g++ -c -fleading-underscore -Wall -I. -fno-rtti -fno-exceptions -m32 -fno-stack-protector -o build/appl.o ./user/appl.cc
ld -e startup -T sections -o ./build/system ./build/_startup.o crti.o crtbegin.o ./build/_io_port.o ./build/cgastr.o ./build/guardian.o ./build/cgascr.o ./build/keyctrl.o ./build/main.o ./build/o_stream.o ./build/strbuf.o ./build/appl.o crtend.o crtn.o
./build/cgastr.o: file not recognized: File format not recognized

Hat jemand eine Idee, warum das Dateiformat falsch sein könnte, ggf. im Makefile behebbar?

P.S. Die zu kompilierenden Dateien sollten funktionieren, das Bootimage auch funktioniert, was bei jemand anderem aus den gleichen Quelldateien erzeugt wurde.
 

applejuicerulez

Golden Delicious
Registriert
12.11.07
Beiträge
9
Bin glaub ich auf der selben Uni wie du in der Vorlesung Betriebssysteme und habs bisher auch nicht auf dem Mac zu laufen gebracht. Wir wären für weitere hinweise echt dankbar:(