diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-04-25 17:22:32 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-04-25 17:22:32 +0000 |
commit | 4f4bcfcd1a3b57317f601eeca5c61ed8916468f6 (patch) | |
tree | c6c213e9af883b283d6a6a5d9d380982e4656670 /modutils | |
parent | c57a75d896431eda8d1c3dd018b34706bea67e81 (diff) | |
download | busybox-w32-4f4bcfcd1a3b57317f601eeca5c61ed8916468f6.tar.gz busybox-w32-4f4bcfcd1a3b57317f601eeca5c61ed8916468f6.tar.bz2 busybox-w32-4f4bcfcd1a3b57317f601eeca5c61ed8916468f6.zip |
Some more cleanups for insmod from Larry.
-Erik
Diffstat (limited to 'modutils')
-rw-r--r-- | modutils/insmod.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/modutils/insmod.c b/modutils/insmod.c index c6642a052..4dd14c6bc 100644 --- a/modutils/insmod.c +++ b/modutils/insmod.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | 1 | /* vi: set sw=4 ts=4: */ |
2 | /* | 2 | /* |
3 | * Mini insmod implementation for busybox | 3 | * Mini insmod implementation for busybox |
4 | * This version of insmod now supports x86, ARM, SH3/4, powerpc, and MIPS. | ||
4 | * | 5 | * |
5 | * Copyright (C) 1999,2000,2001 by Lineo, inc. | 6 | * Copyright (C) 1999,2000,2001 by Lineo, inc. |
6 | * Written by Erik Andersen <andersen@lineo.com> | 7 | * Written by Erik Andersen <andersen@lineo.com> |
@@ -123,7 +124,7 @@ | |||
123 | #ifndef MODUTILS_MODULE_H | 124 | #ifndef MODUTILS_MODULE_H |
124 | static const int MODUTILS_MODULE_H = 1; | 125 | static const int MODUTILS_MODULE_H = 1; |
125 | 126 | ||
126 | #ident "$Id: insmod.c,v 1.58 2001/04/24 21:41:41 andersen Exp $" | 127 | #ident "$Id: insmod.c,v 1.59 2001/04/25 17:22:32 andersen Exp $" |
127 | 128 | ||
128 | /* This file contains the structures used by the 2.0 and 2.1 kernels. | 129 | /* This file contains the structures used by the 2.0 and 2.1 kernels. |
129 | We do not use the kernel headers directly because we do not wish | 130 | We do not use the kernel headers directly because we do not wish |
@@ -329,7 +330,7 @@ int delete_module(const char *); | |||
329 | #ifndef MODUTILS_OBJ_H | 330 | #ifndef MODUTILS_OBJ_H |
330 | static const int MODUTILS_OBJ_H = 1; | 331 | static const int MODUTILS_OBJ_H = 1; |
331 | 332 | ||
332 | #ident "$Id: insmod.c,v 1.58 2001/04/24 21:41:41 andersen Exp $" | 333 | #ident "$Id: insmod.c,v 1.59 2001/04/25 17:22:32 andersen Exp $" |
333 | 334 | ||
334 | /* The relocatable object is manipulated using elfin types. */ | 335 | /* The relocatable object is manipulated using elfin types. */ |
335 | 336 | ||
@@ -1787,7 +1788,10 @@ static int old_get_kernel_symbols(const char *m_name) | |||
1787 | 1788 | ||
1788 | nks = get_kernel_syms(NULL); | 1789 | nks = get_kernel_syms(NULL); |
1789 | if (nks <= 0) { | 1790 | if (nks <= 0) { |
1790 | perror_msg("get_kernel_syms: %s", m_name); | 1791 | if (nks) |
1792 | perror_msg("get_kernel_syms: %s", m_name); | ||
1793 | else | ||
1794 | error_msg("No kernel symbols"); | ||
1791 | return 0; | 1795 | return 0; |
1792 | } | 1796 | } |
1793 | 1797 | ||
@@ -1807,7 +1811,6 @@ static int old_get_kernel_symbols(const char *m_name) | |||
1807 | 1811 | ||
1808 | while (k->name[0] == '#' && k->name[1]) { | 1812 | while (k->name[0] == '#' && k->name[1]) { |
1809 | struct old_kernel_sym *k2; | 1813 | struct old_kernel_sym *k2; |
1810 | struct new_module_symbol *s; | ||
1811 | 1814 | ||
1812 | /* Find out how many symbols this module has. */ | 1815 | /* Find out how many symbols this module has. */ |
1813 | for (k2 = k + 1; k2->name[0] != '#'; ++k2) | 1816 | for (k2 = k + 1; k2->name[0] != '#'; ++k2) |
@@ -2277,7 +2280,7 @@ static int new_get_kernel_symbols(void) | |||
2277 | module_names = xmalloc(bufsize = 256); | 2280 | module_names = xmalloc(bufsize = 256); |
2278 | retry_modules_load: | 2281 | retry_modules_load: |
2279 | if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { | 2282 | if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { |
2280 | if (errno == ENOSPC) { | 2283 | if (errno == ENOSPC && bufsize < ret) { |
2281 | module_names = xrealloc(module_names, bufsize = ret); | 2284 | module_names = xrealloc(module_names, bufsize = ret); |
2282 | goto retry_modules_load; | 2285 | goto retry_modules_load; |
2283 | } | 2286 | } |
@@ -2338,7 +2341,7 @@ static int new_get_kernel_symbols(void) | |||
2338 | syms = xmalloc(bufsize = 16 * 1024); | 2341 | syms = xmalloc(bufsize = 16 * 1024); |
2339 | retry_kern_sym_load: | 2342 | retry_kern_sym_load: |
2340 | if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { | 2343 | if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { |
2341 | if (errno == ENOSPC) { | 2344 | if (errno == ENOSPC && bufsize < ret) { |
2342 | syms = xrealloc(syms, bufsize = ret); | 2345 | syms = xrealloc(syms, bufsize = ret); |
2343 | goto retry_kern_sym_load; | 2346 | goto retry_kern_sym_load; |
2344 | } | 2347 | } |
@@ -3022,6 +3025,12 @@ struct obj_file *obj_load(FILE * fp) | |||
3022 | for (i = 0; i < shnum; ++i) { | 3025 | for (i = 0; i < shnum; ++i) { |
3023 | struct obj_section *sec = f->sections[i]; | 3026 | struct obj_section *sec = f->sections[i]; |
3024 | 3027 | ||
3028 | /* .modinfo should be contents only but gcc has no attribute for that. | ||
3029 | * The kernel may have marked .modinfo as ALLOC, ignore this bit. | ||
3030 | */ | ||
3031 | if (strcmp(sec->name, ".modinfo") == 0) | ||
3032 | sec->header.sh_flags &= ~SHF_ALLOC; | ||
3033 | |||
3025 | if (sec->header.sh_flags & SHF_ALLOC) | 3034 | if (sec->header.sh_flags & SHF_ALLOC) |
3026 | obj_insert_section_load_order(f, sec); | 3035 | obj_insert_section_load_order(f, sec); |
3027 | 3036 | ||
@@ -3045,22 +3054,20 @@ struct obj_file *obj_load(FILE * fp) | |||
3045 | 3054 | ||
3046 | /* Allocate space for a table of local symbols. */ | 3055 | /* Allocate space for a table of local symbols. */ |
3047 | j = f->local_symtab_size = sec->header.sh_info; | 3056 | j = f->local_symtab_size = sec->header.sh_info; |
3048 | f->local_symtab = xmalloc(j *= | 3057 | f->local_symtab = xcalloc(j, sizeof(struct obj_symbol *)); |
3049 | sizeof(struct obj_symbol *)); | ||
3050 | memset(f->local_symtab, 0, j); | ||
3051 | 3058 | ||
3052 | /* Insert all symbols into the hash table. */ | 3059 | /* Insert all symbols into the hash table. */ |
3053 | for (j = 1, ++sym; j < nsym; ++j, ++sym) { | 3060 | for (j = 1, ++sym; j < nsym; ++j, ++sym) { |
3054 | const char *name; | 3061 | const char *name; |
3055 | if (sym->st_name) | 3062 | if (sym->st_name) |
3056 | name = strtab + sym->st_name; | 3063 | name = strtab + sym->st_name; |
3057 | else | 3064 | else |
3058 | name = f->sections[sym->st_shndx]->name; | 3065 | name = f->sections[sym->st_shndx]->name; |
3059 | 3066 | ||
3060 | obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, | 3067 | obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, |
3061 | sym->st_value, sym->st_size); | 3068 | sym->st_value, sym->st_size); |
3062 | } | 3069 | } |
3063 | } | 3070 | } |
3064 | break; | 3071 | break; |
3065 | 3072 | ||
3066 | case SHT_RELM: | 3073 | case SHT_RELM: |
@@ -3071,6 +3078,10 @@ struct obj_file *obj_load(FILE * fp) | |||
3071 | return NULL; | 3078 | return NULL; |
3072 | } | 3079 | } |
3073 | break; | 3080 | break; |
3081 | /* XXX Relocation code from modutils-2.3.19 is not here. | ||
3082 | * Why? That's about 20 lines of code from obj/obj_load.c, | ||
3083 | * which gets done in a second pass through the sections. | ||
3084 | * This BusyBox insmod does similar work in obj_relocate(). */ | ||
3074 | } | 3085 | } |
3075 | } | 3086 | } |
3076 | 3087 | ||