+
+ /*======================================================================*/
+
+@@ -835,32 +909,20 @@ static struct obj_symbol *arch_new_symbo
+ static enum obj_reloc
+ arch_apply_relocation(struct obj_file *f,
+ struct obj_section *targsec,
+- /*struct obj_section *symsec,*/
++ struct obj_section *symsec,
+ struct obj_symbol *sym,
+ ElfW(RelM) *rel, ElfW(Addr) v)
+ {
+-#if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
+- || defined(__sh__) || defined(__s390__) || defined(__x86_64__) \
+- || defined(__powerpc__) || defined(__mips__)
+ struct arch_file *ifile = (struct arch_file *) f;
+-#endif
+ enum obj_reloc ret = obj_reloc_ok;
+ ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
+-#if defined(__arm__) || defined(__H8300H__) || defined(__H8300S__) \
+- || defined(__i386__) || defined(__mc68000__) || defined(__microblaze__) \
+- || defined(__mips__) || defined(__nios2__) || defined(__powerpc__) \
+- || defined(__s390__) || defined(__sh__) || defined(__x86_64__)
+ ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
+-#endif
+ #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
+ struct arch_symbol *isym = (struct arch_symbol *) sym;
+ #endif
+-#if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
+- || defined(__sh__) || defined(__s390__)
+ #if defined(USE_GOT_ENTRIES)
+ ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
+ #endif
+-#endif
+ #if defined(USE_PLT_ENTRIES)
+ ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
+ unsigned long *ip;
+@@ -954,7 +1016,6 @@ arch_apply_relocation(struct obj_file *f
+
+ case R_386_PLT32:
+ case R_386_PC32:
+- case R_386_GOTOFF:
+ *loc += v - dot;
+ break;
+
+@@ -973,6 +1034,9 @@ arch_apply_relocation(struct obj_file *f
+
+ case R_386_GOT32:
+ goto bb_use_got;
++
++ case R_386_GOTOFF:
++ *loc += v - got;
+ break;
+
+ #elif defined(__microblaze__)
+@@ -1759,7 +1823,7 @@ static int arch_list_add(ElfW(RelM) *rel
+
+ #if defined(USE_SINGLE)
+
+-static int arch_single_init(/*ElfW(RelM) *rel,*/ struct arch_single_entry *single,
++static int arch_single_init(ElfW(RelM) *rel, struct arch_single_entry *single,
+ int offset, int size)
+ {
+ if (single->allocated == 0) {
+@@ -1907,7 +1971,7 @@ static void arch_create_got(struct obj_f
+ #if defined(USE_GOT_ENTRIES)
+ if (got_allocate) {
+ got_offset += arch_single_init(
+- /*rel,*/ &intsym->gotent,
++ rel, &intsym->gotent,
+ got_offset, GOT_ENTRY_SIZE);
+
+ got_needed = 1;
+@@ -1921,7 +1985,7 @@ static void arch_create_got(struct obj_f
+ plt_offset, PLT_ENTRY_SIZE);
+ #else
+ plt_offset += arch_single_init(
+- /*rel,*/ &intsym->pltent,
++ rel, &intsym->pltent,
+ plt_offset, PLT_ENTRY_SIZE);
+ #endif
+ plt_needed = 1;
+@@ -1959,8 +2023,7 @@ static unsigned long obj_elf_hash_n(cons
+ while (n > 0) {
+ ch = *name++;
+ h = (h << 4) + ch;
+- g = (h & 0xf0000000);
+- if (g != 0) {
++ if ((g = (h & 0xf0000000)) != 0) {
+ h ^= g >> 24;
+ h &= ~g;
+ }
+@@ -2039,7 +2102,7 @@ obj_add_symbol(struct obj_file *f, const
+ int n_type = ELF_ST_TYPE(info);
+ int n_binding = ELF_ST_BIND(info);
+
+- for (sym = f->symtab[hash]; sym; sym = sym->next) {
++ for (sym = f->symtab[hash]; sym; sym = sym->next)
+ if (f->symbol_cmp(sym->name, name) == 0) {
+ int o_secidx = sym->secidx;
+ int o_info = sym->info;
+@@ -2098,14 +2161,14 @@ obj_add_symbol(struct obj_file *f, const
+ return sym;
+ }
+ }
+- }
+
+ /* Completely new symbol. */
+ sym = arch_new_symbol();
+ sym->next = f->symtab[hash];
+ f->symtab[hash] = sym;
+ sym->ksymidx = -1;
+- if (ELF_ST_BIND(info) == STB_LOCAL && symidx != (unsigned long)(-1)) {
++
++ if (ELF_ST_BIND(info) == STB_LOCAL && symidx != -1) {
+ if (symidx >= f->local_symtab_size)
+ bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
+ name, (long) symidx, (long) f->local_symtab_size);
+@@ -3228,7 +3291,7 @@ static int obj_relocate(struct obj_file
+
+ /* Do it! */
+ switch (arch_apply_relocation
+- (f, targsec, /*symsec,*/ intsym, rel, value)
++ (f, targsec, symsec, intsym, rel, value)
+ ) {
+ case obj_reloc_ok:
+ break;
+@@ -3307,11 +3370,11 @@ static int obj_create_image(struct obj_f
+
+ /*======================================================================*/
+
+-static struct obj_file *obj_load(FILE * fp, int loadprogbits ATTRIBUTE_UNUSED)
++static struct obj_file *obj_load(FILE * fp, int loadprogbits)