␉␉␉␉␊ |
␉␉␉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;␊ |
␉␉␉␉␊ |
|
␉␉␉␉␊ |
␉␉␉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;␊ |
|
␉␉␉␉}␊ |
␉␉␉␉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;␊ |
|
␉␉␉␉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;␊ |
|
␉␉␉␉␉printf("Unable to bind symbol %s\n", symbolName);␊ |
␉␉␉␉␉getc();␊ |
␉␉␉␉}␊ |
␉␉␉␉}␊ |
␉␉␉␉segmentAddress += tmp + sizeof(void*);␊ |
␊ |
␉␉␉␉␊ |
|
␉␉␉␉␊ |
␉␉␉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;␊ |
|
␉␉␉␉␉printf("Unable to bind symbol %s\n", symbolName);␊ |
␉␉␉␉␉getc();␊ |
␉␉␉␉}␊ |
␉␉␉␉}␊ |
␉␉␉␉segmentAddress += (immediate * sizeof(void*)) + sizeof(void*);␊ |
␊ |
␉␉␉␉␊ |
|
␉␉␉␉␉{␊ |
␉␉␉␉␉␉␊ |
␉␉␉␉␉␉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;␊ |
|
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)␊ |
␉{␊ |
|
␉␉}␊ |
␊ |
␉}␊ |
␉␊ |
␉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;␊ |
}␊ |
|
{␊ |
␉// TODO: actualy impliment this function (asm)␊ |
␉stop("ERROR: dyld_stub_binder was called, should have been take care of by the linker.\n");␊ |
} |
}␊ |
␊ |
/* 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;␊ |
␉}␊ |
␉␊ |
}␊ |