Autor Thema: circular dependency  (Gelesen 5560 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« 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
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #2 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)\$@ $<
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 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?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #4 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
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 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?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #6 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)
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #7 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
« Letzte Änderung: 21. October 2009, 18:00 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 22. October 2009, 10:29 »
Danke. Genau daran lag es...
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

 

Einloggen