Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: rizor am 21. October 2009, 10:56

Titel: circular dependency
Beitrag von: rizor am 21. October 2009, 10:56
Hi zusammen,

ich habe mit mingw ein kleines Problem.
Beim Kompilieren meldet mingw32-gcc, dass eine Ring-Abhängigkeit bei einer einzigen Datei gibt.
mingw32-make[1]: Circular _start.S <- _start.S.o dependency dropped.
Die Datei ist wie folgt aufgebaut:
#ifdef ARCH_X86
#ifdef MB_YES
.section multiboot
#define MB_MAGIC 0x1badb002
#define MB_FLAGS 0x0
#define MB_CHECKSUM -(MB_MAGIC + MB_FLAGS)

// the multiboot-header
.align 4
.int    MB_MAGIC
.int    MB_FLAGS
.int    MB_CHECKSUM
#endif /* MB_YES */

.section .text
.extern kernel

.global _start
_start:
mov $krn_stack , %esp
//cover the stack (wrong ret-jmps)
push 0
push 0
mov %esp , %ebp

#ifdef MB_YES
//prepare the multiboot-informations to use them as parameters
push %ebx
push %eax
#endif /* MB_YES */

call kernel
cli
hlt

.section .bss
.space 8192
krn_stack:

#endif /* ARCH_X86 */

Und so wird der GCC aufgerufen:
gcc -m32 -march=i386 -DARCH_X86 -DCPU_NR_1 -DMB_YES -I$(KERNEL)\include -I$(LIBC)\include -I$(LIBRIZOR)\include -LE:\MinGW\lib\gcc\mingw32\4.4.0\libgcc.a -L$(LIBC)\libc.lib -L$(LIBRIZOR)\librizor.lib -c -o $(KRN_TMP)\_start.S.o _start.S
Ich sehe keine Abhängigkeiten.

Woran kann das liegen, dass er den Fehler meldet?

Gruß
rizor
Titel: Re: circular dependency
Beitrag von: kevin am 21. October 2009, 11:03
Ich sehe vor allem kein make, das meckern könnte. Mein Vorschlag wäre ja, bei einem make-Fehler einfach mal die Makefile zu posten. ;)

Hm, oder willst du sagen, dass gcc intern make aufruft? Das wäre irgendwie seltsam.
Titel: Re: circular dependency
Beitrag von: rizor am 21. October 2009, 11:27
Stimmt,

das habe ich vergessen.

Hier der Nachtrag ;):
include Makefile.all

DIRS = $(KERNEL)\arch\x86 $(KERNEL)\shell
EXTENSIONS = .c.o .S.o
OBJ_MASK = $(wildcard $(addprefix $(1)\*,$(EXTENSIONS)))
OBJ = $(call OBJ_MASK,$(KRN_TMP))

all: create compile link

create:
if not exist $(KRN_TMP) mkdir $(KRN_TMP)

compile:
echo CC kernel.c
$(GCC) $(C_FLG) $(KRN_TMP)\kernel.c.o kernel.c
for %%i in ($(DIRS)) do mingw32-make -C %%i all

link:
echo LD $(NAME).sys
$(LD) $(LD_FLG) $(KERNEL)\$(NAME).sys $(OBJ) $(LIBS)

clean:
del $(KRN_TMP)\*.o
rmdir $(KRN_TMP)

Dann auch noch Makefile.all:
#The definition of the current version of kernel
NAME = rizor-kernel
VER = 0
SUB_VER = 0
PATCH = 1
REV = 1
VER_ALL = $(VER).$(SUB_VER).$(PATCH).$(REV)

#directories
ROOT = D:\documents\Projects\os-development
LIBRIZOR= $(ROOT)\librizor
LIBC = $(ROOT)\libc
KERNEL = $(ROOT)\kernel
KRN_TMP = $(KERNEL)\tmp

#the cmds for the libc
GCC = E:\MinGW\bin\gcc.exe
LD = E:\MinGW\bin\ld.exe

#the include-directories for the libc
INC = -I$(KERNEL)\include -I$(LIBC)\include -I$(LIBRIZOR)\include

#architectures
GCC_X86 = -m32 -march=i386
LD_X86 = -T$(KERNEL)\config\linker_x86.ld -mi386pe

GCC_ARCH= $(GCC_X86)
LD_ARCH = $(LD_X86)

#the flags for the kernel
LIBS = E:\MinGW\lib\gcc\mingw32\4.4.0\libgcc.a $(LIBC)\libc.lib $(LIBRIZOR)\librizor.lib
LIB_INC = -LE:\MinGW\lib\gcc\mingw32\4.4.0\libgcc.a -L$(LIBC)\libc.lib -L$(LIBRIZOR)\librizor.lib
GCC_DEF = -DARCH_X86 -DCPU_NR_1 -DMB_YES
C_OPT = -O0 -g -maccumulate-outgoing-args -fstrength-reduce -fomit-frame-pointer -finline-functions -fno-stack-protector -nostdinc -fno-builtin
C_FLG = $(C_OPT) $(GCC_ARCH) $(GCC_DEF) $(INC) $(LIB_INC) -c -o
ASM_FLG = $(GCC_ARCH) $(GCC_DEF) $(INC) $(LIB_INC) -c -o
LD_FLG = $(LD_ARCH) $(INC) -o

#the compiler-call
%.c.o:%.c
echo CC $<
$(GCC) $(C_FLG) $(KRN_TMP)\$@ $<

%.S.o:%.S
echo ASM $<
$(GCC) $(ASM_FLG) $(KRN_TMP)\$@ $<
Titel: Re: circular dependency
Beitrag von: kevin am 21. October 2009, 11:41
Wie rufst du denn make auf? Ich sehe im Moment gar nicht, wie überhaupt irgendeine Assemblerdatei zum Kompilieren gebracht wird. Übersehe ich die Stelle, wo eine Abhängigkeit auf die passende Objektdatei definiert ist?
Titel: Re: circular dependency
Beitrag von: rizor am 21. October 2009, 15:43
Die gibt es ja eben nicht.
Das ist gerade mein Problem, dass das Teil eine Abhängigkeit hat.

Der Aufruf sieht wie folgt aus:
mingw32-make -s all
Titel: Re: circular dependency
Beitrag von: kevin am 21. October 2009, 16:58
Aber ohne Abhängigkeiten kommt deine Regel mit %.S.o:%.S (und die analoge für C) doch gar nicht ins Spiel? Wieso kompiliert der überhaupt irgendwas außer der kernel.c?
Titel: Re: circular dependency
Beitrag von: rizor am 21. October 2009, 17:04
Ach, das meinst du.
In dem Ordner arch/x86 ist eine Makefile, dass durch die for-schleife aufgerufen wird.

include ../../Makefile.all

OBJ = _start.S.o

all: $(OBJ)
Titel: Re: circular dependency
Beitrag von: MNemo am 21. October 2009, 17:54
Ich nehme an, dass der Fehler daran liegt das in make Kurzschreibweisen existieren
.S.o:
wird zu:
%.o: %.S

das kannst du umgehen indem du z.B. die Dateinamen leicht änderst
%_S.o : %.S
Titel: Re: circular dependency
Beitrag von: rizor am 22. October 2009, 10:29
Danke. Genau daran lag es...