Index: branches/meklort/i386/boot2/modules.c =================================================================== --- branches/meklort/i386/boot2/modules.c (revision 635) +++ branches/meklort/i386/boot2/modules.c (revision 636) @@ -22,6 +22,8 @@ unsigned long long textAddress = 0; unsigned long long textSection = 0; +void* symbols_module_start = (void*)0xFFFFFFFF; // This will be modified post compile + /** Internal symbols, however there are accessor methods **/ moduleHook_t* moduleCallbacks = NULL; moduleList_t* loadedModules = NULL; @@ -54,6 +56,14 @@ int init_module_system() { // Intialize module system + if(symbols_module_start == (void*)0xFFFFFFFF) + { + printf("Module system not compiled in\n"); + } + + // TODO: Load embeded module + /* + if(load_module(SYMBOLS_MODULE)) { lookup_symbol = (void*)lookup_all_symbols(SYMBOL_LOOKUP_SYMBOL); @@ -66,6 +76,9 @@ } return 0; + */ + + return -1; } Index: branches/meklort/i386/boot2/Symbols.c =================================================================== --- branches/meklort/i386/boot2/Symbols.c (revision 0) +++ branches/meklort/i386/boot2/Symbols.c (revision 636) @@ -0,0 +1,72 @@ +/* + * Symbols.c + * + * Module loader support module. This module is the first module to ever be loaded. + * It contains a copy of each symbol inside ov the current version of chameleon as well + * as a strcmp function. Chameleon calls lookup_symbol to resolve internal symbols + * when they are requested by a module. This module does *not* depend on any intenrla + * symbols, as such it can be loaded without a symbol table initialized. + * + * Copyright (c) 2009 Evan Lojewski. All rights reserved. + */ + +#include "Symbols.h" + +static int strcmp(const char * s1, const char * s2); + +void Symbols_start() +{ + // load_dependency("Symbols", 300); +} + +unsigned int lookup_symbol(const char* symbol) +{ + int upperLimit = sizeof(symbolList) / sizeof(symbolList[0]) - 1; + int lowerLimit = 0; + int compareIndex = (upperLimit - lowerLimit) >> 1; // Midpoint + int result; + + while((result = strcmp(symbol, symbolList[compareIndex].symbol)) != 0) + { + if(result > 0) // We need to search a HIGHER index + { + if(compareIndex != lowerLimit) + { + lowerLimit = compareIndex; + } + else + { + return 0xFFFFFFFF; // Symbol not found + } + compareIndex = (upperLimit + lowerLimit + 1) >> 1; // Midpoint, round up + } + else // We Need to search a LOWER index + { + if(compareIndex != upperLimit) + { + upperLimit = compareIndex; + } + else + { + return 0xFFFFFFFF; // Symbol not found + } + compareIndex = (upperLimit + lowerLimit) >> 1; // Midpoint, round down + } + } + return symbolList[compareIndex].addr; +} + +/* + * strcmp - Copied from libsa/string.c due to symbols not able to be resolved at this point + */ +static int strcmp(const char * s1, const char * s2) +{ + while (*s1 && (*s1 == *s2)) { + s1++; + s2++; + } + return (*s1 - *s2); +} + + + Index: branches/meklort/i386/boot2/Makefile =================================================================== --- branches/meklort/i386/boot2/Makefile (revision 635) +++ branches/meklort/i386/boot2/Makefile (revision 636) @@ -55,15 +55,28 @@ MAXBOOTSIZE = 458240 +# +# Strings used to retrieve the start location for the Symbols.dylib module +# +SYMBOLS_MODULE = Symbols.dylib +SYMBOL_START= _symbols_module_start +SYMBOL_ADDR = $(shell printf "%d" 0x`nm -s __DATA __data $(SYMROOT)/boot.sys | grep " $(SYMBOL_START)$$" | cut -f 1 -d " "`) +DATA_OFFSET = $(shell otool -l $(SYMROOT)/boot.sys | grep __data -A 4 | grep __DATA -A 3 | tail -n 1 | cut -f 6 -d " ") +DATA_ADDR = $(shell printf "%d" `otool -l $(SYMROOT)/boot.sys | grep __data -A 4 | grep __DATA -A 3 | head -n 2 | tail -n 1 | cut -f 8 -d " "`) +PATCH_ADDR = $(shell echo ${SYMBOL_ADDR}-${DATA_ADDR}+${DATA_OFFSET} | bc) + + optionrom: CFLAGS += -DOPTION_ROM all embedtheme optionrom: $(DIRS_NEEDED) boot -boot: machOconv embedded.h $(OBJS) $(LIBDEP) +boot: embedded.h $(OBJS) $(LIBDEP) $(LD) -static -Wl,-preload -Wl,-segaddr,__INIT,$(BOOT2ADDR) \ -nostdlib -arch i386 -Wl,-segalign,20 \ -o $(SYMROOT)/boot.sys $(filter %.o,$^) $(LIBS) -lcc_kext - machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot + + @make embed_symbols # this is done in a sub process after boot.sys exists so the strings are populated correctly + size $(SYMROOT)/boot.sys ls -l $(SYMROOT)/boot @( size=`ls -l $(SYMROOT)/boot | awk '{ print $$5}'` ; \ @@ -74,6 +87,17 @@ exit 1;\ fi) +embed_symbols: machOconv Symbols.dylib + @echo ================= Embedding Symbols.dylib ================= + machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot + stat -f%z $(SYMROOT)/boot | perl -ane "print pack('V',@F[0]);" | dd conv=notrunc of=${SYMROOT}/boot.sys bs=1 count=4 seek=$(PATCH_ADDR) + + machOconv $(SYMROOT)/boot.sys $(SYMROOT)/boot + dd if=${SYMROOT}/${SYMBOLS_MODULE} of=${SYMROOT}/boot bs=1 seek=`stat -f%z $(SYMROOT)/boot` + ${RM} $(SYMROOT)/${SYMBOLS_MODULE} + + + prompt.o: vers.h vers.h: @echo "#define I386BOOT_VERSION \"5.0.132\"" > $(SYMROOT)/vers.h @@ -84,7 +108,40 @@ embedded.h: @cd $(SYMROOT)/../../doc && xxd -i BootHelp.txt > $(SYMROOT)/embedded.h +Symbols.dylib: Symbols.o + @echo ================= Compiling ${SYMBOLS_MODULE} ================= + @ld -arch i386 \ + -undefined dynamic_lookup \ + -alias _Symbols_start start \ + -dylib -read_only_relocs suppress \ + -S -x -dead_strip_dylibs \ + -no_uuid \ + -bind_at_load \ + -current_version 1.0.0 \ + -compatibility_version 1.0.0 \ + -final_output Symbols \ + ${OBJROOT}/Symbols.o \ + -o $(SYMROOT)/${SYMBOLS_MODULE} + @size $(SYMROOT)/${SYMBOLS_MODULE} + +Symbols.o: + @rm -rf $(SYMROOT)/Symbols.h + @echo "typedef struct {" >> $(SYMROOT)/Symbols.h + @echo " char* symbol;" >> $(SYMROOT)/Symbols.h + @echo " unsigned int addr;" >> $(SYMROOT)/Symbols.h + @echo "} symbol_t;" >> $(SYMROOT)/Symbols.h + @echo "" >> $(SYMROOT)/Symbols.h + + @nm -g $(SYMROOT)/boot.sys | tr . _ | awk '{print "static char "$$3"_string[] = \""$$3"\";"}' >> $(SYMROOT)/Symbols.h + + @echo "symbol_t symbolList[] = {" >> $(SYMROOT)/Symbols.h + @nm -g $(SYMROOT)/boot.sys | tr . _ | awk '{print " {.symbol = "$$3"_string, .addr = 0x"$$1"},";}' >> $(SYMROOT)/Symbols.h + @echo "};" >> $(SYMROOT)/Symbols.h + + $(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c Symbols.c $(INC) -o $(OBJROOT)/Symbols.o + + install_i386:: all $(INSTALLDIR) cp $(SYMROOT)/boot $(OTHER_FILES) $(INSTALLDIR) cd $(INSTALLDIR); chmod u+w boot $(OTHER_FILES) Index: branches/meklort/i386/modules/Makefile =================================================================== --- branches/meklort/i386/modules/Makefile (revision 635) +++ branches/meklort/i386/modules/Makefile (revision 636) @@ -26,9 +26,9 @@ VPATH = $(OBJROOT):$(SYMROOT) # The order of building is important. -# TODO: exclude Symbols from find so it isn't compiled twice -SUBDIRS = Symbols Resolution KernelPatcher GUI KextPatcher GraphicsEnabler ACPIPatcher HPET USBFix Memory Networking NetbookInstaller +SUBDIRS = Resolution KernelPatcher GUI KextPatcher GraphicsEnabler ACPIPatcher HPET USBFix Memory Networking NetbookInstaller #SUBDIRS = USB +#SUBDIRS = Symbols # This is made during the boot2 build stage all embedtheme optionrom tags debug install installhdrs: @rm -rf $(OBJROOT)