Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: KtmnjjpfjsFvzG am 21. January 2013, 21:44

Titel: File not found
Beitrag von: KtmnjjpfjsFvzG am 21. January 2013, 21:44
Ich habe bis jetzt C usw. nur in einem "Compiler+Editor-Paket" genutzt.

Jetzt habe ich mit diesen makefiles so meine Probleme: SRCS = $(shell find -name '*.[cS]') funktioniert nicht, es kommt "File not found", obwohl ich eine .c und eine .S-Datei habe...

Was mache ich falsch?
Titel: Re: File not found
Beitrag von: kevin am 21. January 2013, 22:13
Kannst du mal die genaue und vollständige Fehlermeldung und deine Makefile posten?
Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 21. January 2013, 22:18
SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc
LD = ld

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -melf_i386 -Ttext=0x100000

kernel: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

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

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

clean:
rm $(OBJS)

.PHONY: clean

Dann kommt das: :(
Z:\Users\C\Desktop\OS\OS>make -f Makefile
File not found - *.[cS]
ld -melf_i386 -Ttext=0x100000 -o kernel
process_begin: CreateProcess(NULL, ld -melf_i386 -Ttext=0x100000 -o kernel, ...)
 failed.
make (e=2): The system cannot find the file specified.
make: *** [kernel] Error 2

Bin schon ganz am Anfang gescheitert :(
Titel: Re: File not found
Beitrag von: kevin am 21. January 2013, 22:32
Ich schätze, dass das heißt, dass make deinen ld nicht finden kann. Heißt der wirklich ld und liegt auch im Suchpfad? Wenn du auf der Kommandozeile im gleichen Verzeichnis statt 'make' mal 'ld' eingibst, bekommst du das erwartete Ergebnis?
Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 21. January 2013, 22:44
Danke :) Er heißt ld.exe.

Blöderweise kommt jetzt "No input files"

SRCS = $(shell find -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS)))

CC = gcc.exe
LD = ld.exe

ASFLAGS = -m32
CFLAGS = -m32 -Wall -g -fno-stack-protector -nostdinc
LDFLAGS = -mi386pe -Ttext=0x100000

kernel: $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^

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

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

clean:
rm $(OBJS)

.PHONY: clean

Z:\Users\C\Desktop\OS\OS>make -f Makefile
File not found - *.[cS]
ld.exe -mi386pe -Ttext=0x100000 -o kernel
ld.exe: no input files
make: *** [kernel] Error 1

Was da los?
Titel: Re: File not found
Beitrag von: Jidder am 21. January 2013, 23:13
Ich vermute du hast das coreutils-Tool find nicht installiert. Ich glaube die Fehlermeldung "File not found - *.[cS]" kommt vom Windows find. Hast du MSYS installiert? Da sollte es eigentlich dabei sein.
Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 21. January 2013, 23:25
Puh... wie viel muss man denn da noch installieren? kann ich das nicht einfacher machen? Ohne soeiner file-suche? Es wäre doch erstmal unproblematisch, die ->2<- Dateien da manuell einzutragen...

Nur hab ich keine Ahnung, wie das geht :(
Titel: Re: File not found
Beitrag von: Jidder am 21. January 2013, 23:40
Manuell kannst du da einfach die Pfade eintragen. Also die SRCS-Zeile so ändern.
SRCS = foo.c bar.S
Make kann auch selbst nach Dateien suchen (aber macht es nicht automatisch in Unterverzeichnissen):
SRCS = $(wildcard *.c *.S)
Unterverzeichnisse musst du selbst angeben:
SRCS = $(wildcard *.c *.S kernel/*.c kernel/*.S etc/*.c etc/*.S)
Oder du beschäftigst dich mit den Makrofunktionen von make (http://www.gnu.org/software/make/manual/make.html)

Puh... wie viel muss man denn da noch installieren?
Noch viel mehr. Dein Compiler ist nämlich ein Windows-Compiler (hat PE als Target). Damit kommst du nicht weit. Du brauchst einen Crosscompiler (mit ELF als Target). Den kannst du entweder downloaden (http://www.lowlevel.eu/wiki/Crosscompiler_f%C3%BCr_Windows) oder selbst bauen (http://www.lowlevel.eu/wiki/Cross-Compiler). Ein Linux tut es auch.
Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 21. January 2013, 23:58
Gut, das funktioniert schonmal, Danke :)

Hab den Compiler gegen den aus deinem Link einfach mal ausgetauscht, ändert jetzt erstmal nichts an der funktionsweise und daran, dass es immernoch nicht geht, es kommt jetzt nämlich Z:\Users\C\Desktop\OS\OS>make -f Makefile
gcc.exe -m32 -c -o start.o start.S
gcc.exe: CreateProcess: No such file or directory
make: *** [start.o] Error 1

Was mich wundert, denn ich hab nirgendwo "CreateProcess" stehen... ??
Naja, ich mach morgen weiter... danke erstmal für die Hilfe bis jetzt :)
Titel: Re: File not found
Beitrag von: Jidder am 22. January 2013, 00:09
Das hat nichts mit deinen Source Code zu tun, sondern damit wie ich den Compiler erstellt habe.

Die beste Lösung, die ich kenne, ist nicht gcc.exe (aus dem Verzeichnis i586-elf\bin) zu benutzen, sondern die i586-elf-gcc.exe und so weiter aus dem Verzeichnis bin.

Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 22. January 2013, 00:16
Kann eigentlich nicht sein, genau die hab ich bereits genommen, ich hab sie nur umbenannt, damit ich den pfad im Makefile nicht umändern musste... es handelt sich um crosstools-complete\bin\i586-elf-gcc.exe  :?
Titel: Re: File not found
Beitrag von: Jidder am 22. January 2013, 00:33
Die beiden .exe-Dateien sind gleich. Ich glaube die entscheidet anhand des eigenen Namens, wie sie sich verhalten soll. Du solltest deine Makefile anpassen.
Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 22. January 2013, 09:47
Geht nicht, was mach ich falsch?  :cry:

(http://s1.directupload.net/images/130122/oqcf3itn.png)
Titel: Re: File not found
Beitrag von: Jidder am 22. January 2013, 09:57
Du darfst die Dateien nicht einfach rüberkopieren, sondern du musst sie in dem entpackten Verzeichnis lassen. Die .EXE-Dateien benötigen nämlich Zugriff auf die anderen Dateien in dem Archiv, und sie suchen relativ zu ihrer eignen Position nach diesen Dateien. Deswegen tritt auch auch der Fehler mit CreateProcess auf: Die Dateien sind nicht da, wo sie i586-elf-gcc.exe erwartet.

Nachdem du die Kommandozeilenumgebung gestartet hast, solltest du SET PATH=C:\crosstools\bin;%PATH% ausführen, wobei du C:\crosstools\bin durch den tatsächlichen Pfad zu dem entpackten bin-Verzeichnis ersetzen musst. Die .EXE-Dateien, die du dir in das Quelltextverzeichnis kopiert hast, solltest du löschen.
Titel: Re: File not found
Beitrag von: KtmnjjpfjsFvzG am 22. January 2013, 10:08
Geil :D

Es geht, habe jetzt kernel, start.o und init.o :)

Ich muss jetzt los, wenn ich wieder da bin, versuch ich, das dann zum Laufen zu bekommen :)

Danke!