Index: trunk/i386/boot2/Makefile =================================================================== --- trunk/i386/boot2/Makefile (revision 903) +++ trunk/i386/boot2/Makefile (revision 904) @@ -23,7 +23,7 @@ -fno-builtin -DSAIO_INTERNAL_USER -static $(OMIT_FRAME_POINTER_CFLAG) \ -mpreferred-stack-boundary=2 -fno-align-functions -fno-stack-protector \ -march=pentium4 -msse2 -mfpmath=sse -msoft-float -nostdinc -include $(SRCROOT)/autoconf.h - + CPPFLAGS := $(CPPFLAGS) -nostdinc++ -include $(SRCROOT)/autoconf.h DEFINES= @@ -119,12 +119,17 @@ -final_output Symbols \ -macosx_version_min 10.6 \ -o $(OBJROOT)/Symbols_LINKER_ONLY.dylib + + + + endif @make embed_symbols # this is done in a sub process after boot.sys exists so the strings are populated correctly @${RM} $(SYMROOT)/boot2.sys + @##size $(SYMROOT)/boot.sys @ls -l $(SYMROOT)/boot @@ -136,7 +141,7 @@ exit 1;\ fi) - + embed_symbols: ifeq (${CONFIG_MODULES}, y) @echo ================= Embedding Symbols.dylib ================= @@ -149,7 +154,7 @@ @echo "\t[MACHOCONV] boot" @$(SYMROOT)/machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot - + $(SYMROOT)/vers.h: @echo "#define I386BOOT_VERSION \"5.0.132\"" > $(SYMROOT)/vers.h @echo "#define I386BOOT_BUILDDATE \"`date \"+%Y-%m-%d %H:%M:%S\"`\"" >> $(SYMROOT)/vers.h Index: trunk/i386/modules/MakeInc.dir =================================================================== --- trunk/i386/modules/MakeInc.dir (revision 903) +++ trunk/i386/modules/MakeInc.dir (revision 904) @@ -10,7 +10,7 @@ ifeq ($(BUILT_IN),yes) override OBJROOT = $(SRCROOT)/obj/i386/boot2_modules/$(DIR) -override SYMROOT = $(SRCROOT)/sym/i386/ +override SYMROOT = $(SRCROOT)/obj/i386/ endif include ${SRCROOT}/Make.rules @@ -54,13 +54,13 @@ INC = -I$(SRCROOT)/i386/modules/include/ -Iinclude/ -I$(SRCROOT)/i386/modules/module_includes/ -I$(SRCROOT)/i386/libsaio/ -I$(SRCROOT)/i386/libsa/ -I$(SRCROOT)/i386/include/ -I$(SRCROOT)/i386/boot2/ DEFINES := -D__KLIBC__ $(DEFINES) -MODULE_DEPENDENCIES := $(foreach x,$(MODULE_DEPENDENCIES),-weak_library $(SYMROOT)/modules/$(x).dylib) +MODULE_DEPENDENCIES := $(wildcard $(foreach x,$(MODULE_DEPENDENCIES),$(SYMROOT)/modules/$(x).dylib)) \ + $(wildcard $(foreach x,$(MODULE_DEPENDENCIES),$(OBJROOT)/../$(x).dylib)) +MODULE_DEPENDENCIES_CMD := $(foreach x,$(MODULE_DEPENDENCIES), -weak_library $(x)) INSTALLDIR = $(DSTROOT)/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders/standalone -##$(error DEFINED AS $(MODULE_DEFINITION)) - MODULE_DEFINITION := $(CONFIG_$(shell echo $(MODULE_NAME) | tr '[:lower:]' '[:upper:]')_MODULE) @@ -82,7 +82,7 @@ ifeq ($(BUILT_IN),yes) # Make this *BUILT IN* -all: ${OBJROOT} ${SYMROOT}/modules/ ${OBJROOT} $(addprefix $(OBJROOT)/, ${MODULE_OBJS}) $(SYMROOT)/boot_modules.h $(SYMROOT)/boot_modules.c +all: dylib_LINKER else # Module not selected to be built in @@ -97,10 +97,31 @@ endif endif -dylib: ${SYMROOT}/modules/ ${OBJROOT} $(addprefix $(OBJROOT)/, ${MODULE_OBJS}) $(SYMROOT)/modules/$(MODULE_NAME).dylib -$(SYMROOT)/modules/$(MODULE_NAME).dylib: +dylib_LINKER: $(SYMROOT)/boot_modules.h $(SYMROOT)/boot_modules.c dylib + +dylib: ${SYMROOT}/modules/ ${OBJROOT} $(SYMROOT)/modules/$(MODULE_NAME).dylib + + +ifeq ($(BUILT_IN),yes) + +$(SYMROOT)/modules/$(MODULE_NAME).dylib: $(addprefix $(OBJROOT)/, ${MODULE_OBJS}) $(MODULE_DEPENDENCIES) @echo "\t[LD] $(MODULE_NAME).dylib" + @ld -arch i386 -undefined dynamic_lookup \ + -dylib -read_only_relocs suppress \ + -S -x -Z -dead_strip_dylibs \ + -no_uuid \ + -current_version $(MODULE_VERSION) -compatibility_version $(MODULE_COMPAT_VERSION) \ + -final_output $(MODULE_NAME) \ + $(filter %.o,$^) \ + -macosx_version_min 10.6 \ + -o $(SYMROOT)/modules/$(MODULE_NAME).dylib + + +else + +$(SYMROOT)/modules/$(MODULE_NAME).dylib: $(addprefix $(OBJROOT)/, ${MODULE_OBJS}) $(MODULE_DEPENDENCIES) $(SRCROOT)/obj/i386/boot2/Symbols_LINKER_ONLY.dylib + @echo "\t[LD] $(MODULE_NAME).dylib" @ld -arch i386 \ -alias _$(MODULE_START) start \ @@ -109,17 +130,15 @@ -no_uuid \ -current_version $(MODULE_VERSION) -compatibility_version $(MODULE_COMPAT_VERSION) \ -final_output $(MODULE_NAME) \ - -L$(OBJROOT)/ \ - -L$(OBJROOT)/../ \ - -L$(SYMROOT)/ \ - $(OBJROOT)/*.o \ - -weak_library $(OBJROOT)/../../boot2/Symbols_LINKER_ONLY.dylib \ - $(MODULE_DEPENDENCIES) \ + $(filter %.o,$^) \ + -weak_library $(SRCROOT)/obj/i386/boot2/Symbols_LINKER_ONLY.dylib \ + $(MODULE_DEPENDENCIES_CMD) \ -macosx_version_min 10.6 \ - -o $(SYMROOT)/modules/$(MODULE_NAME).dylib + -o $@ @cp -rf include/* ../module_includes/ &> /dev/null || true +endif clean: @echo "\t[RM] $(SYMROOT)/modules/$(MODULE_NAME).dylib" Index: trunk/i386/modules/Makefile =================================================================== --- trunk/i386/modules/Makefile (revision 903) +++ trunk/i386/modules/Makefile (revision 904) @@ -56,8 +56,7 @@ objroot_dirs: @rm -rf module_includes @mkdir module_includes - @rm -rf "$(SYMROOT)/modules/" - @mkdir "$(SYMROOT)/modules/" + @${MKDIRS} "$(SYMROOT)/modules/" $(SYMROOT)/boot_modules.c: ${OBJROOT} ${SYMROOT}/modules/ ${OBJROOT} $(addprefix $(OBJROOT)/, ${MODULE_OBJS}) Index: trunk/i386/Makefile =================================================================== --- trunk/i386/Makefile (revision 903) +++ trunk/i386/Makefile (revision 904) @@ -15,10 +15,28 @@ include ${SRCROOT}/Make.rules # The order of building is important. -SUBDIRS = util libsa libsaio boot0 boot1 boot2 cdboot modules +SUBDIRS_PRE = util +SUBDIRS = libsa libsaio boot0 boot1 boot2 cdboot modules all: - @cd modules; ${MAKE} BUILT_IN=yes all + @for i in ${SUBDIRS_PRE}; \ + do \ + echo ================= make $@ for $$i =================; \ + ( cd $$i; ${MAKE} \ + "OBJROOT=$(OBJROOT)/$$i" \ + "SYMROOT=$(SYMROOT)" \ + "DSTROOT=$(DSTROOT)" \ + "SRCROOT=$(SRCROOT)" \ + "RC_ARCHS=$(RC_ARCHS)" \ + "RC_KANJI=$(RC_KANJI)" \ + "JAPANESE=$(JAPANESE)" \ + "RC_CFLAGS=$(RC_CFLAGS)" $@ \ + ) || exit $$?; \ + done + + @cd modules; ${MAKE} BUILT_IN=yes $@ + + @for i in ${SUBDIRS}; \ do \ echo ================= make $@ for $$i =================; \ Index: trunk/i386/util/dyldsymboltool.c =================================================================== --- trunk/i386/util/dyldsymboltool.c (revision 903) +++ trunk/i386/util/dyldsymboltool.c (revision 904) @@ -45,17 +45,14 @@ int main(int argc, char *argv[]) { - if(argc != 3) + if(argc < 3) { - fprintf(stderr, "usage: dyldsymboltool bootFile loadAddr outfile\n"); + fprintf(stderr, "usage: dyldsymboltool obj1 [obj2 ...] outfile\n"); exit(-1); } - char line[256]; - char* command = malloc(strlen(argv[1]) + sizeof("nm -g ")); - FILE *fpipe; symbols_dylib_t dylib; symbolList_t* symbols = NULL; @@ -65,41 +62,58 @@ + int i; + for(i = 1; i < argc-1; i++) + { + char line[256]; + char* command = malloc(strlen(argv[1]) + sizeof("nm -g ")); + FILE *fpipe; + // Parse boot.sys (arg1) to get symtab + sprintf(command, "nm -g %s", argv[i]); // TODO: read boot.sym directly, no need for nm + + if ( !(fpipe = (FILE*)popen(command,"r")) ) + { // If fpipe is NULL + perror("Problems with pipe"); + exit(1); + } + + + while ( fgets( line, sizeof line, fpipe)) + { + if((strlen(line) < strlen(argv[i]) || + strncmp(line, argv[i], strlen(argv[i])) != 0) + && line[0] != ' ') + { + uint32_t address = 0; + char* addr = strtok(line, " "); + strtok(NULL, " "); + char* name = strtok(NULL, " "); + name[strlen(name)-1] = 0; // remove newline + sscanf(addr, "%x", &address); + if(strcmp(name, VOID_SYMBOL) == 0) start_addr = address; + add_symbol(&symbols, name, address); + } + } + + pclose(fpipe); + + free(command); + } + + - // Parse boot.sys (arg1) to get symtab - sprintf(command, "nm -g %s", argv[1]); // TODO: read boot.sym directly, no need for nm - - if ( !(fpipe = (FILE*)popen(command,"r")) ) - { // If fpipe is NULL - perror("Problems with pipe"); - exit(1); - } - - while ( fgets( line, sizeof line, fpipe)) - { - uint32_t address = 0; - char* addr = strtok(line, " "); - strtok(NULL, " "); - char* name = strtok(NULL, " "); - name[strlen(name)-1] = 0; // remove newline - sscanf(addr, "%x", &address); - if(strcmp(name, VOID_SYMBOL) == 0) start_addr = address; - add_symbol(&symbols, name, address); - } - - - pclose(fpipe); - if(start_addr == 0) { fprintf(stderr, "Unable to locate Symbol.dylib start function\n"); - exit(1); + + //exit(1); } + else + { + add_symbol(&symbols, START_SYMBOL, start_addr); + } - add_symbol(&symbols, START_SYMBOL, start_addr); - - /* Header command info */ dylib.header.ncmds = 2; dylib.header.sizeofcmds = sizeof(dylib) - sizeof(struct mach_header);// + dylib.symtab.nsyms * sizeof(struct nlist) + dylib.symtab.strsize; @@ -135,7 +149,7 @@ - FILE* outfile = fopen(argv[2], "w"); + FILE* outfile = fopen(argv[argc-1], "w"); fwrite(&dylib, sizeof(dylib) /* Sizeof header + module name */ , 1, outfile); Index: trunk/i386/util/Makefile =================================================================== --- trunk/i386/util/Makefile (revision 903) +++ trunk/i386/util/Makefile (revision 904) @@ -4,7 +4,7 @@ # and install them directly, rather than generating them again. # SRCROOT = $(shell pwd)/../../ -OBJROOT = $(SRCROOT)/obj/i386 +OBJROOT = $(SRCROOT)/obj/i386/util SYMROOT = $(SRCROOT)/sym/i386 DSTROOT = $(SRCROOT)/dst/i386 DOCROOT = $(SRCROOT)/doc