diff options
Diffstat (limited to 'package/busybox/busybox-1.12.0-insmod.patch')
-rw-r--r-- | package/busybox/busybox-1.12.0-insmod.patch | 250 |
1 files changed, 241 insertions, 9 deletions
diff --git a/package/busybox/busybox-1.12.0-insmod.patch b/package/busybox/busybox-1.12.0-insmod.patch index 4e13acdae..985e66677 100644 --- a/package/busybox/busybox-1.12.0-insmod.patch +++ b/package/busybox/busybox-1.12.0-insmod.patch @@ -1,6 +1,113 @@ --- busybox-1.12.0/modutils/insmod.c Wed Aug 6 00:56:02 2008 -+++ busybox-1.12.0-insmod/modutils/insmod.c Thu Aug 28 23:38:35 2008 -@@ -2212,7 +2212,7 @@ ++++ busybox-1.12.0-insmod/modutils/insmod.c Sun Aug 31 23:56:28 2008 +@@ -1059,8 +1059,9 @@ + + case R_68K_PC8: + v -= dot; +- if ((ElfW(Sword))v > 0x7f || +- (ElfW(Sword))v < -(ElfW(Sword))0x80) { ++ if ((ElfW(Sword))v > 0x7f ++ || (ElfW(Sword))v < -(ElfW(Sword))0x80 ++ ) { + ret = obj_reloc_overflow; + } + *(char *)loc = v; +@@ -1068,8 +1069,9 @@ + + case R_68K_PC16: + v -= dot; +- if ((ElfW(Sword))v > 0x7fff || +- (ElfW(Sword))v < -(ElfW(Sword))0x8000) { ++ if ((ElfW(Sword))v > 0x7fff ++ || (ElfW(Sword))v < -(ElfW(Sword))0x8000 ++ ) { + ret = obj_reloc_overflow; + } + *(short *)loc = v; +@@ -1208,8 +1210,9 @@ + { + Elf32_Addr word; + +- if ((Elf32_Sword)v > 0x7fff || +- (Elf32_Sword)v < -(Elf32_Sword)0x8000) { ++ if ((Elf32_Sword)v > 0x7fff ++ || (Elf32_Sword)v < -(Elf32_Sword)0x8000 ++ ) { + ret = obj_reloc_overflow; + } + +@@ -1238,8 +1241,9 @@ + Elf32_Addr word; + + v -= dot + 4; +- if ((Elf32_Sword)v > 0x7fff || +- (Elf32_Sword)v < -(Elf32_Sword)0x8000) { ++ if ((Elf32_Sword)v > 0x7fff ++ || (Elf32_Sword)v < -(Elf32_Sword)0x8000 ++ ) { + ret = obj_reloc_overflow; + } + +@@ -1253,9 +1257,10 @@ + Elf32_Addr word, gp; + /* get _gp */ + gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp")); +- v-=gp; +- if ((Elf32_Sword)v > 0x7fff || +- (Elf32_Sword)v < -(Elf32_Sword)0x8000) { ++ v -= gp; ++ if ((Elf32_Sword)v > 0x7fff ++ || (Elf32_Sword)v < -(Elf32_Sword)0x8000 ++ ) { + ret = obj_reloc_overflow; + } + +@@ -2132,7 +2137,6 @@ + for (sym = f->symtab[hash]; sym; sym = sym->next) + if (f->symbol_cmp(sym->name, name) == 0) + return sym; +- + return NULL; + } + +@@ -2141,12 +2145,10 @@ + if (sym) { + if (sym->secidx >= SHN_LORESERVE) + return sym->value; +- + return sym->value + f->sections[sym->secidx]->header.sh_addr; +- } else { +- /* As a special case, a NULL sym has value zero. */ +- return 0; + } ++ /* As a special case, a NULL sym has value zero. */ ++ return 0; + } + + static struct obj_section *obj_find_section(struct obj_file *f, const char *name) +@@ -2156,7 +2158,6 @@ + for (i = 0; i < n; ++i) + if (strcmp(f->sections[i]->name, name) == 0) + return f->sections[i]; +- + return NULL; + } + +@@ -2167,9 +2168,11 @@ + af = a->header.sh_flags; + + ac = 0; +- if (a->name[0] != '.' || strlen(a->name) != 10 || +- strcmp(a->name + 5, ".init")) ++ if (a->name[0] != '.' || strlen(a->name) != 10 ++ || strcmp(a->name + 5, ".init") != 0 ++ ) { + ac |= 32; ++ } + if (af & SHF_ALLOC) + ac |= 16; + if (!(af & SHF_WRITE)) +@@ -2212,7 +2215,7 @@ sec->name = name; sec->idx = newidx; if (size) @@ -9,7 +116,7 @@ obj_insert_section_load_order(f, sec); -@@ -2227,7 +2227,7 @@ +@@ -2227,7 +2230,7 @@ int newidx = f->header.e_shnum++; struct obj_section *sec; @@ -18,7 +125,7 @@ f->sections[newidx] = sec = arch_new_section(); sec->header.sh_type = SHT_PROGBITS; -@@ -2237,7 +2237,7 @@ +@@ -2237,7 +2240,7 @@ sec->name = name; sec->idx = newidx; if (size) @@ -27,7 +134,7 @@ sec->load_next = f->load_order; f->load_order = sec; -@@ -2689,8 +2689,7 @@ +@@ -2689,8 +2692,7 @@ /* Collect the modules' symbols. */ if (nmod) { @@ -37,7 +144,7 @@ for (i = 0, mn = module_names, m = modules; i < nmod; ++i, ++m, mn += strlen(mn) + 1) { struct new_module_info info; -@@ -2770,13 +2769,14 @@ +@@ -2770,13 +2772,14 @@ } @@ -54,7 +161,64 @@ obj_add_symbol(f, SPFX "__this_module", -1, ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0, -@@ -3124,12 +3124,9 @@ +@@ -2856,18 +2859,19 @@ + /* We don't want to export symbols residing in sections that + aren't loaded. There are a number of these created so that + we make sure certain module options don't appear twice. */ +- +- loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); ++ i = f->header.e_shnum; ++ loaded = alloca(sizeof(int) * i); + while (--i >= 0) + loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; + + for (nsyms = i = 0; i < HASH_BUCKETS; ++i) { + struct obj_symbol *sym; +- for (sym = f->symtab[i]; sym; sym = sym->next) ++ for (sym = f->symtab[i]; sym; sym = sym->next) { + if (ELF_ST_BIND(sym->info) != STB_LOCAL + && sym->secidx <= SHN_HIRESERVE + && (sym->secidx >= SHN_LORESERVE +- || loaded[sym->secidx])) { ++ || loaded[sym->secidx]) ++ ) { + ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p; + + obj_symbol_patch(f, sec->idx, ofs, sym); +@@ -2876,6 +2880,7 @@ + + nsyms++; + } ++ } + } + + obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p); +@@ -2934,9 +2939,11 @@ + } + sec = obj_find_section(f, ".data.init"); + if (sec) { +- if (!module->runsize || +- module->runsize > sec->header.sh_addr - m_addr) ++ if (!module->runsize ++ || module->runsize > sec->header.sh_addr - m_addr ++ ) { + module->runsize = sec->header.sh_addr - m_addr; ++ } + } + sec = obj_find_section(f, ARCHDATA_SEC_NAME); + if (sec && sec->header.sh_size) { +@@ -3083,9 +3090,9 @@ + if (i == f->header.e_shnum) { + struct obj_section *sec; + ++ f->header.e_shnum++; + f->sections = xrealloc_vector(f->sections, 2, i); + f->sections[i] = sec = arch_new_section(); +- f->header.e_shnum = i + 1; + + sec->header.sh_type = SHT_PROGBITS; + sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; +@@ -3124,12 +3131,9 @@ for (i = 0; i < f->header.e_shnum; ++i) { struct obj_section *s = f->sections[i]; if (s->header.sh_type == SHT_NOBITS) { @@ -69,7 +233,43 @@ s->header.sh_type = SHT_PROGBITS; } } -@@ -3354,8 +3351,10 @@ +@@ -3222,8 +3226,8 @@ + #if SHT_RELM == SHT_RELA + #if defined(__alpha__) && defined(AXP_BROKEN_GAS) + /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */ +- if (!extsym || !extsym->st_name || +- ELF_ST_BIND(extsym->st_info) != STB_LOCAL) ++ if (!extsym || !extsym->st_name ++ || ELF_ST_BIND(extsym->st_info) != STB_LOCAL) + #endif + value += rel->r_addend; + #endif +@@ -3329,16 +3333,17 @@ + } + + if (f->header.e_ident[EI_MAG0] != ELFMAG0 +- || f->header.e_ident[EI_MAG1] != ELFMAG1 +- || f->header.e_ident[EI_MAG2] != ELFMAG2 +- || f->header.e_ident[EI_MAG3] != ELFMAG3) { ++ || f->header.e_ident[EI_MAG1] != ELFMAG1 ++ || f->header.e_ident[EI_MAG2] != ELFMAG2 ++ || f->header.e_ident[EI_MAG3] != ELFMAG3 ++ ) { + bb_error_msg_and_die("not an ELF file"); + } + if (f->header.e_ident[EI_CLASS] != ELFCLASSM +- || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN +- ? ELFDATA2MSB : ELFDATA2LSB) +- || f->header.e_ident[EI_VERSION] != EV_CURRENT +- || !MATCH_MACHINE(f->header.e_machine)) { ++ || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB) ++ || f->header.e_ident[EI_VERSION] != EV_CURRENT ++ || !MATCH_MACHINE(f->header.e_machine) ++ ) { + bb_error_msg_and_die("ELF file not for this architecture"); + } + if (f->header.e_type != ET_REL) { +@@ -3354,8 +3359,10 @@ } shnum = f->header.e_shnum; @@ -82,7 +282,7 @@ section_headers = alloca(sizeof(ElfW(Shdr)) * shnum); fseek(fp, f->header.e_shoff, SEEK_SET); -@@ -3391,14 +3390,13 @@ +@@ -3391,14 +3398,13 @@ case SHT_SYMTAB: case SHT_STRTAB: case SHT_RELM: @@ -99,3 +299,35 @@ } break; +@@ -3860,16 +3866,20 @@ + for (nsyms = i = 0; i < HASH_BUCKETS; ++i) + for (sym = f->symtab[i]; sym; sym = sym->next) + if (sym->secidx <= SHN_HIRESERVE +- && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])) ++ && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]) ++ ) { + ++nsyms; ++ } + + all = alloca(nsyms * sizeof(struct obj_symbol *)); + + for (i = 0, p = all; i < HASH_BUCKETS; ++i) + for (sym = f->symtab[i]; sym; sym = sym->next) + if (sym->secidx <= SHN_HIRESERVE +- && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])) ++ && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]) ++ ) { + *p++ = sym; ++ } + + /* And list them. */ + printf("\nSymbols:\n"); +@@ -4265,7 +4275,7 @@ + } + #else + len = MAXINT(ssize_t); +- map = xmalloc_open_read_close(filename, &len); ++ map = xmalloc_xopen_read_close(filename, &len); + #endif + + if (init_module(map, len, options) != 0) |