aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-10-12 20:06:18 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-10-12 20:06:18 +0000
commit9c267b851e54441b867293973fd5a898b847df39 (patch)
treec238cf9dfb9933506f7067011ac696794df1906a
parent98ae2160b62b99424e5793e97d5abd4e3c2e576b (diff)
downloadbusybox-w32-9c267b851e54441b867293973fd5a898b847df39.tar.gz
busybox-w32-9c267b851e54441b867293973fd5a898b847df39.tar.bz2
busybox-w32-9c267b851e54441b867293973fd5a898b847df39.zip
style fixes
-rw-r--r--archival/bunzip2.c4
-rw-r--r--archival/gunzip.c7
-rw-r--r--modutils/insmod.c551
3 files changed, 276 insertions, 286 deletions
diff --git a/archival/bunzip2.c b/archival/bunzip2.c
index 85f2343df..757001fe4 100644
--- a/archival/bunzip2.c
+++ b/archival/bunzip2.c
@@ -37,8 +37,8 @@ int bunzip2_main(int argc, char **argv)
37 37
38 /* Check that the input is sane. */ 38 /* Check that the input is sane. */
39 if (isatty(src_fd) && (opt & BUNZIP2_OPT_FORCE) == 0) { 39 if (isatty(src_fd) && (opt & BUNZIP2_OPT_FORCE) == 0) {
40 bb_error_msg_and_die("Compressed data not read from terminal. " 40 bb_error_msg_and_die("compressed data not read from terminal, "
41 "Use -f to force it."); 41 "use -f to force it");
42 } 42 }
43 43
44 if (filename) { 44 if (filename) {
diff --git a/archival/gunzip.c b/archival/gunzip.c
index 396ce4f5c..e24401c71 100644
--- a/archival/gunzip.c
+++ b/archival/gunzip.c
@@ -65,9 +65,8 @@ int gunzip_main(int argc, char **argv)
65 optind = argc; /* we don't handle "gunzip - a.gz b.gz" */ 65 optind = argc; /* we don't handle "gunzip - a.gz b.gz" */
66 } else { 66 } else {
67 src_fd = xopen(old_path, O_RDONLY); 67 src_fd = xopen(old_path, O_RDONLY);
68
69 /* Get the time stamp on the input file. */ 68 /* Get the time stamp on the input file. */
70 xstat(old_path, &stat_buf); 69 fstat(src_fd, &stat_buf);
71 } 70 }
72 71
73 /* Check that the input is sane. */ 72 /* Check that the input is sane. */
@@ -131,11 +130,11 @@ int gunzip_main(int argc, char **argv)
131 } 130 }
132 else if (ENABLE_DESKTOP && (opt & GUNZIP_OPT_VERBOSE)) { 131 else if (ENABLE_DESKTOP && (opt & GUNZIP_OPT_VERBOSE)) {
133 fprintf(stderr, "%s: %u%% - replaced with %s\n", 132 fprintf(stderr, "%s: %u%% - replaced with %s\n",
134 // TODO: LARGEFILE support for stat_buf.st_size?
135 old_path, (unsigned)(stat_buf.st_size*100 / (status+1)), new_path); 133 old_path, (unsigned)(stat_buf.st_size*100 / (status+1)), new_path);
136 } 134 }
137 } else { 135 } else {
138 bb_error_msg("invalid magic"); exitcode = 1; 136 bb_error_msg("invalid magic");
137 exitcode = 1;
139 } 138 }
140 if (status < 0 && new_path) { 139 if (status < 0 && new_path) {
141 /* Unzip failed, remove new path instead of old path */ 140 /* Unzip failed, remove new path instead of old path */
diff --git a/modutils/insmod.c b/modutils/insmod.c
index cef47ff45..3d9add19a 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -368,23 +368,20 @@ enum {
368/* The structures used in Linux 2.1. */ 368/* The structures used in Linux 2.1. */
369 369
370/* Note: new_module_symbol does not use tgt_long intentionally */ 370/* Note: new_module_symbol does not use tgt_long intentionally */
371struct new_module_symbol 371struct new_module_symbol {
372{
373 unsigned long value; 372 unsigned long value;
374 unsigned long name; 373 unsigned long name;
375}; 374};
376 375
377struct new_module_persist; 376struct new_module_persist;
378 377
379struct new_module_ref 378struct new_module_ref {
380{
381 unsigned tgt_long dep; /* kernel addresses */ 379 unsigned tgt_long dep; /* kernel addresses */
382 unsigned tgt_long ref; 380 unsigned tgt_long ref;
383 unsigned tgt_long next_ref; 381 unsigned tgt_long next_ref;
384}; 382};
385 383
386struct new_module 384struct new_module {
387{
388 unsigned tgt_long size_of_struct; /* == sizeof(module) */ 385 unsigned tgt_long size_of_struct; /* == sizeof(module) */
389 unsigned tgt_long next; 386 unsigned tgt_long next;
390 unsigned tgt_long name; 387 unsigned tgt_long name;
@@ -426,8 +423,7 @@ struct new_module
426#define KALLSYMS_SEC_NAME "__kallsyms" 423#define KALLSYMS_SEC_NAME "__kallsyms"
427 424
428 425
429struct new_module_info 426struct new_module_info {
430{
431 unsigned long addr; 427 unsigned long addr;
432 unsigned long size; 428 unsigned long size;
433 unsigned long flags; 429 unsigned long flags;
@@ -561,8 +557,7 @@ struct obj_symbol
561 557
562#define HASH_BUCKETS 521 558#define HASH_BUCKETS 521
563 559
564struct obj_file 560struct obj_file {
565{
566 ElfW(Ehdr) header; 561 ElfW(Ehdr) header;
567 ElfW(Addr) baseaddr; 562 ElfW(Addr) baseaddr;
568 struct obj_section **sections; 563 struct obj_section **sections;
@@ -577,24 +572,21 @@ struct obj_file
577 struct obj_symbol *symtab[HASH_BUCKETS]; 572 struct obj_symbol *symtab[HASH_BUCKETS];
578}; 573};
579 574
580enum obj_reloc 575enum obj_reloc {
581{
582 obj_reloc_ok, 576 obj_reloc_ok,
583 obj_reloc_overflow, 577 obj_reloc_overflow,
584 obj_reloc_dangerous, 578 obj_reloc_dangerous,
585 obj_reloc_unhandled 579 obj_reloc_unhandled
586}; 580};
587 581
588struct obj_string_patch 582struct obj_string_patch {
589{
590 struct obj_string_patch *next; 583 struct obj_string_patch *next;
591 int reloc_secidx; 584 int reloc_secidx;
592 ElfW(Addr) reloc_offset; 585 ElfW(Addr) reloc_offset;
593 ElfW(Addr) string_offset; 586 ElfW(Addr) string_offset;
594}; 587};
595 588
596struct obj_symbol_patch 589struct obj_symbol_patch {
597{
598 struct obj_symbol_patch *next; 590 struct obj_symbol_patch *next;
599 int reloc_secidx; 591 int reloc_secidx;
600 ElfW(Addr) reloc_offset; 592 ElfW(Addr) reloc_offset;
@@ -805,12 +797,11 @@ static char *m_filename;
805static char *m_fullName; 797static char *m_fullName;
806 798
807 799
808
809/*======================================================================*/ 800/*======================================================================*/
810 801
811 802
812static int check_module_name_match(const char *filename, struct stat *statbuf, 803static int check_module_name_match(const char *filename, struct stat *statbuf,
813 void *userdata) 804 void *userdata)
814{ 805{
815 char *fullname = (char *) userdata; 806 char *fullname = (char *) userdata;
816 807
@@ -860,10 +851,10 @@ static struct obj_symbol *arch_new_symbol(void)
860 851
861static enum obj_reloc 852static enum obj_reloc
862arch_apply_relocation(struct obj_file *f, 853arch_apply_relocation(struct obj_file *f,
863 struct obj_section *targsec, 854 struct obj_section *targsec,
864 struct obj_section *symsec, 855 struct obj_section *symsec,
865 struct obj_symbol *sym, 856 struct obj_symbol *sym,
866 ElfW(RelM) *rel, ElfW(Addr) v) 857 ElfW(RelM) *rel, ElfW(Addr) v)
867{ 858{
868 struct arch_file *ifile = (struct arch_file *) f; 859 struct arch_file *ifile = (struct arch_file *) f;
869 enum obj_reloc ret = obj_reloc_ok; 860 enum obj_reloc ret = obj_reloc_ok;
@@ -1856,64 +1847,64 @@ static void arch_create_got(struct obj_file *f)
1856 1847
1857 switch (ELF_R_TYPE(rel->r_info)) { 1848 switch (ELF_R_TYPE(rel->r_info)) {
1858#if defined(__arm__) 1849#if defined(__arm__)
1859 case R_ARM_PC24: 1850 case R_ARM_PC24:
1860 case R_ARM_PLT32: 1851 case R_ARM_PLT32:
1861 plt_allocate = 1; 1852 plt_allocate = 1;
1862 break; 1853 break;
1863 1854
1864 case R_ARM_GOTOFF: 1855 case R_ARM_GOTOFF:
1865 case R_ARM_GOTPC: 1856 case R_ARM_GOTPC:
1866 got_needed = 1; 1857 got_needed = 1;
1867 continue; 1858 continue;
1868 1859
1869 case R_ARM_GOT32: 1860 case R_ARM_GOT32:
1870 got_allocate = 1; 1861 got_allocate = 1;
1871 break; 1862 break;
1872 1863
1873#elif defined(__i386__) 1864#elif defined(__i386__)
1874 case R_386_GOTPC: 1865 case R_386_GOTPC:
1875 case R_386_GOTOFF: 1866 case R_386_GOTOFF:
1876 got_needed = 1; 1867 got_needed = 1;
1877 continue; 1868 continue;
1878 1869
1879 case R_386_GOT32: 1870 case R_386_GOT32:
1880 got_allocate = 1; 1871 got_allocate = 1;
1881 break; 1872 break;
1882 1873
1883#elif defined(__powerpc__) 1874#elif defined(__powerpc__)
1884 case R_PPC_REL24: 1875 case R_PPC_REL24:
1885 plt_allocate = 1; 1876 plt_allocate = 1;
1886 break; 1877 break;
1887 1878
1888#elif defined(__mc68000__) 1879#elif defined(__mc68000__)
1889 case R_68K_GOT32: 1880 case R_68K_GOT32:
1890 got_allocate = 1; 1881 got_allocate = 1;
1891 break; 1882 break;
1892 1883
1893#ifdef R_68K_GOTOFF 1884#ifdef R_68K_GOTOFF
1894 case R_68K_GOTOFF: 1885 case R_68K_GOTOFF:
1895 got_needed = 1; 1886 got_needed = 1;
1896 continue; 1887 continue;
1897#endif 1888#endif
1898 1889
1899#elif defined(__sh__) 1890#elif defined(__sh__)
1900 case R_SH_GOT32: 1891 case R_SH_GOT32:
1901 got_allocate = 1; 1892 got_allocate = 1;
1902 break; 1893 break;
1903 1894
1904 case R_SH_GOTPC: 1895 case R_SH_GOTPC:
1905 case R_SH_GOTOFF: 1896 case R_SH_GOTOFF:
1906 got_needed = 1; 1897 got_needed = 1;
1907 continue; 1898 continue;
1908 1899
1909#elif defined (__v850e__) 1900#elif defined (__v850e__)
1910 case R_V850_22_PCREL: 1901 case R_V850_22_PCREL:
1911 plt_needed = 1; 1902 plt_needed = 1;
1912 break; 1903 break;
1913 1904
1914#endif 1905#endif
1915 default: 1906 default:
1916 continue; 1907 continue;
1917 } 1908 }
1918 1909
1919 if (extsym->st_name != 0) { 1910 if (extsym->st_name != 0) {
@@ -2047,9 +2038,9 @@ obj_set_symbol_compare(struct obj_file *f,
2047 2038
2048static struct obj_symbol * 2039static struct obj_symbol *
2049obj_add_symbol(struct obj_file *f, const char *name, 2040obj_add_symbol(struct obj_file *f, const char *name,
2050 unsigned long symidx, int info, 2041 unsigned long symidx, int info,
2051 int secidx, ElfW(Addr) value, 2042 int secidx, ElfW(Addr) value,
2052 unsigned long size) 2043 unsigned long size)
2053{ 2044{
2054 struct obj_symbol *sym; 2045 struct obj_symbol *sym;
2055 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; 2046 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
@@ -2153,8 +2144,7 @@ obj_find_symbol(struct obj_file *f, const char *name)
2153 return NULL; 2144 return NULL;
2154} 2145}
2155 2146
2156static ElfW(Addr) 2147static ElfW(Addr) obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2157 obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2158{ 2148{
2159 if (sym) { 2149 if (sym) {
2160 if (sym->secidx >= SHN_LORESERVE) 2150 if (sym->secidx >= SHN_LORESERVE)
@@ -2213,9 +2203,9 @@ obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
2213} 2203}
2214 2204
2215static struct obj_section *obj_create_alloced_section(struct obj_file *f, 2205static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2216 const char *name, 2206 const char *name,
2217 unsigned long align, 2207 unsigned long align,
2218 unsigned long size) 2208 unsigned long size)
2219{ 2209{
2220 int newidx = f->header.e_shnum++; 2210 int newidx = f->header.e_shnum++;
2221 struct obj_section *sec; 2211 struct obj_section *sec;
@@ -2239,9 +2229,9 @@ static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2239} 2229}
2240 2230
2241static struct obj_section *obj_create_alloced_section_first(struct obj_file *f, 2231static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
2242 const char *name, 2232 const char *name,
2243 unsigned long align, 2233 unsigned long align,
2244 unsigned long size) 2234 unsigned long size)
2245{ 2235{
2246 int newidx = f->header.e_shnum++; 2236 int newidx = f->header.e_shnum++;
2247 struct obj_section *sec; 2237 struct obj_section *sec;
@@ -2478,50 +2468,50 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2478 return 0; 2468 return 0;
2479 } else if (*q == '\\') 2469 } else if (*q == '\\')
2480 switch (*++q) { 2470 switch (*++q) {
2481 case 'a': 2471 case 'a':
2482 *r = '\a'; 2472 *r = '\a';
2483 break; 2473 break;
2484 case 'b': 2474 case 'b':
2485 *r = '\b'; 2475 *r = '\b';
2486 break; 2476 break;
2487 case 'e': 2477 case 'e':
2488 *r = '\033'; 2478 *r = '\033';
2489 break; 2479 break;
2490 case 'f': 2480 case 'f':
2491 *r = '\f'; 2481 *r = '\f';
2492 break; 2482 break;
2493 case 'n': 2483 case 'n':
2494 *r = '\n'; 2484 *r = '\n';
2495 break; 2485 break;
2496 case 'r': 2486 case 'r':
2497 *r = '\r'; 2487 *r = '\r';
2498 break; 2488 break;
2499 case 't': 2489 case 't':
2500 *r = '\t'; 2490 *r = '\t';
2501 break; 2491 break;
2502 2492
2503 case '0': 2493 case '0':
2504 case '1': 2494 case '1':
2505 case '2': 2495 case '2':
2506 case '3': 2496 case '3':
2507 case '4': 2497 case '4':
2508 case '5': 2498 case '5':
2509 case '6': 2499 case '6':
2510 case '7': 2500 case '7':
2511 { 2501 {
2512 int c = *q - '0'; 2502 int c = *q - '0';
2513 if (q[1] >= '0' && q[1] <= '7') { 2503 if (q[1] >= '0' && q[1] <= '7') {
2504 c = (c * 8) + *++q - '0';
2505 if (q[1] >= '0' && q[1] <= '7')
2514 c = (c * 8) + *++q - '0'; 2506 c = (c * 8) + *++q - '0';
2515 if (q[1] >= '0' && q[1] <= '7')
2516 c = (c * 8) + *++q - '0';
2517 }
2518 *r = c;
2519 } 2507 }
2520 break; 2508 *r = c;
2509 }
2510 break;
2521 2511
2522 default: 2512 default:
2523 *r = *q; 2513 *r = *q;
2524 break; 2514 break;
2525 } else 2515 } else
2526 *r = *q; 2516 *r = *q;
2527 } 2517 }
@@ -2587,51 +2577,51 @@ new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2587 } else { 2577 } else {
2588 long v = strtoul(q, &q, 0); 2578 long v = strtoul(q, &q, 0);
2589 switch (*p) { 2579 switch (*p) {
2590 case 'b': 2580 case 'b':
2591 *loc++ = v; 2581 *loc++ = v;
2592 break; 2582 break;
2593 case 'h': 2583 case 'h':
2594 *(short *) loc = v; 2584 *(short *) loc = v;
2595 loc += tgt_sizeof_short; 2585 loc += tgt_sizeof_short;
2596 break; 2586 break;
2597 case 'i': 2587 case 'i':
2598 *(int *) loc = v; 2588 *(int *) loc = v;
2599 loc += tgt_sizeof_int; 2589 loc += tgt_sizeof_int;
2600 break; 2590 break;
2601 case 'l': 2591 case 'l':
2602 *(long *) loc = v; 2592 *(long *) loc = v;
2603 loc += tgt_sizeof_long; 2593 loc += tgt_sizeof_long;
2604 break; 2594 break;
2605 2595
2606 default: 2596 default:
2607 bb_error_msg("unknown parameter type '%c' for %s", *p, key); 2597 bb_error_msg("unknown parameter type '%c' for %s", *p, key);
2608 return 0; 2598 return 0;
2609 } 2599 }
2610 } 2600 }
2611 2601
2612retry_end_of_value: 2602retry_end_of_value:
2613 switch (*q) { 2603 switch (*q) {
2614 case '\0': 2604 case '\0':
2615 goto end_of_arg; 2605 goto end_of_arg;
2616 2606
2617 case ' ': 2607 case ' ':
2618 case '\t': 2608 case '\t':
2619 case '\n': 2609 case '\n':
2620 case '\r': 2610 case '\r':
2621 ++q; 2611 ++q;
2622 goto retry_end_of_value; 2612 goto retry_end_of_value;
2623 2613
2624 case ',': 2614 case ',':
2625 if (++n > max) { 2615 if (++n > max) {
2626 bb_error_msg("too many values for %s (max %d)", key, max); 2616 bb_error_msg("too many values for %s (max %d)", key, max);
2627 return 0;
2628 }
2629 ++q;
2630 break;
2631
2632 default:
2633 bb_error_msg("invalid argument syntax for %s", key);
2634 return 0; 2617 return 0;
2618 }
2619 ++q;
2620 break;
2621
2622 default:
2623 bb_error_msg("invalid argument syntax for %s", key);
2624 return 0;
2635 } 2625 }
2636 } 2626 }
2637 2627
@@ -2712,7 +2702,7 @@ retry_modules_load:
2712 2702
2713 /* Collect the modules' symbols. */ 2703 /* Collect the modules' symbols. */
2714 2704
2715 if (nmod){ 2705 if (nmod) {
2716 ext_modules = modules = xmalloc(nmod * sizeof(*modules)); 2706 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2717 memset(modules, 0, nmod * sizeof(*modules)); 2707 memset(modules, 0, nmod * sizeof(*modules));
2718 for (i = 0, mn = module_names, m = modules; 2708 for (i = 0, mn = module_names, m = modules;
@@ -2878,9 +2868,7 @@ static int new_create_module_ksymtab(struct obj_file *f)
2878 size_t nsyms; 2868 size_t nsyms;
2879 int *loaded; 2869 int *loaded;
2880 2870
2881 sec = 2871 sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0);
2882 obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p,
2883 0);
2884 2872
2885 /* We don't want to export symbols residing in sections that 2873 /* We don't want to export symbols residing in sections that
2886 aren't loaded. There are a number of these created so that 2874 aren't loaded. There are a number of these created so that
@@ -3269,29 +3257,30 @@ static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
3269 3257
3270 /* Do it! */ 3258 /* Do it! */
3271 switch (arch_apply_relocation 3259 switch (arch_apply_relocation
3272 (f, targsec, symsec, intsym, rel, value)) { 3260 (f, targsec, symsec, intsym, rel, value)
3273 case obj_reloc_ok: 3261 ) {
3274 break; 3262 case obj_reloc_ok:
3263 break;
3275 3264
3276 case obj_reloc_overflow: 3265 case obj_reloc_overflow:
3277 errmsg = "Relocation overflow"; 3266 errmsg = "Relocation overflow";
3278 goto bad_reloc; 3267 goto bad_reloc;
3279 case obj_reloc_dangerous: 3268 case obj_reloc_dangerous:
3280 errmsg = "Dangerous relocation"; 3269 errmsg = "Dangerous relocation";
3281 goto bad_reloc; 3270 goto bad_reloc;
3282 case obj_reloc_unhandled: 3271 case obj_reloc_unhandled:
3283 errmsg = "Unhandled relocation"; 3272 errmsg = "Unhandled relocation";
3284bad_reloc: 3273bad_reloc:
3285 if (extsym) { 3274 if (extsym) {
3286 bb_error_msg("%s of type %ld for %s", errmsg, 3275 bb_error_msg("%s of type %ld for %s", errmsg,
3287 (long) ELF_R_TYPE(rel->r_info), 3276 (long) ELF_R_TYPE(rel->r_info),
3288 strtab + extsym->st_name); 3277 strtab + extsym->st_name);
3289 } else { 3278 } else {
3290 bb_error_msg("%s of type %ld", errmsg, 3279 bb_error_msg("%s of type %ld", errmsg,
3291 (long) ELF_R_TYPE(rel->r_info)); 3280 (long) ELF_R_TYPE(rel->r_info));
3292 } 3281 }
3293 ret = 0; 3282 ret = 0;
3294 break; 3283 break;
3295 } 3284 }
3296 } 3285 }
3297 } 3286 }
@@ -3419,7 +3408,8 @@ static struct obj_file *obj_load(FILE * fp, int loadprogbits)
3419 sec->header = section_headers[i]; 3408 sec->header = section_headers[i];
3420 sec->idx = i; 3409 sec->idx = i;
3421 3410
3422 if(sec->header.sh_size) switch (sec->header.sh_type) { 3411 if(sec->header.sh_size) {
3412 switch (sec->header.sh_type) {
3423 case SHT_NULL: 3413 case SHT_NULL:
3424 case SHT_NOTE: 3414 case SHT_NOTE:
3425 case SHT_NOBITS: 3415 case SHT_NOBITS:
@@ -3470,6 +3460,7 @@ static struct obj_file *obj_load(FILE * fp, int loadprogbits)
3470 bb_error_msg("can't handle sections of type %ld", 3460 bb_error_msg("can't handle sections of type %ld",
3471 (long) sec->header.sh_type); 3461 (long) sec->header.sh_type);
3472 return NULL; 3462 return NULL;
3463 }
3473 } 3464 }
3474 } 3465 }
3475 3466
@@ -3495,67 +3486,66 @@ static struct obj_file *obj_load(FILE * fp, int loadprogbits)
3495 obj_insert_section_load_order(f, sec); 3486 obj_insert_section_load_order(f, sec);
3496 3487
3497 switch (sec->header.sh_type) { 3488 switch (sec->header.sh_type) {
3498 case SHT_SYMTAB: 3489 case SHT_SYMTAB:
3499 { 3490 {
3500 unsigned long nsym, j; 3491 unsigned long nsym, j;
3501 char *strtab; 3492 char *strtab;
3502 ElfW(Sym) * sym; 3493 ElfW(Sym) * sym;
3503
3504 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3505 bb_error_msg("symbol size mismatch: %lu != %lu",
3506 (unsigned long) sec->header.sh_entsize,
3507 (unsigned long) sizeof(ElfW(Sym)));
3508 return NULL;
3509 }
3510 3494
3511 nsym = sec->header.sh_size / sizeof(ElfW(Sym)); 3495 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3512 strtab = f->sections[sec->header.sh_link]->contents; 3496 bb_error_msg("symbol size mismatch: %lu != %lu",
3513 sym = (ElfW(Sym) *) sec->contents; 3497 (unsigned long) sec->header.sh_entsize,
3514 3498 (unsigned long) sizeof(ElfW(Sym)));
3515 /* Allocate space for a table of local symbols. */ 3499 return NULL;
3516 j = f->local_symtab_size = sec->header.sh_info; 3500 }
3517 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3518
3519 /* Insert all symbols into the hash table. */
3520 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3521 ElfW(Addr) val = sym->st_value;
3522 const char *name;
3523 if (sym->st_name)
3524 name = strtab + sym->st_name;
3525 else if (sym->st_shndx < shnum)
3526 name = f->sections[sym->st_shndx]->name;
3527 else
3528 continue;
3529 3501
3502 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3503 strtab = f->sections[sec->header.sh_link]->contents;
3504 sym = (ElfW(Sym) *) sec->contents;
3505
3506 /* Allocate space for a table of local symbols. */
3507 j = f->local_symtab_size = sec->header.sh_info;
3508 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3509
3510 /* Insert all symbols into the hash table. */
3511 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3512 ElfW(Addr) val = sym->st_value;
3513 const char *name;
3514 if (sym->st_name)
3515 name = strtab + sym->st_name;
3516 else if (sym->st_shndx < shnum)
3517 name = f->sections[sym->st_shndx]->name;
3518 else
3519 continue;
3530#if defined(__SH5__) 3520#if defined(__SH5__)
3531 /* 3521 /*
3532 * For sh64 it is possible that the target of a branch 3522 * For sh64 it is possible that the target of a branch
3533 * requires a mode switch (32 to 16 and back again). 3523 * requires a mode switch (32 to 16 and back again).
3534 * 3524 *
3535 * This is implied by the lsb being set in the target 3525 * This is implied by the lsb being set in the target
3536 * address for SHmedia mode and clear for SHcompact. 3526 * address for SHmedia mode and clear for SHcompact.
3537 */ 3527 */
3538 val |= sym->st_other & 4; 3528 val |= sym->st_other & 4;
3539#endif 3529#endif
3540 3530
3541 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, 3531 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3542 val, sym->st_size); 3532 val, sym->st_size);
3543 }
3544 } 3533 }
3545 break; 3534 }
3535 break;
3546 3536
3547 case SHT_RELM: 3537 case SHT_RELM:
3548 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) { 3538 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3549 bb_error_msg("relocation entry size mismatch: %lu != %lu", 3539 bb_error_msg("relocation entry size mismatch: %lu != %lu",
3550 (unsigned long) sec->header.sh_entsize, 3540 (unsigned long) sec->header.sh_entsize,
3551 (unsigned long) sizeof(ElfW(RelM))); 3541 (unsigned long) sizeof(ElfW(RelM)));
3552 return NULL; 3542 return NULL;
3553 } 3543 }
3554 break; 3544 break;
3555 /* XXX Relocation code from modutils-2.3.19 is not here. 3545 /* XXX Relocation code from modutils-2.3.19 is not here.
3556 * Why? That's about 20 lines of code from obj/obj_load.c, 3546 * Why? That's about 20 lines of code from obj/obj_load.c,
3557 * which gets done in a second pass through the sections. 3547 * which gets done in a second pass through the sections.
3558 * This BusyBox insmod does similar work in obj_relocate(). */ 3548 * This BusyBox insmod does similar work in obj_relocate(). */
3559 } 3549 }
3560 } 3550 }
3561 3551
@@ -3606,10 +3596,11 @@ static void hide_special_symbols(struct obj_file *f)
3606 struct obj_symbol *sym; 3596 struct obj_symbol *sym;
3607 const char *const *p; 3597 const char *const *p;
3608 3598
3609 for (p = specials; *p; ++p) 3599 for (p = specials; *p; ++p) {
3610 if ((sym = obj_find_symbol(f, *p)) != NULL) 3600 sym = obj_find_symbol(f, *p);
3611 sym->info = 3601 if (sym != NULL)
3612 ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info)); 3602 sym->info = ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info));
3603 }
3613} 3604}
3614 3605
3615 3606
@@ -3629,12 +3620,14 @@ static int obj_gpl_license(struct obj_file *f, const char **license)
3629 "Dual MPL/GPL", 3620 "Dual MPL/GPL",
3630 }; 3621 };
3631 3622
3632 if ((sec = obj_find_section(f, ".modinfo"))) { 3623 sec = obj_find_section(f, ".modinfo");
3624 if (sec) {
3633 const char *value, *ptr, *endptr; 3625 const char *value, *ptr, *endptr;
3634 ptr = sec->contents; 3626 ptr = sec->contents;
3635 endptr = ptr + sec->header.sh_size; 3627 endptr = ptr + sec->header.sh_size;
3636 while (ptr < endptr) { 3628 while (ptr < endptr) {
3637 if ((value = strchr(ptr, '=')) && strncmp(ptr, "license", value-ptr) == 0) { 3629 value = strchr(ptr, '=');
3630 if (value && strncmp(ptr, "license", value-ptr) == 0) {
3638 int i; 3631 int i;
3639 if (license) 3632 if (license)
3640 *license = value+1; 3633 *license = value+1;
@@ -3690,7 +3683,8 @@ static void check_tainted_module(struct obj_file *f, char *m_name)
3690 const char *ptr; 3683 const char *ptr;
3691 3684
3692 kernel_has_tainted = 1; 3685 kernel_has_tainted = 1;
3693 if ((fd = open(tainted_file, O_RDWR)) < 0) { 3686 fd = open(tainted_file, O_RDWR);
3687 if (fd < 0) {
3694 if (errno == ENOENT) 3688 if (errno == ENOENT)
3695 kernel_has_tainted = 0; 3689 kernel_has_tainted = 0;
3696 else if (errno == EACCES) 3690 else if (errno == EACCES)
@@ -3957,7 +3951,7 @@ void print_load_map(struct obj_file *f);
3957 3951
3958int insmod_main( int argc, char **argv) 3952int insmod_main( int argc, char **argv)
3959{ 3953{
3960 char *opt_o; 3954 char *opt_o, *arg1;
3961 int len; 3955 int len;
3962 int k_crcs; 3956 int k_crcs;
3963 char *tmp, *tmp1; 3957 char *tmp, *tmp1;
@@ -3983,17 +3977,18 @@ int insmod_main( int argc, char **argv)
3983 3977
3984 /* Parse any options */ 3978 /* Parse any options */
3985 getopt32(argc, argv, OPTION_STR, &opt_o); 3979 getopt32(argc, argv, OPTION_STR, &opt_o);
3980 arg1 = argv[optind];
3986 if (option_mask32 & OPT_o) { // -o /* name the output module */ 3981 if (option_mask32 & OPT_o) { // -o /* name the output module */
3987 free(m_name); 3982 free(m_name);
3988 m_name = xstrdup(opt_o); 3983 m_name = xstrdup(opt_o);
3989 } 3984 }
3990 3985
3991 if (argv[optind] == NULL) { 3986 if (arg1 == NULL) {
3992 bb_show_usage(); 3987 bb_show_usage();
3993 } 3988 }
3994 3989
3995 /* Grab the module name */ 3990 /* Grab the module name */
3996 tmp1 = xstrdup(argv[optind]); 3991 tmp1 = xstrdup(arg1);
3997 tmp = basename(tmp1); 3992 tmp = basename(tmp1);
3998 len = strlen(tmp); 3993 len = strlen(tmp);
3999 3994
@@ -4004,15 +3999,15 @@ int insmod_main( int argc, char **argv)
4004 } 3999 }
4005 4000
4006#if defined(CONFIG_FEATURE_2_6_MODULES) 4001#if defined(CONFIG_FEATURE_2_6_MODULES)
4007 if (k_version > 4 && len > 3 && tmp[len - 3] == '.' && 4002 if (k_version > 4 && len > 3 && tmp[len - 3] == '.'
4008 tmp[len - 2] == 'k' && tmp[len - 1] == 'o') { 4003 && tmp[len - 2] == 'k' && tmp[len - 1] == 'o'
4009 len-=3; 4004 ) {
4005 len -= 3;
4010 tmp[len] = '\0'; 4006 tmp[len] = '\0';
4011 } 4007 } else
4012 else
4013#endif 4008#endif
4014 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') { 4009 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
4015 len-=2; 4010 len -= 2;
4016 tmp[len] = '\0'; 4011 tmp[len] = '\0';
4017 } 4012 }
4018 4013
@@ -4032,8 +4027,9 @@ int insmod_main( int argc, char **argv)
4032 } 4027 }
4033 4028
4034 /* Get a filedesc for the module. Check we we have a complete path */ 4029 /* Get a filedesc for the module. Check we we have a complete path */
4035 if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) || 4030 if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
4036 (fp = fopen(argv[optind], "r")) == NULL) { 4031 || (fp = fopen(arg1, "r")) == NULL
4032 ) {
4037 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`, 4033 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
4038 * but do not error out yet if we fail to find it... */ 4034 * but do not error out yet if we fail to find it... */
4039 if (k_version) { /* uname succeedd */ 4035 if (k_version) { /* uname succeedd */
@@ -4047,7 +4043,7 @@ int insmod_main( int argc, char **argv)
4047 * follow symlinks, but we do want to follow the 4043 * follow symlinks, but we do want to follow the
4048 * /lib/modules/`uname -r` dir, So resolve it ourselves 4044 * /lib/modules/`uname -r` dir, So resolve it ourselves
4049 * if it is a link... */ 4045 * if it is a link... */
4050 if (realpath (tmdn, real_module_dir) == NULL) 4046 if (realpath(tmdn, real_module_dir) == NULL)
4051 module_dir = tmdn; 4047 module_dir = tmdn;
4052 else 4048 else
4053 module_dir = real_module_dir; 4049 module_dir = real_module_dir;
@@ -4057,8 +4053,7 @@ int insmod_main( int argc, char **argv)
4057 } 4053 }
4058 4054
4059 /* Check if we have found anything yet */ 4055 /* Check if we have found anything yet */
4060 if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL)) 4056 if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL)) {
4061 {
4062 char module_dir[FILENAME_MAX]; 4057 char module_dir[FILENAME_MAX];
4063 4058
4064 free(m_filename); 4059 free(m_filename);
@@ -4067,12 +4062,12 @@ int insmod_main( int argc, char **argv)
4067 strcpy(module_dir, _PATH_MODULES); 4062 strcpy(module_dir, _PATH_MODULES);
4068 /* No module found under /lib/modules/`uname -r`, this 4063 /* No module found under /lib/modules/`uname -r`, this
4069 * time cast the net a bit wider. Search /lib/modules/ */ 4064 * time cast the net a bit wider. Search /lib/modules/ */
4070 if (! recursive_action(module_dir, TRUE, FALSE, FALSE, 4065 if (!recursive_action(module_dir, TRUE, FALSE, FALSE,
4071 check_module_name_match, 0, m_fullName)) 4066 check_module_name_match, 0, m_fullName)
4072 { 4067 ) {
4073 if (m_filename == 0 4068 if (m_filename == 0
4074 || ((fp = fopen(m_filename, "r")) == NULL)) 4069 || ((fp = fopen(m_filename, "r")) == NULL)
4075 { 4070 ) {
4076 bb_error_msg("%s: no module by that name found", m_fullName); 4071 bb_error_msg("%s: no module by that name found", m_fullName);
4077 goto out; 4072 goto out;
4078 } 4073 }
@@ -4080,22 +4075,22 @@ int insmod_main( int argc, char **argv)
4080 bb_error_msg_and_die("%s: no module by that name found", m_fullName); 4075 bb_error_msg_and_die("%s: no module by that name found", m_fullName);
4081 } 4076 }
4082 } else 4077 } else
4083 m_filename = xstrdup(argv[optind]); 4078 m_filename = xstrdup(arg1);
4084 4079
4085 if (flag_verbose) 4080 if (flag_verbose)
4086 printf("Using %s\n", m_filename); 4081 printf("Using %s\n", m_filename);
4087 4082
4088#ifdef CONFIG_FEATURE_2_6_MODULES 4083#ifdef CONFIG_FEATURE_2_6_MODULES
4089 if (k_version > 4) 4084 if (k_version > 4) {
4090 { 4085 argv[optind] = m_filename;
4091 optind--; 4086 optind--;
4092 argv[optind + 1] = m_filename;
4093 return insmod_ng_main(argc - optind, argv + optind); 4087 return insmod_ng_main(argc - optind, argv + optind);
4094 } 4088 }
4095#endif 4089#endif
4096 4090
4097 if ((f = obj_load(fp, LOADBITS)) == NULL) 4091 f = obj_load(fp, LOADBITS);
4098 bb_perror_msg_and_die("Could not load the module"); 4092 if (f == NULL)
4093 bb_perror_msg_and_die("cannot load the module");
4099 4094
4100 if (get_modinfo_value(f, "kernel_version") == NULL) 4095 if (get_modinfo_value(f, "kernel_version") == NULL)
4101 m_has_modinfo = 0; 4096 m_has_modinfo = 0;
@@ -4157,8 +4152,7 @@ int insmod_main( int argc, char **argv)
4157 4152
4158 /* Allocate common symbols, symbol tables, and string tables. */ 4153 /* Allocate common symbols, symbol tables, and string tables. */
4159 4154
4160 if (!new_create_this_module(f, m_name)) 4155 if (!new_create_this_module(f, m_name)) {
4161 {
4162 goto out; 4156 goto out;
4163 } 4157 }
4164 4158
@@ -4170,10 +4164,8 @@ int insmod_main( int argc, char **argv)
4170 4164
4171 /* done with the module name, on to the optional var=value arguments */ 4165 /* done with the module name, on to the optional var=value arguments */
4172 ++optind; 4166 ++optind;
4173
4174 if (optind < argc) { 4167 if (optind < argc) {
4175 if (!new_process_module_arguments(f, argc - optind, argv + optind)) 4168 if (!new_process_module_arguments(f, argc - optind, argv + optind)) {
4176 {
4177 goto out; 4169 goto out;
4178 } 4170 }
4179 } 4171 }
@@ -4221,8 +4213,7 @@ int insmod_main( int argc, char **argv)
4221 goto out; 4213 goto out;
4222 } 4214 }
4223 4215
4224 if (!new_init_module(m_name, f, m_size)) 4216 if (!new_init_module(m_name, f, m_size)) {
4225 {
4226 delete_module(m_name); 4217 delete_module(m_name);
4227 goto out; 4218 goto out;
4228 } 4219 }
@@ -4259,16 +4250,16 @@ out:
4259static const char *moderror(int err) 4250static const char *moderror(int err)
4260{ 4251{
4261 switch (err) { 4252 switch (err) {
4262 case ENOEXEC: 4253 case ENOEXEC:
4263 return "Invalid module format"; 4254 return "Invalid module format";
4264 case ENOENT: 4255 case ENOENT:
4265 return "Unknown symbol in module"; 4256 return "Unknown symbol in module";
4266 case ESRCH: 4257 case ESRCH:
4267 return "Module has wrong symbol version"; 4258 return "Module has wrong symbol version";
4268 case EINVAL: 4259 case EINVAL:
4269 return "Invalid parameters"; 4260 return "Invalid parameters";
4270 default: 4261 default:
4271 return strerror(err); 4262 return strerror(err);
4272 } 4263 }
4273} 4264}
4274 4265