Index: branches/slice/i386/boot2/modules.c =================================================================== --- branches/slice/i386/boot2/modules.c (revision 681) +++ branches/slice/i386/boot2/modules.c (revision 682) @@ -840,8 +840,8 @@ case BIND_OPCODE_SET_DYLIB_SPECIAL_IMM: // NOTE: this is wrong, fortunately we don't use it - libraryOrdinal = immediate ? (SInt8)(BIND_OPCODE_MASK | immediate) : immediate; - //printf("BIND_OPCODE_SET_DYLIB_SPECIAL_IMM: %d\n", libraryOrdinal); + libraryOrdinal = -immediate; + //DBG("BIND_OPCODE_SET_DYLIB_SPECIAL_IMM: %d\n", libraryOrdinal); break; @@ -927,15 +927,6 @@ case BIND_OPCODE_DO_BIND: //DBG("BIND_OPCODE_DO_BIND\n"); - if(libraryOrdinal == BIND_SPECIAL_DYLIB_FLAT_LOOKUP && type == BIND_TYPE_POINTER) - { - // HACK(ish) - // Internal symbol, don't bind - } - else - { - //printf("Binding symbol %s, libraryOrdinal = %d, symboFlags = %d, type = %d\n", symbolName, libraryOrdinal, symboFlags, type); - if(symbolAddr != 0xFFFFFFFF) { address = segmentAddress + (UInt32)base; @@ -944,10 +935,9 @@ } else //if(strcmp(symbolName, SYMBOL_DYLD_STUB_BINDER) != 0) { - printf("Unable to bind symbol %s, libraryOrdinal = %d, symboFlags = %d, type = %d\n", symbolName, libraryOrdinal, symboFlags, type); + printf("Unable to bind symbol %s\n", symbolName); getc(); } - } segmentAddress += sizeof(void*); break; @@ -967,12 +957,7 @@ while(bind_stream[i] & 0x80); - if(libraryOrdinal == BIND_SPECIAL_DYLIB_FLAT_LOOKUP && type == BIND_TYPE_POINTER) - { - // Internal symbol, don't bind - } - else - { + if(symbolAddr != 0xFFFFFFFF) { address = segmentAddress + (UInt32)base; @@ -984,7 +969,6 @@ printf("Unable to bind symbol %s\n", symbolName); getc(); } - } segmentAddress += tmp + sizeof(void*); @@ -992,12 +976,7 @@ case BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED: //DBG("BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED\n"); - if(libraryOrdinal == BIND_SPECIAL_DYLIB_FLAT_LOOKUP && type == BIND_TYPE_POINTER) - { - // Internal symbol, don't bind - } - else - { + if(symbolAddr != 0xFFFFFFFF) { address = segmentAddress + (UInt32)base; @@ -1009,7 +988,6 @@ printf("Unable to bind symbol %s\n", symbolName); getc(); } - } segmentAddress += (immediate * sizeof(void*)) + sizeof(void*); @@ -1046,30 +1024,17 @@ { address = segmentAddress + (UInt32)base; - if(libraryOrdinal == BIND_SPECIAL_DYLIB_FLAT_LOOKUP && type == BIND_TYPE_POINTER) - { - // Internal symbol, don't bind - } - else - { bind_location((UInt32*)address, (char*)symbolAddr, addend, BIND_TYPE_POINTER); - } + segmentAddress += tmp2 + sizeof(void*); } } - else + else //if(strcmp(symbolName, SYMBOL_DYLD_STUB_BINDER) != 0) { - if(libraryOrdinal == BIND_SPECIAL_DYLIB_FLAT_LOOKUP && type == BIND_TYPE_POINTER) - { - // Internal symbol, don't bind - } - else - { printf("Unable to bind symbol %s\n", symbolName); getc(); } - } break; @@ -1207,6 +1172,17 @@ unsigned int lookup_all_symbols(const char* name) { unsigned int addr = 0xFFFFFFFF; + if(lookup_symbol && (UInt32)lookup_symbol != 0xFFFFFFFF) + { + addr = lookup_symbol(name); + if(addr != 0xFFFFFFFF) + { + //DBG("Internal symbol %s located at 0x%X\n", name, addr); + return addr; + } + } + + symbolList_t* entry = moduleSymbols; while(entry) { @@ -1221,21 +1197,12 @@ } } - - if(lookup_symbol && (UInt32)lookup_symbol != 0xFFFFFFFF) - { - addr = lookup_symbol(name); - if(addr != 0xFFFFFFFF) - { - //DBG("Internal symbol %s located at 0x%X\n", name, addr); - return addr; - } - } - - #if DEBUG_MODULES +// if(strcmp(name, SYMBOL_DYLD_STUB_BINDER) != 0) +// { verbose("Unable to locate symbol %s\n", name); getc(); +// } #endif return 0xFFFFFFFF; } @@ -1338,4 +1305,40 @@ { // TODO: actualy impliment this function (asm) stop("ERROR: dyld_stub_binder was called, should have been take care of by the linker.\n"); -} \ No newline at end of file +} + +/* Nedded to divide 64bit numbers correctly. TODO: look into why modules need this + * And why it isn't needed when compiled into boot2 + */ + +uint64_t __udivdi3(uint64_t numerator, uint64_t denominator) +{ + uint64_t quotient = 0, qbit = 1; + + if (denominator) + { + while ((int64_t) denominator >= 0) + { + denominator <<= 1; + qbit <<= 1; + } + + while (denominator) + { + if (denominator <= numerator) + { + numerator -= denominator; + quotient += qbit; + } + denominator >>= 1; + qbit >>= 1; + } + + return quotient; + } + else { + stop("Divide by 0"); + return 0; + } + +} Index: branches/slice/revision =================================================================== --- branches/slice/revision (revision 681) +++ branches/slice/revision (revision 682) @@ -1 +1 @@ -676:678 \ No newline at end of file +676:681 \ No newline at end of file