+-#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 @@
+
+ case R_386_PLT32:
+ case R_386_PC32:
+- case R_386_GOTOFF:
+ *loc += v - dot;
+ break;
+
+@@ -973,6 +1034,9 @@
+
+ case R_386_GOT32:
+ goto bb_use_got;
++
++ case R_386_GOTOFF:
++ *loc += v - got;
+ break;
+
+ #elif defined(__microblaze__)
+@@ -1759,7 +1823,7 @@
+
+ #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 @@
+ #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 @@
+ 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 @@
+ 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 @@
+ 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 @@
+ 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 @@
+
+ /* 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 struct obj_file *obj_load(FILE * fp, int loadprogbits ATTRIBUTE_UNUSED)
++static struct obj_file *obj_load(FILE * fp, int loadprogbits)
+ {
+ struct obj_file *f;
+ ElfW(Shdr) * section_headers;
+- size_t shnum, i;
++ int shnum, i;
+ char *shstrtab;
+
+ /* Read the file header. */
+@@ -3583,7 +3646,7 @@
+ while (ptr < endptr) {
+ value = strchr(ptr, '=');
+ if (value && strncmp(ptr, "license", value-ptr) == 0) {
+- unsigned i;
++ int i;
+ if (license)
+ *license = value+1;
+ for (i = 0; i < ARRAY_SIZE(gpl_licenses); ++i) {
+@@ -3687,9 +3750,6 @@
+ * start of some sections. this info is used by ksymoops to do better
+ * debugging.
+ */
+-#if !ENABLE_FEATURE_INSMOD_VERSION_CHECKING
+-#define get_module_version(f, str) get_module_version(str)
+-#endif
+ static int
+ get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
+ {
+@@ -3722,8 +3782,7 @@
+ struct obj_symbol *sym;
+ char *name, *absolute_filename;
+ char str[STRVERSIONLEN];
+- unsigned i;
+- int l, lm_name, lfilename, use_ksymtab, version;
++ int i, l, lm_name, lfilename, use_ksymtab, version;
+ struct stat statbuf;
+
+ /* WARNING: was using realpath, but replaced by readlink to stop using
+@@ -3910,145 +3969,57 @@