+
+ // Apply base offset to locally defined symbols
+ // - #0 is defined as ("" SHN_UNDEF), so skip it
+ for( int i = 1; i < iSymCount; i ++ )
+ {
+ Elf32_Sym *sym = &dynsymtab[i];
+ const char *name = dynstrtab + sym->st_name;
+ (void)name;
+ if( sym->st_shndx == SHN_UNDEF )
+ {
+ TRACE("Sym %i'%s' deferred (SHN_UNDEF)", i, name);
+ }
+ else if( sym->st_shndx == SHN_ABS )
+ {
+ // Leave as is
+ SysDebug("Sym %i'%s' untouched", i, name);
+ }
+ else
+ {
+ void *newval;
+ size_t newsize;
+ if( ELF32_ST_BIND(sym->st_info) != STB_WEAK )
+ {
+ TRACE("Sym %i'%s' = %p (local)", i, name, sym->st_value + iBaseDiff);
+ sym->st_value += iBaseDiff;
+ }
+ // If GetSymbol doesn't return a strong/global symbol value
+ else if( GetSymbol(name, &newval, &newsize, Base) != 1 )
+ {
+ TRACE("Sym %i'%s' = %p (Local weak)", i, name, sym->st_value + iBaseDiff);
+ sym->st_value += iBaseDiff;
+ }
+ else
+ {
+ TRACE("Sym %i'%s' = %p+0x%x (Extern weak)", i, name, newval, newsize);
+ sym->st_value = (uintptr_t)newval;
+ sym->st_size = newsize;
+ }
+ }
+ }