1 /* vi: set sw=4 ts=4: */
3 * Mini insmod implementation for busybox
5 * This version of insmod supports ARM, CRIS, H8/300, x86, ia64, x86_64,
6 * m68k, MIPS, PowerPC, S390, SH3/4/5, Sparc, v850e, and x86_64.
8 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
9 * and Ron Alder <alder@lineo.com>
11 * Rodney Radford <rradford@mindspring.com> 17-Aug-2004.
12 * Added x86_64 support.
14 * Miles Bader <miles@gnu.org> added NEC V850E support.
16 * Modified by Bryan Rittmeyer <bryan@ixiacom.com> to support SH4
17 * and (theoretically) SH3. I have only tested SH4 in little endian mode.
19 * Modified by Alcove, Julien Gaulmin <julien.gaulmin@alcove.fr> and
20 * Nicolas Ferre <nicolas.ferre@alcove.fr> to support ARM7TDMI. Only
21 * very minor changes required to also work with StrongArm and presumably
22 * all ARM based systems.
24 * Yoshinori Sato <ysato@users.sourceforge.jp> 19-May-2004.
25 * added Renesas H8/300 support.
27 * Paul Mundt <lethal@linux-sh.org> 08-Aug-2003.
28 * Integrated support for sh64 (SH-5), from preliminary modutils
29 * patches from Benedict Gaster <benedict.gaster@superh.com>.
30 * Currently limited to support for 32bit ABI.
32 * Magnus Damm <damm@opensource.se> 22-May-2002.
33 * The plt and got code are now using the same structs.
34 * Added generic linked list code to fully support PowerPC.
35 * Replaced the mess in arch_apply_relocation() with architecture blocks.
36 * The arch_create_got() function got cleaned up with architecture blocks.
37 * These blocks should be easy maintain and sync with obj_xxx.c in modutils.
39 * Magnus Damm <damm@opensource.se> added PowerPC support 20-Feb-2001.
40 * PowerPC specific code stolen from modutils-2.3.16,
41 * written by Paul Mackerras, Copyright 1996, 1997 Linux International.
42 * I've only tested the code on mpc8xx platforms in big-endian mode.
43 * Did some cleanup and added CONFIG_USE_xxx_ENTRIES...
45 * Quinn Jensen <jensenq@lineo.com> added MIPS support 23-Feb-2001.
46 * based on modutils-2.4.2
47 * MIPS specific support for Elf loading and relocation.
48 * Copyright 1996, 1997 Linux International.
49 * Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>
51 * Based almost entirely on the Linux modutils-2.3.11 implementation.
52 * Copyright 1996, 1997 Linux International.
53 * New implementation contributed by Richard Henderson <rth@tamu.edu>
54 * Based on original work by Bjorn Ekwall <bj0rn@blox.se>
55 * Restructured (and partly rewritten) by:
56 * Björn Ekwall <bj0rn@blox.se> February 1999
58 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
63 #include <sys/utsname.h>
65 #if !defined(CONFIG_FEATURE_2_4_MODULES) && \
66 !defined(CONFIG_FEATURE_2_6_MODULES)
67 #define CONFIG_FEATURE_2_4_MODULES
70 #if !defined(CONFIG_FEATURE_2_4_MODULES)
71 #define insmod_ng_main insmod_main
74 #if defined(CONFIG_FEATURE_2_6_MODULES)
75 extern int insmod_ng_main( int argc, char **argv);
79 #if defined(CONFIG_FEATURE_2_4_MODULES)
82 #ifdef CONFIG_FEATURE_INSMOD_LOADINKMEM
90 #if defined(__alpha__)
91 #define MATCH_MACHINE(x) (x == EM_ALPHA)
92 #define SHT_RELM SHT_RELA
93 #define Elf64_RelM Elf64_Rela
94 #define ELFCLASSM ELFCLASS64
99 #define MATCH_MACHINE(x) (x == EM_ARM)
100 #define SHT_RELM SHT_REL
101 #define Elf32_RelM Elf32_Rel
102 #define ELFCLASSM ELFCLASS32
103 #define CONFIG_USE_PLT_ENTRIES
104 #define CONFIG_PLT_ENTRY_SIZE 8
105 #define CONFIG_USE_GOT_ENTRIES
106 #define CONFIG_GOT_ENTRY_SIZE 8
107 #define CONFIG_USE_SINGLE
112 #define MATCH_MACHINE(x) (x == EM_BLACKFIN)
113 #define SHT_RELM SHT_RELA
114 #define Elf32_RelM Elf32_Rela
115 #define ELFCLASSM ELFCLASS32
119 #if defined(__cris__)
120 #define MATCH_MACHINE(x) (x == EM_CRIS)
121 #define SHT_RELM SHT_RELA
122 #define Elf32_RelM Elf32_Rela
123 #define ELFCLASSM ELFCLASS32
126 #define R_CRIS_NONE 0
132 #if defined(__H8300H__) || defined(__H8300S__)
133 #define MATCH_MACHINE(x) (x == EM_H8_300)
134 #define SHT_RELM SHT_RELA
135 #define Elf32_RelM Elf32_Rela
136 #define ELFCLASSM ELFCLASS32
137 #define CONFIG_USE_SINGLE
138 #define SYMBOL_PREFIX "_"
141 /* PA-RISC / HP-PA */
142 #if defined(__hppa__)
143 #define MATCH_MACHINE(x) (x == EM_PARISC)
144 #define SHT_RELM SHT_RELA
145 #if defined(__LP64__)
146 #define Elf64_RelM Elf64_Rela
147 #define ELFCLASSM ELFCLASS64
149 #define Elf32_RelM Elf32_Rela
150 #define ELFCLASSM ELFCLASS32
155 #if defined(__i386__)
157 #define MATCH_MACHINE(x) (x == EM_386)
159 #define MATCH_MACHINE(x) (x == EM_386 || x == EM_486)
161 #define SHT_RELM SHT_REL
162 #define Elf32_RelM Elf32_Rel
163 #define ELFCLASSM ELFCLASS32
164 #define CONFIG_USE_GOT_ENTRIES
165 #define CONFIG_GOT_ENTRY_SIZE 4
166 #define CONFIG_USE_SINGLE
169 /* IA64, aka Itanium */
170 #if defined(__ia64__)
171 #define MATCH_MACHINE(x) (x == EM_IA_64)
172 #define SHT_RELM SHT_RELA
173 #define Elf64_RelM Elf64_Rela
174 #define ELFCLASSM ELFCLASS64
178 #if defined(__mc68000__)
179 #define MATCH_MACHINE(x) (x == EM_68K)
180 #define SHT_RELM SHT_RELA
181 #define Elf32_RelM Elf32_Rela
182 #define ELFCLASSM ELFCLASS32
183 #define CONFIG_USE_GOT_ENTRIES
184 #define CONFIG_GOT_ENTRY_SIZE 4
185 #define CONFIG_USE_SINGLE
189 #if defined(__microblaze__)
190 #define CONFIG_USE_SINGLE
191 #define MATCH_MACHINE(x) (x == EM_XILINX_MICROBLAZE)
192 #define SHT_RELM SHT_RELA
193 #define Elf32_RelM Elf32_Rela
194 #define ELFCLASSM ELFCLASS32
198 #if defined(__mips__)
199 #define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE)
200 #define SHT_RELM SHT_REL
201 #define Elf32_RelM Elf32_Rel
202 #define ELFCLASSM ELFCLASS32
203 /* Account for ELF spec changes. */
204 #ifndef EM_MIPS_RS3_LE
205 #ifdef EM_MIPS_RS4_BE
206 #define EM_MIPS_RS3_LE EM_MIPS_RS4_BE
208 #define EM_MIPS_RS3_LE 10
210 #endif /* !EM_MIPS_RS3_LE */
211 #define ARCHDATAM "__dbe_table"
215 #if defined(__nios2__)
216 #define MATCH_MACHINE(x) (x == EM_ALTERA_NIOS2)
217 #define SHT_RELM SHT_RELA
218 #define Elf32_RelM Elf32_Rela
219 #define ELFCLASSM ELFCLASS32
223 #if defined(__powerpc64__)
224 #define MATCH_MACHINE(x) (x == EM_PPC64)
225 #define SHT_RELM SHT_RELA
226 #define Elf64_RelM Elf64_Rela
227 #define ELFCLASSM ELFCLASS64
228 #elif defined(__powerpc__)
229 #define MATCH_MACHINE(x) (x == EM_PPC)
230 #define SHT_RELM SHT_RELA
231 #define Elf32_RelM Elf32_Rela
232 #define ELFCLASSM ELFCLASS32
233 #define CONFIG_USE_PLT_ENTRIES
234 #define CONFIG_PLT_ENTRY_SIZE 16
235 #define CONFIG_USE_PLT_LIST
236 #define CONFIG_LIST_ARCHTYPE ElfW(Addr)
237 #define CONFIG_USE_LIST
238 #define ARCHDATAM "__ftr_fixup"
242 #if defined(__s390__)
243 #define MATCH_MACHINE(x) (x == EM_S390)
244 #define SHT_RELM SHT_RELA
245 #define Elf32_RelM Elf32_Rela
246 #define ELFCLASSM ELFCLASS32
247 #define CONFIG_USE_PLT_ENTRIES
248 #define CONFIG_PLT_ENTRY_SIZE 8
249 #define CONFIG_USE_GOT_ENTRIES
250 #define CONFIG_GOT_ENTRY_SIZE 8
251 #define CONFIG_USE_SINGLE
256 #define MATCH_MACHINE(x) (x == EM_SH)
257 #define SHT_RELM SHT_RELA
258 #define Elf32_RelM Elf32_Rela
259 #define ELFCLASSM ELFCLASS32
260 #define CONFIG_USE_GOT_ENTRIES
261 #define CONFIG_GOT_ENTRY_SIZE 4
262 #define CONFIG_USE_SINGLE
263 /* the SH changes have only been tested in =little endian= mode */
264 /* I'm not sure about big endian, so let's warn: */
265 #if defined(__sh__) && BB_BIG_ENDIAN
266 # error insmod.c may require changes for use on big endian SH
268 /* it may or may not work on the SH1/SH2... Error on those also */
269 #if ((!(defined(__SH3__) || defined(__SH4__) || defined(__SH5__)))) && (defined(__sh__))
270 #error insmod.c may require changes for SH1 or SH2 use
275 #if defined(__sparc__)
276 #define MATCH_MACHINE(x) (x == EM_SPARC)
277 #define SHT_RELM SHT_RELA
278 #define Elf32_RelM Elf32_Rela
279 #define ELFCLASSM ELFCLASS32
283 #if defined (__v850e__)
284 #define MATCH_MACHINE(x) ((x) == EM_V850 || (x) == EM_CYGNUS_V850)
285 #define SHT_RELM SHT_RELA
286 #define Elf32_RelM Elf32_Rela
287 #define ELFCLASSM ELFCLASS32
288 #define CONFIG_USE_PLT_ENTRIES
289 #define CONFIG_PLT_ENTRY_SIZE 8
290 #define CONFIG_USE_SINGLE
291 #ifndef EM_CYGNUS_V850 /* grumble */
292 #define EM_CYGNUS_V850 0x9080
294 #define SYMBOL_PREFIX "_"
298 #if defined(__x86_64__)
299 #define MATCH_MACHINE(x) (x == EM_X86_64)
300 #define SHT_RELM SHT_RELA
301 #define CONFIG_USE_GOT_ENTRIES
302 #define CONFIG_GOT_ENTRY_SIZE 8
303 #define CONFIG_USE_SINGLE
304 #define Elf64_RelM Elf64_Rela
305 #define ELFCLASSM ELFCLASS64
309 #error Sorry, but insmod.c does not yet support this architecture...
313 //----------------------------------------------------------------------------
314 //--------modutils module.h, lines 45-242
315 //----------------------------------------------------------------------------
317 /* Definitions for the Linux module syscall interface.
318 Copyright 1996, 1997 Linux International.
320 Contributed by Richard Henderson <rth@tamu.edu>
322 This file is part of the Linux modutils.
324 This program is free software; you can redistribute it and/or modify it
325 under the terms of the GNU General Public License as published by the
326 Free Software Foundation; either version 2 of the License, or (at your
327 option) any later version.
329 This program is distributed in the hope that it will be useful, but
330 WITHOUT ANY WARRANTY; without even the implied warranty of
331 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
332 General Public License for more details.
334 You should have received a copy of the GNU General Public License
335 along with this program; if not, write to the Free Software Foundation,
336 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
339 #ifndef MODUTILS_MODULE_H
340 /* Why? static const int MODUTILS_MODULE_H = 1;*/
342 /*======================================================================*/
343 /* For sizeof() which are related to the module platform and not to the
344 environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
346 #define tgt_sizeof_char sizeof(char)
347 #define tgt_sizeof_short sizeof(short)
348 #define tgt_sizeof_int sizeof(int)
349 #define tgt_sizeof_long sizeof(long)
350 #define tgt_sizeof_char_p sizeof(char *)
351 #define tgt_sizeof_void_p sizeof(void *)
352 #define tgt_long long
354 #if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64)
355 #undef tgt_sizeof_long
356 #undef tgt_sizeof_char_p
357 #undef tgt_sizeof_void_p
361 tgt_sizeof_char_p = 8,
362 tgt_sizeof_void_p = 8
364 #define tgt_long long long
367 /*======================================================================*/
368 /* The structures used in Linux 2.1. */
370 /* Note: new_module_symbol does not use tgt_long intentionally */
371 struct new_module_symbol
377 struct new_module_persist;
379 struct new_module_ref
381 unsigned tgt_long dep; /* kernel addresses */
382 unsigned tgt_long ref;
383 unsigned tgt_long next_ref;
388 unsigned tgt_long size_of_struct; /* == sizeof(module) */
389 unsigned tgt_long next;
390 unsigned tgt_long name;
391 unsigned tgt_long size;
394 unsigned tgt_long flags; /* AUTOCLEAN et al */
399 unsigned tgt_long syms;
400 unsigned tgt_long deps;
401 unsigned tgt_long refs;
402 unsigned tgt_long init;
403 unsigned tgt_long cleanup;
404 unsigned tgt_long ex_table_start;
405 unsigned tgt_long ex_table_end;
407 unsigned tgt_long gp;
409 /* Everything after here is extension. */
410 unsigned tgt_long persist_start;
411 unsigned tgt_long persist_end;
412 unsigned tgt_long can_unload;
413 unsigned tgt_long runsize;
414 const char *kallsyms_start; /* All symbols for kernel debugging */
415 const char *kallsyms_end;
416 const char *archdata_start; /* arch specific data for module */
417 const char *archdata_end;
418 const char *kernel_data; /* Reserved for kernel internal use */
422 #define ARCHDATA_SEC_NAME ARCHDATAM
424 #define ARCHDATA_SEC_NAME "__archdata"
426 #define KALLSYMS_SEC_NAME "__kallsyms"
429 struct new_module_info
437 /* Bits of module.flags. */
441 NEW_MOD_AUTOCLEAN = 4,
443 NEW_MOD_USED_ONCE = 16
446 int init_module(const char *name, const struct new_module *);
447 int query_module(const char *name, int which, void *buf,
448 size_t bufsize, size_t *ret);
450 /* Values for query_module's which. */
459 /*======================================================================*/
460 /* The system calls unchanged between 2.0 and 2.1. */
462 unsigned long create_module(const char *, size_t);
463 int delete_module(const char *);
466 #endif /* module.h */
468 //----------------------------------------------------------------------------
469 //--------end of modutils module.h
470 //----------------------------------------------------------------------------
474 //----------------------------------------------------------------------------
475 //--------modutils obj.h, lines 253-462
476 //----------------------------------------------------------------------------
478 /* Elf object file loading and relocation routines.
479 Copyright 1996, 1997 Linux International.
481 Contributed by Richard Henderson <rth@tamu.edu>
483 This file is part of the Linux modutils.
485 This program is free software; you can redistribute it and/or modify it
486 under the terms of the GNU General Public License as published by the
487 Free Software Foundation; either version 2 of the License, or (at your
488 option) any later version.
490 This program is distributed in the hope that it will be useful, but
491 WITHOUT ANY WARRANTY; without even the implied warranty of
492 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
493 General Public License for more details.
495 You should have received a copy of the GNU General Public License
496 along with this program; if not, write to the Free Software Foundation,
497 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
500 #ifndef MODUTILS_OBJ_H
501 /* Why? static const int MODUTILS_OBJ_H = 1; */
503 /* The relocatable object is manipulated using elfin types. */
510 # if ELFCLASSM == ELFCLASS32
511 # define ElfW(x) Elf32_ ## x
512 # define ELFW(x) ELF32_ ## x
514 # define ElfW(x) Elf64_ ## x
515 # define ELFW(x) ELF64_ ## x
519 /* For some reason this is missing from some ancient C libraries.... */
520 #ifndef ELF32_ST_INFO
521 # define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
524 #ifndef ELF64_ST_INFO
525 # define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
528 #define ELF_ST_BIND(info) ELFW(ST_BIND)(info)
529 #define ELF_ST_TYPE(info) ELFW(ST_TYPE)(info)
530 #define ELF_ST_INFO(bind, type) ELFW(ST_INFO)(bind, type)
531 #define ELF_R_TYPE(val) ELFW(R_TYPE)(val)
532 #define ELF_R_SYM(val) ELFW(R_SYM)(val)
534 struct obj_string_patch;
535 struct obj_symbol_patch;
542 struct obj_section *load_next;
548 struct obj_symbol *next; /* hash table link */
552 int secidx; /* the defining section index/module */
554 int ksymidx; /* for export to the kernel symtab */
555 int referenced; /* actually used in the link */
558 /* Hardcode the hash table size. We shouldn't be needing so many
559 symbols that we begin to degrade performance, and we get a big win
560 by giving the compiler a constant divisor. */
562 #define HASH_BUCKETS 521
568 struct obj_section **sections;
569 struct obj_section *load_order;
570 struct obj_section **load_order_search_start;
571 struct obj_string_patch *string_patches;
572 struct obj_symbol_patch *symbol_patches;
573 int (*symbol_cmp)(const char *, const char *);
574 unsigned long (*symbol_hash)(const char *);
575 unsigned long local_symtab_size;
576 struct obj_symbol **local_symtab;
577 struct obj_symbol *symtab[HASH_BUCKETS];
588 struct obj_string_patch
590 struct obj_string_patch *next;
592 ElfW(Addr) reloc_offset;
593 ElfW(Addr) string_offset;
596 struct obj_symbol_patch
598 struct obj_symbol_patch *next;
600 ElfW(Addr) reloc_offset;
601 struct obj_symbol *sym;
605 /* Generic object manipulation routines. */
607 static unsigned long obj_elf_hash(const char *);
609 static unsigned long obj_elf_hash_n(const char *, unsigned long len);
611 static struct obj_symbol *obj_find_symbol (struct obj_file *f,
614 static ElfW(Addr) obj_symbol_final_value(struct obj_file *f,
615 struct obj_symbol *sym);
617 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
618 static void obj_set_symbol_compare(struct obj_file *f,
619 int (*cmp)(const char *, const char *),
620 unsigned long (*hash)(const char *));
623 static struct obj_section *obj_find_section (struct obj_file *f,
626 static void obj_insert_section_load_order (struct obj_file *f,
627 struct obj_section *sec);
629 static struct obj_section *obj_create_alloced_section (struct obj_file *f,
634 static struct obj_section *obj_create_alloced_section_first (struct obj_file *f,
639 static void *obj_extend_section (struct obj_section *sec, unsigned long more);
641 static int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
644 static int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
645 struct obj_symbol *sym);
647 static int obj_check_undefineds(struct obj_file *f);
649 static void obj_allocate_commons(struct obj_file *f);
651 static unsigned long obj_load_size (struct obj_file *f);
653 static int obj_relocate (struct obj_file *f, ElfW(Addr) base);
655 static struct obj_file *obj_load(FILE *f, int loadprogbits);
657 static int obj_create_image (struct obj_file *f, char *image);
659 /* Architecture specific manipulation routines. */
661 static struct obj_file *arch_new_file (void);
663 static struct obj_section *arch_new_section (void);
665 static struct obj_symbol *arch_new_symbol (void);
667 static enum obj_reloc arch_apply_relocation (struct obj_file *f,
668 struct obj_section *targsec,
669 struct obj_section *symsec,
670 struct obj_symbol *sym,
671 ElfW(RelM) *rel, ElfW(Addr) value);
673 static void arch_create_got (struct obj_file *f);
674 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
675 static int obj_gpl_license(struct obj_file *f, const char **license);
676 #endif /* ENABLE_FEATURE_CHECK_TAINTED_MODULE */
678 //----------------------------------------------------------------------------
679 //--------end of modutils obj.h
680 //----------------------------------------------------------------------------
683 /* SPFX is always a string, so it can be concatenated to string constants. */
685 #define SPFX SYMBOL_PREFIX
691 #define _PATH_MODULES "/lib/modules"
692 enum { STRVERSIONLEN = 32 };
694 /*======================================================================*/
696 #define OPTION_STR "sLo:fkvqx" USE_FEATURE_INSMOD_LOAD_MAP("m")
698 OPT_s = 0x1, // -s /* log to syslog */
699 /* Not supported but kernel needs this for request_module(),
700 as this calls: modprobe -k -s -- <module>
701 so silently ignore this flag */
702 OPT_L = 0x2, // -L /* Stub warning */
703 /* Compatibility with modprobe.
704 In theory, this does locking, but we don't do
705 that. So be careful and plan your life around not
706 loading the same module 50 times concurrently. */
707 OPT_o = 0x4, // -o /* name the output module */
708 OPT_f = 0x8, // -f /* force loading */
709 OPT_k = 0x10, // -k /* module loaded by kerneld, auto-cleanable */
710 OPT_v = 0x20, // -v /* verbose output */
711 OPT_q = 0x40, // -q /* silent */
712 OPT_x = 0x80, // -x /* do not export externs */
713 OPT_m = 0x100, // -m /* print module load map */
715 #define flag_force_load (option_mask32 & OPT_f)
716 #define flag_autoclean (option_mask32 & OPT_k)
717 #define flag_verbose (option_mask32 & OPT_v)
718 #define flag_quiet (option_mask32 & OPT_q)
719 #define flag_noexport (option_mask32 & OPT_x)
720 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP
721 #define flag_print_load_map (option_mask32 & OPT_m)
723 #define flag_print_load_map 0
726 /*======================================================================*/
728 #if defined(CONFIG_USE_LIST)
730 struct arch_list_entry
732 struct arch_list_entry *next;
733 CONFIG_LIST_ARCHTYPE addend;
740 #if defined(CONFIG_USE_SINGLE)
742 struct arch_single_entry
751 #if defined(__mips__)
754 struct mips_hi16 *next;
761 struct obj_file root;
762 #if defined(CONFIG_USE_PLT_ENTRIES)
763 struct obj_section *plt;
765 #if defined(CONFIG_USE_GOT_ENTRIES)
766 struct obj_section *got;
768 #if defined(__mips__)
769 struct mips_hi16 *mips_hi16_list;
774 struct obj_symbol root;
775 #if defined(CONFIG_USE_PLT_ENTRIES)
776 #if defined(CONFIG_USE_PLT_LIST)
777 struct arch_list_entry *pltent;
779 struct arch_single_entry pltent;
782 #if defined(CONFIG_USE_GOT_ENTRIES)
783 struct arch_single_entry gotent;
788 struct external_module {
793 struct new_module_symbol *syms;
796 static struct new_module_symbol *ksyms;
797 static size_t nksyms;
799 static struct external_module *ext_modules;
800 static int n_ext_modules;
801 static int n_ext_modules_used;
802 extern int delete_module(const char *);
804 static char *m_filename;
805 static char *m_fullName;
809 /*======================================================================*/
812 static int check_module_name_match(const char *filename, struct stat *statbuf,
815 char *fullname = (char *) userdata;
817 if (fullname[0] == '\0')
820 char *tmp, *tmp1 = xstrdup(filename);
821 tmp = bb_get_last_path_component(tmp1);
822 if (strcmp(tmp, fullname) == 0) {
824 /* Stop searching if we find a match */
825 m_filename = xstrdup(filename);
834 /*======================================================================*/
836 static struct obj_file *arch_new_file(void)
839 f = xmalloc(sizeof(*f));
841 memset(f, 0, sizeof(*f));
846 static struct obj_section *arch_new_section(void)
848 return xmalloc(sizeof(struct obj_section));
851 static struct obj_symbol *arch_new_symbol(void)
853 struct arch_symbol *sym;
854 sym = xmalloc(sizeof(*sym));
856 memset(sym, 0, sizeof(*sym));
861 static enum obj_reloc
862 arch_apply_relocation(struct obj_file *f,
863 struct obj_section *targsec,
864 struct obj_section *symsec,
865 struct obj_symbol *sym,
866 ElfW(RelM) *rel, ElfW(Addr) v)
868 struct arch_file *ifile = (struct arch_file *) f;
869 enum obj_reloc ret = obj_reloc_ok;
870 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
871 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
872 #if defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES)
873 struct arch_symbol *isym = (struct arch_symbol *) sym;
875 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) || defined(__sh__) || defined(__s390__)
876 #if defined(CONFIG_USE_GOT_ENTRIES)
877 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
880 #if defined(CONFIG_USE_PLT_ENTRIES)
881 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
883 # if defined(CONFIG_USE_PLT_LIST)
884 struct arch_list_entry *pe;
886 struct arch_single_entry *pe;
890 switch (ELF_R_TYPE(rel->r_info)) {
905 /* relative reloc, always to _GLOBAL_OFFSET_TABLE_
906 * (which is .got) similar to branch,
907 * but is full 32 bits relative */
916 case R_ARM_GOTOFF: /* address relative to the got */
920 #elif defined(__cris__)
926 /* CRIS keeps the relocation value in the r_addend field and
927 * should not use whats in *loc at all
932 #elif defined(__H8300H__) || defined(__H8300S__)
935 loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1);
936 *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
947 if ((ElfW(Sword))v > 0x7fff ||
948 (ElfW(Sword))v < -(ElfW(Sword))0x8000)
949 ret = obj_reloc_overflow;
951 *(unsigned short *)loc = v;
955 if ((ElfW(Sword))v > 0x7f ||
956 (ElfW(Sword))v < -(ElfW(Sword))0x80)
957 ret = obj_reloc_overflow;
959 *(unsigned char *)loc = v;
962 #elif defined(__i386__)
996 #elif defined (__microblaze__)
997 case R_MICROBLAZE_NONE:
998 case R_MICROBLAZE_64_NONE:
999 case R_MICROBLAZE_32_SYM_OP_SYM:
1000 case R_MICROBLAZE_32_PCREL:
1003 case R_MICROBLAZE_64_PCREL: {
1004 /* dot is the address of the current instruction.
1005 * v is the target symbol address.
1006 * So we need to extract the offset in the code,
1007 * adding v, then subtrating the current address
1008 * of this instruction.
1009 * Ex: "IMM 0xFFFE bralid 0x0000" = "bralid 0xFFFE0000"
1012 /* Get split offset stored in code */
1013 unsigned int temp = (loc[0] & 0xFFFF) << 16 |
1016 /* Adjust relative offset. -4 adjustment required
1017 * because dot points to the IMM insn, but branch
1018 * is computed relative to the branch instruction itself.
1020 temp += v - dot - 4;
1022 /* Store back into code */
1023 loc[0] = (loc[0] & 0xFFFF0000) | temp >> 16;
1024 loc[1] = (loc[1] & 0xFFFF0000) | (temp & 0xFFFF);
1029 case R_MICROBLAZE_32:
1033 case R_MICROBLAZE_64: {
1034 /* Get split pointer stored in code */
1035 unsigned int temp1 = (loc[0] & 0xFFFF) << 16 |
1038 /* Add reloc offset */
1041 /* Store back into code */
1042 loc[0] = (loc[0] & 0xFFFF0000) | temp1 >> 16;
1043 loc[1] = (loc[1] & 0xFFFF0000) | (temp1 & 0xFFFF);
1048 case R_MICROBLAZE_32_PCREL_LO:
1049 case R_MICROBLAZE_32_LO:
1050 case R_MICROBLAZE_SRO32:
1051 case R_MICROBLAZE_SRW32:
1052 ret = obj_reloc_unhandled;
1055 #elif defined(__mc68000__)
1066 ret = obj_reloc_overflow;
1073 ret = obj_reloc_overflow;
1080 if ((ElfW(Sword))v > 0x7f ||
1081 (ElfW(Sword))v < -(ElfW(Sword))0x80) {
1082 ret = obj_reloc_overflow;
1089 if ((ElfW(Sword))v > 0x7fff ||
1090 (ElfW(Sword))v < -(ElfW(Sword))0x8000) {
1091 ret = obj_reloc_overflow;
1097 *(int *)loc = v - dot;
1100 case R_68K_GLOB_DAT:
1101 case R_68K_JMP_SLOT:
1105 case R_68K_RELATIVE:
1106 *(int *)loc += f->baseaddr;
1112 # ifdef R_68K_GOTOFF
1118 #elif defined(__mips__)
1129 ret = obj_reloc_dangerous;
1130 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
1131 ret = obj_reloc_overflow;
1133 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
1139 struct mips_hi16 *n;
1141 /* We cannot relocate this one now because we don't know the value
1142 of the carry we need to add. Save the information, and let LO16
1143 do the actual relocation. */
1144 n = (struct mips_hi16 *) xmalloc(sizeof *n);
1147 n->next = ifile->mips_hi16_list;
1148 ifile->mips_hi16_list = n;
1154 unsigned long insnlo = *loc;
1155 ElfW(Addr) val, vallo;
1157 /* Sign extend the addend we extract from the lo insn. */
1158 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
1160 if (ifile->mips_hi16_list != NULL) {
1161 struct mips_hi16 *l;
1163 l = ifile->mips_hi16_list;
1165 struct mips_hi16 *next;
1168 /* Do the HI16 relocation. Note that we actually don't
1169 need to know anything about the LO16 itself, except where
1170 to find the low 16 bits of the addend needed by the LO16. */
1173 ((insn & 0xffff) << 16) +
1177 /* Account for the sign extension that will happen in the
1184 insn = (insn & ~0xffff) | val;
1192 ifile->mips_hi16_list = NULL;
1195 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
1197 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
1202 #elif defined(__nios2__)
1207 case R_NIOS2_BFD_RELOC_32:
1211 case R_NIOS2_BFD_RELOC_16:
1213 ret = obj_reloc_overflow;
1218 case R_NIOS2_BFD_RELOC_8:
1220 ret = obj_reloc_overflow;
1229 if ((Elf32_Sword)v > 0x7fff ||
1230 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1231 ret = obj_reloc_overflow;
1235 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1245 ret = obj_reloc_overflow;
1249 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1254 case R_NIOS2_PCREL16:
1259 if ((Elf32_Sword)v > 0x7fff ||
1260 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1261 ret = obj_reloc_overflow;
1265 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1271 Elf32_Addr word, gp;
1273 gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp"));
1275 if ((Elf32_Sword)v > 0x7fff ||
1276 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1277 ret = obj_reloc_overflow;
1281 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1285 case R_NIOS2_CALL26:
1287 ret = obj_reloc_dangerous;
1288 if ((v >> 28) != (dot >> 28))
1289 ret = obj_reloc_overflow;
1290 *loc = (*loc & 0x3f) | ((v >> 2) << 6);
1298 ret = obj_reloc_overflow;
1301 word = *loc & ~0x7c0;
1302 *loc = word | ((v & 0x1f) << 6);
1311 ret = obj_reloc_overflow;
1314 word = *loc & ~0xfc0;
1315 *loc = word | ((v & 0x3f) << 6);
1324 ret = obj_reloc_overflow;
1327 word = *loc & ~0x3fc0;
1328 *loc = word | ((v & 0xff) << 6);
1337 *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) |
1347 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1352 case R_NIOS2_HIADJ16:
1354 Elf32_Addr word1, word2;
1357 word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
1358 *loc = ((((word1 >> 22) << 16) | word2) << 6) |
1363 #elif defined(__powerpc64__)
1364 /* PPC64 needs a 2.6 kernel, 2.4 module relocation irrelevant */
1366 #elif defined(__powerpc__)
1368 case R_PPC_ADDR16_HA:
1369 *(unsigned short *)loc = (v + 0x8000) >> 16;
1372 case R_PPC_ADDR16_HI:
1373 *(unsigned short *)loc = v >> 16;
1376 case R_PPC_ADDR16_LO:
1377 *(unsigned short *)loc = v;
1391 #elif defined(__s390__)
1394 *(unsigned int *) loc += v;
1397 *(unsigned short *) loc += v;
1400 *(unsigned char *) loc += v;
1404 *(unsigned int *) loc += v - dot;
1407 *(unsigned short *) loc += (v - dot) >> 1;
1410 *(unsigned short *) loc += v - dot;
1414 case R_390_PLT16DBL:
1415 /* find the plt entry and initialize it. */
1416 pe = (struct arch_single_entry *) &isym->pltent;
1417 if (pe->inited == 0) {
1418 ip = (unsigned long *)(ifile->plt->contents + pe->offset);
1419 ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */
1421 if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1428 /* Insert relative distance to target. */
1429 v = plt + pe->offset - dot;
1430 if (ELF_R_TYPE(rel->r_info) == R_390_PLT32)
1431 *(unsigned int *) loc = (unsigned int) v;
1432 else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1433 *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1);
1436 case R_390_GLOB_DAT:
1437 case R_390_JMP_SLOT:
1441 case R_390_RELATIVE:
1442 *loc += f->baseaddr;
1446 *(unsigned long *) loc += got - dot;
1452 if (!isym->gotent.inited)
1454 isym->gotent.inited = 1;
1455 *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v;
1457 if (ELF_R_TYPE(rel->r_info) == R_390_GOT12)
1458 *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff;
1459 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16)
1460 *(unsigned short *) loc += isym->gotent.offset;
1461 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32)
1462 *(unsigned int *) loc += isym->gotent.offset;
1465 # ifndef R_390_GOTOFF32
1466 # define R_390_GOTOFF32 R_390_GOTOFF
1468 case R_390_GOTOFF32:
1472 #elif defined(__sh__)
1495 *loc = f->baseaddr + rel->r_addend;
1499 *loc = got - dot + rel->r_addend;
1509 # if defined(__SH5__)
1510 case R_SH_IMM_MEDLOW16:
1511 case R_SH_IMM_LOW16:
1515 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16)
1519 * movi and shori have the format:
1521 * | op | imm | reg | reserved |
1522 * 31..26 25..10 9.. 4 3 .. 0
1524 * so we simply mask and or in imm.
1526 word = *loc & ~0x3fffc00;
1527 word |= (v & 0xffff) << 10;
1534 case R_SH_IMM_MEDLOW16_PCREL:
1535 case R_SH_IMM_LOW16_PCREL:
1539 word = *loc & ~0x3fffc00;
1543 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16_PCREL)
1546 word |= (v & 0xffff) << 10;
1552 # endif /* __SH5__ */
1554 #elif defined (__v850e__)
1560 /* We write two shorts instead of a long because even
1561 32-bit insns only need half-word alignment, but
1562 32-bit data needs to be long-word aligned. */
1563 v += ((unsigned short *)loc)[0];
1564 v += ((unsigned short *)loc)[1] << 16;
1565 ((unsigned short *)loc)[0] = v & 0xffff;
1566 ((unsigned short *)loc)[1] = (v >> 16) & 0xffff;
1569 case R_V850_22_PCREL:
1572 #elif defined(__x86_64__)
1582 *(unsigned int *) loc += v;
1585 ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */
1586 /* error("Possibly is module compiled without -mcmodel=kernel!"); */
1591 *(signed int *) loc += v;
1595 *(unsigned short *) loc += v;
1599 *(unsigned char *) loc += v;
1603 *(unsigned int *) loc += v - dot;
1607 *(unsigned short *) loc += v - dot;
1611 *(unsigned char *) loc += v - dot;
1614 case R_X86_64_GLOB_DAT:
1615 case R_X86_64_JUMP_SLOT:
1619 case R_X86_64_RELATIVE:
1620 *loc += f->baseaddr;
1623 case R_X86_64_GOT32:
1624 case R_X86_64_GOTPCREL:
1627 if (!isym->gotent.reloc_done)
1629 isym->gotent.reloc_done = 1;
1630 *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
1632 /* XXX are these really correct? */
1633 if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL)
1634 *(unsigned int *) loc += v + isym->gotent.offset;
1636 *loc += isym->gotent.offset;
1641 # warning "no idea how to handle relocations on your arch"
1645 printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info));
1646 ret = obj_reloc_unhandled;
1649 #if defined(CONFIG_USE_PLT_ENTRIES)
1653 /* find the plt entry and initialize it if necessary */
1655 #if defined(CONFIG_USE_PLT_LIST)
1656 for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend;)
1663 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1665 /* generate some machine code */
1667 #if defined(__arm__)
1668 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1669 ip[1] = v; /* sym@ */
1671 #if defined(__powerpc__)
1672 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1673 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1674 ip[2] = 0x7d6903a6; /* mtctr r11 */
1675 ip[3] = 0x4e800420; /* bctr */
1677 #if defined (__v850e__)
1678 /* We have to trash a register, so we assume that any control
1679 transfer more than 21-bits away must be a function call
1680 (so we can use a call-clobbered register). */
1681 ip[0] = 0x0621 + ((v & 0xffff) << 16); /* mov sym, r1 ... */
1682 ip[1] = ((v >> 16) & 0xffff) + 0x610000; /* ...; jmp r1 */
1687 /* relative distance to target */
1689 /* if the target is too far away.... */
1690 #if defined (__arm__) || defined (__powerpc__)
1691 if ((int)v < -0x02000000 || (int)v >= 0x02000000)
1692 #elif defined (__v850e__)
1693 if ((ElfW(Sword))v > 0x1fffff || (ElfW(Sword))v < (ElfW(Sword))-0x200000)
1695 /* go via the plt */
1696 v = plt + pe->offset - dot;
1698 #if defined (__v850e__)
1703 ret = obj_reloc_dangerous;
1705 /* merge the offset into the instruction. */
1706 #if defined(__arm__)
1707 /* Convert to words. */
1710 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1712 #if defined(__powerpc__)
1713 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1715 #if defined (__v850e__)
1716 /* We write two shorts instead of a long because even 32-bit insns
1717 only need half-word alignment, but the 32-bit data write needs
1718 to be long-word aligned. */
1719 ((unsigned short *)loc)[0] =
1720 (*(unsigned short *)loc & 0xffc0) /* opcode + reg */
1721 | ((v >> 16) & 0x3f); /* offs high part */
1722 ((unsigned short *)loc)[1] =
1723 (v & 0xffff); /* offs low part */
1726 #endif /* CONFIG_USE_PLT_ENTRIES */
1728 #if defined(CONFIG_USE_GOT_ENTRIES)
1731 /* needs an entry in the .got: set it, once */
1732 if (!isym->gotent.inited) {
1733 isym->gotent.inited = 1;
1734 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1736 /* make the reloc with_respect_to_.got */
1738 *loc += isym->gotent.offset + rel->r_addend;
1739 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1740 *loc += isym->gotent.offset;
1744 #endif /* CONFIG_USE_GOT_ENTRIES */
1751 #if defined(CONFIG_USE_LIST)
1753 static int arch_list_add(ElfW(RelM) *rel, struct arch_list_entry **list,
1754 int offset, int size)
1756 struct arch_list_entry *pe;
1758 for (pe = *list; pe != NULL; pe = pe->next) {
1759 if (pe->addend == rel->r_addend) {
1765 pe = xmalloc(sizeof(struct arch_list_entry));
1767 pe->addend = rel->r_addend;
1768 pe->offset = offset;
1778 #if defined(CONFIG_USE_SINGLE)
1780 static int arch_single_init(ElfW(RelM) *rel, struct arch_single_entry *single,
1781 int offset, int size)
1783 if (single->allocated == 0) {
1784 single->allocated = 1;
1785 single->offset = offset;
1794 #if defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES)
1796 static struct obj_section *arch_xsect_init(struct obj_file *f, char *name,
1797 int offset, int size)
1799 struct obj_section *myrelsec = obj_find_section(f, name);
1806 obj_extend_section(myrelsec, offset);
1808 myrelsec = obj_create_alloced_section(f, name,
1817 static void arch_create_got(struct obj_file *f)
1819 #if defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES)
1820 struct arch_file *ifile = (struct arch_file *) f;
1822 #if defined(CONFIG_USE_GOT_ENTRIES)
1823 int got_offset = 0, got_needed = 0, got_allocate;
1825 #if defined(CONFIG_USE_PLT_ENTRIES)
1826 int plt_offset = 0, plt_needed = 0, plt_allocate;
1828 struct obj_section *relsec, *symsec, *strsec;
1829 ElfW(RelM) *rel, *relend;
1830 ElfW(Sym) *symtab, *extsym;
1831 const char *strtab, *name;
1832 struct arch_symbol *intsym;
1834 for (i = 0; i < f->header.e_shnum; ++i) {
1835 relsec = f->sections[i];
1836 if (relsec->header.sh_type != SHT_RELM)
1839 symsec = f->sections[relsec->header.sh_link];
1840 strsec = f->sections[symsec->header.sh_link];
1842 rel = (ElfW(RelM) *) relsec->contents;
1843 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1844 symtab = (ElfW(Sym) *) symsec->contents;
1845 strtab = (const char *) strsec->contents;
1847 for (; rel < relend; ++rel) {
1848 extsym = &symtab[ELF_R_SYM(rel->r_info)];
1850 #if defined(CONFIG_USE_GOT_ENTRIES)
1853 #if defined(CONFIG_USE_PLT_ENTRIES)
1857 switch (ELF_R_TYPE(rel->r_info)) {
1858 #if defined(__arm__)
1873 #elif defined(__i386__)
1883 #elif defined(__powerpc__)
1888 #elif defined(__mc68000__)
1899 #elif defined(__sh__)
1909 #elif defined (__v850e__)
1910 case R_V850_22_PCREL:
1919 if (extsym->st_name != 0) {
1920 name = strtab + extsym->st_name;
1922 name = f->sections[extsym->st_shndx]->name;
1924 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1925 #if defined(CONFIG_USE_GOT_ENTRIES)
1927 got_offset += arch_single_init(
1928 rel, &intsym->gotent,
1929 got_offset, CONFIG_GOT_ENTRY_SIZE);
1934 #if defined(CONFIG_USE_PLT_ENTRIES)
1936 #if defined(CONFIG_USE_PLT_LIST)
1937 plt_offset += arch_list_add(
1938 rel, &intsym->pltent,
1939 plt_offset, CONFIG_PLT_ENTRY_SIZE);
1941 plt_offset += arch_single_init(
1942 rel, &intsym->pltent,
1943 plt_offset, CONFIG_PLT_ENTRY_SIZE);
1951 #if defined(CONFIG_USE_GOT_ENTRIES)
1953 ifile->got = arch_xsect_init(f, ".got", got_offset,
1954 CONFIG_GOT_ENTRY_SIZE);
1958 #if defined(CONFIG_USE_PLT_ENTRIES)
1960 ifile->plt = arch_xsect_init(f, ".plt", plt_offset,
1961 CONFIG_PLT_ENTRY_SIZE);
1965 #endif /* defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES) */
1968 /*======================================================================*/
1970 /* Standard ELF hash function. */
1971 static unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1973 unsigned long h = 0;
1980 if ((g = (h & 0xf0000000)) != 0) {
1989 static unsigned long obj_elf_hash(const char *name)
1991 return obj_elf_hash_n(name, strlen(name));
1994 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
1995 /* String comparison for non-co-versioned kernel and module. */
1997 static int ncv_strcmp(const char *a, const char *b)
1999 size_t alen = strlen(a), blen = strlen(b);
2001 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
2002 return strncmp(a, b, alen);
2003 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
2004 return strncmp(a, b, blen);
2006 return strcmp(a, b);
2009 /* String hashing for non-co-versioned kernel and module. Here
2010 we are simply forced to drop the crc from the hash. */
2012 static unsigned long ncv_symbol_hash(const char *str)
2014 size_t len = strlen(str);
2015 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
2017 return obj_elf_hash_n(str, len);
2021 obj_set_symbol_compare(struct obj_file *f,
2022 int (*cmp) (const char *, const char *),
2023 unsigned long (*hash) (const char *))
2026 f->symbol_cmp = cmp;
2028 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
2031 f->symbol_hash = hash;
2033 memcpy(tmptab, f->symtab, sizeof(tmptab));
2034 memset(f->symtab, 0, sizeof(f->symtab));
2036 for (i = 0; i < HASH_BUCKETS; ++i)
2037 for (sym = tmptab[i]; sym; sym = next) {
2038 unsigned long h = hash(sym->name) % HASH_BUCKETS;
2040 sym->next = f->symtab[h];
2046 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
2048 static struct obj_symbol *
2049 obj_add_symbol(struct obj_file *f, const char *name,
2050 unsigned long symidx, int info,
2051 int secidx, ElfW(Addr) value,
2054 struct obj_symbol *sym;
2055 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2056 int n_type = ELF_ST_TYPE(info);
2057 int n_binding = ELF_ST_BIND(info);
2059 for (sym = f->symtab[hash]; sym; sym = sym->next)
2060 if (f->symbol_cmp(sym->name, name) == 0) {
2061 int o_secidx = sym->secidx;
2062 int o_info = sym->info;
2063 int o_type = ELF_ST_TYPE(o_info);
2064 int o_binding = ELF_ST_BIND(o_info);
2066 /* A redefinition! Is it legal? */
2068 if (secidx == SHN_UNDEF)
2070 else if (o_secidx == SHN_UNDEF)
2072 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
2073 /* Cope with local and global symbols of the same name
2074 in the same object file, as might have been created
2075 by ld -r. The only reason locals are now seen at this
2076 level at all is so that we can do semi-sensible things
2079 struct obj_symbol *nsym, **p;
2081 nsym = arch_new_symbol();
2082 nsym->next = sym->next;
2085 /* Excise the old (local) symbol from the hash chain. */
2086 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
2090 } else if (n_binding == STB_LOCAL) {
2091 /* Another symbol of the same name has already been defined.
2092 Just add this to the local table. */
2093 sym = arch_new_symbol();
2096 f->local_symtab[symidx] = sym;
2098 } else if (n_binding == STB_WEAK)
2100 else if (o_binding == STB_WEAK)
2102 /* Don't unify COMMON symbols with object types the programmer
2104 else if (secidx == SHN_COMMON
2105 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
2107 else if (o_secidx == SHN_COMMON
2108 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
2111 /* Don't report an error if the symbol is coming from
2112 the kernel or some external module. */
2113 if (secidx <= SHN_HIRESERVE)
2114 bb_error_msg("%s multiply defined", name);
2119 /* Completely new symbol. */
2120 sym = arch_new_symbol();
2121 sym->next = f->symtab[hash];
2122 f->symtab[hash] = sym;
2125 if (ELF_ST_BIND(info) == STB_LOCAL && symidx != -1) {
2126 if (symidx >= f->local_symtab_size)
2127 bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
2128 name, (long) symidx, (long) f->local_symtab_size);
2130 f->local_symtab[symidx] = sym;
2137 sym->secidx = secidx;
2143 static struct obj_symbol *
2144 obj_find_symbol(struct obj_file *f, const char *name)
2146 struct obj_symbol *sym;
2147 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2149 for (sym = f->symtab[hash]; sym; sym = sym->next)
2150 if (f->symbol_cmp(sym->name, name) == 0)
2157 obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2160 if (sym->secidx >= SHN_LORESERVE)
2163 return sym->value + f->sections[sym->secidx]->header.sh_addr;
2165 /* As a special case, a NULL sym has value zero. */
2170 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
2172 int i, n = f->header.e_shnum;
2174 for (i = 0; i < n; ++i)
2175 if (strcmp(f->sections[i]->name, name) == 0)
2176 return f->sections[i];
2181 static int obj_load_order_prio(struct obj_section *a)
2183 unsigned long af, ac;
2185 af = a->header.sh_flags;
2188 if (a->name[0] != '.' || strlen(a->name) != 10 ||
2189 strcmp(a->name + 5, ".init"))
2193 if (!(af & SHF_WRITE))
2195 if (af & SHF_EXECINSTR)
2197 if (a->header.sh_type != SHT_NOBITS)
2204 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
2206 struct obj_section **p;
2207 int prio = obj_load_order_prio(sec);
2208 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
2209 if (obj_load_order_prio(*p) < prio)
2211 sec->load_next = *p;
2215 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2217 unsigned long align,
2220 int newidx = f->header.e_shnum++;
2221 struct obj_section *sec;
2223 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2224 f->sections[newidx] = sec = arch_new_section();
2226 memset(sec, 0, sizeof(*sec));
2227 sec->header.sh_type = SHT_PROGBITS;
2228 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2229 sec->header.sh_size = size;
2230 sec->header.sh_addralign = align;
2234 sec->contents = xmalloc(size);
2236 obj_insert_section_load_order(f, sec);
2241 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
2243 unsigned long align,
2246 int newidx = f->header.e_shnum++;
2247 struct obj_section *sec;
2249 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2250 f->sections[newidx] = sec = arch_new_section();
2252 memset(sec, 0, sizeof(*sec));
2253 sec->header.sh_type = SHT_PROGBITS;
2254 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2255 sec->header.sh_size = size;
2256 sec->header.sh_addralign = align;
2260 sec->contents = xmalloc(size);
2262 sec->load_next = f->load_order;
2263 f->load_order = sec;
2264 if (f->load_order_search_start == &f->load_order)
2265 f->load_order_search_start = &sec->load_next;
2270 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
2272 unsigned long oldsize = sec->header.sh_size;
2274 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
2276 return sec->contents + oldsize;
2280 /* Conditionally add the symbols from the given symbol set to the
2284 add_symbols_from( struct obj_file *f,
2285 int idx, struct new_module_symbol *syms, size_t nsyms)
2287 struct new_module_symbol *s;
2290 #ifdef SYMBOL_PREFIX
2292 size_t name_alloced_size = 0;
2294 #ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
2297 gpl = obj_gpl_license(f, NULL) == 0;
2299 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
2300 /* Only add symbols that are already marked external.
2301 If we override locals we may cause problems for
2302 argument initialization. We will also create a false
2303 dependency on the module. */
2304 struct obj_symbol *sym;
2307 /* GPL licensed modules can use symbols exported with
2308 * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the
2309 * exported names. Non-GPL modules never see any GPLONLY_
2310 * symbols so they cannot fudge it by adding the prefix on
2313 if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) {
2314 #ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
2321 name = (char *)s->name;
2323 #ifdef SYMBOL_PREFIX
2324 /* Prepend SYMBOL_PREFIX to the symbol's name (the
2325 kernel exports `C names', but module object files
2326 reference `linker names'). */
2327 size_t extra = sizeof SYMBOL_PREFIX;
2328 size_t name_size = strlen (name) + extra;
2329 if (name_size > name_alloced_size) {
2330 name_alloced_size = name_size * 2;
2331 name_buf = alloca (name_alloced_size);
2333 strcpy (name_buf, SYMBOL_PREFIX);
2334 strcpy (name_buf + extra - 1, name);
2336 #endif /* SYMBOL_PREFIX */
2338 sym = obj_find_symbol(f, name);
2339 if (sym && !(ELF_ST_BIND(sym->info) == STB_LOCAL)) {
2340 #ifdef SYMBOL_PREFIX
2341 /* Put NAME_BUF into more permanent storage. */
2342 name = xmalloc (name_size);
2343 strcpy (name, name_buf);
2345 sym = obj_add_symbol(f, name, -1,
2346 ELF_ST_INFO(STB_GLOBAL,
2349 /* Did our symbol just get installed? If so, mark the
2350 module as "used". */
2351 if (sym->secidx == idx)
2359 static void add_kernel_symbols(struct obj_file *f)
2361 struct external_module *m;
2364 /* Add module symbols first. */
2366 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m)
2368 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms,
2369 m->nsyms)) m->used = 1, ++nused;
2371 n_ext_modules_used = nused;
2373 /* And finally the symbols from the kernel proper. */
2376 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
2379 static char *get_modinfo_value(struct obj_file *f, const char *key)
2381 struct obj_section *sec;
2382 char *p, *v, *n, *ep;
2383 size_t klen = strlen(key);
2385 sec = obj_find_section(f, ".modinfo");
2389 ep = p + sec->header.sh_size;
2392 n = strchr(p, '\0');
2394 if (p + klen == v && strncmp(p, key, klen) == 0)
2397 if (p + klen == n && strcmp(p, key) == 0)
2407 /*======================================================================*/
2408 /* Functions relating to module loading after 2.1.18. */
2411 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2414 char *p, *q, *key, *sym_name;
2415 struct obj_symbol *sym;
2416 char *contents, *loc;
2420 if ((q = strchr(p, '=')) == NULL) {
2425 key = alloca(q - p + 6);
2426 memcpy(key, "parm_", 5);
2427 memcpy(key + 5, p, q - p);
2430 p = get_modinfo_value(f, key);
2433 bb_error_msg("invalid parameter %s", key);
2437 #ifdef SYMBOL_PREFIX
2438 sym_name = alloca (strlen (key) + sizeof SYMBOL_PREFIX);
2439 strcpy (sym_name, SYMBOL_PREFIX);
2440 strcat (sym_name, key);
2444 sym = obj_find_symbol(f, sym_name);
2446 /* Also check that the parameter was not resolved from the kernel. */
2447 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2448 bb_error_msg("symbol for parameter %s not found", key);
2453 min = strtoul(p, &p, 10);
2455 max = strtoul(p + 1, &p, 10);
2461 contents = f->sections[sym->secidx]->contents;
2462 loc = contents + sym->value;
2466 if ((*p == 's') || (*p == 'c')) {
2469 /* Do C quoting if we begin with a ", else slurp the lot. */
2473 str = alloca(strlen(q));
2474 for (r = str, q++; *q != '"'; ++q, ++r) {
2476 bb_error_msg("improperly terminated string argument for %s",
2479 } else if (*q == '\\')
2513 if (q[1] >= '0' && q[1] <= '7') {
2514 c = (c * 8) + *++q - '0';
2515 if (q[1] >= '0' && q[1] <= '7')
2516 c = (c * 8) + *++q - '0';
2533 /* In this case, the string is not quoted. We will break
2534 it using the coma (like for ints). If the user wants to
2535 include comas in a string, he just has to quote it */
2537 /* Search the next coma */
2541 if (r != (char *) NULL) {
2542 /* Recopy the current field */
2543 str = alloca(r - q + 1);
2544 memcpy(str, q, r - q);
2546 /* I don't know if it is useful, as the previous case
2547 doesn't nul terminate the string ??? */
2550 /* Keep next fields */
2561 obj_string_patch(f, sym->secidx, loc - contents, str);
2562 loc += tgt_sizeof_char_p;
2564 /* Array of chars (in fact, matrix !) */
2565 unsigned long charssize; /* size of each member */
2567 /* Get the size of each member */
2568 /* Probably we should do that outside the loop ? */
2569 if (!isdigit(*(p + 1))) {
2570 bb_error_msg("parameter type 'c' for %s must be followed by"
2571 " the maximum size", key);
2574 charssize = strtoul(p + 1, (char **) NULL, 10);
2577 if (strlen(str) >= charssize) {
2578 bb_error_msg("string too long for %s (max %ld)", key,
2583 /* Copy to location */
2584 strcpy((char *) loc, str);
2588 long v = strtoul(q, &q, 0);
2595 loc += tgt_sizeof_short;
2599 loc += tgt_sizeof_int;
2603 loc += tgt_sizeof_long;
2607 bb_error_msg("unknown parameter type '%c' for %s", *p, key);
2622 goto retry_end_of_value;
2626 bb_error_msg("too many values for %s (max %d)", key, max);
2633 bb_error_msg("invalid argument syntax for %s", key);
2640 bb_error_msg("too few values for %s (min %d)", key, min);
2650 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
2651 static int new_is_module_checksummed(struct obj_file *f)
2653 const char *p = get_modinfo_value(f, "using_checksums");
2660 /* Get the module's kernel version in the canonical integer form. */
2663 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2668 p = get_modinfo_value(f, "kernel_version");
2671 safe_strncpy(str, p, STRVERSIONLEN);
2673 a = strtoul(p, &p, 10);
2676 b = strtoul(p + 1, &p, 10);
2679 c = strtoul(p + 1, &q, 10);
2683 return a << 16 | b << 8 | c;
2686 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
2689 /* Fetch the loaded modules, and all currently exported symbols. */
2691 static int new_get_kernel_symbols(void)
2693 char *module_names, *mn;
2694 struct external_module *modules, *m;
2695 struct new_module_symbol *syms, *s;
2696 size_t ret, bufsize, nmod, nsyms, i, j;
2698 /* Collect the loaded modules. */
2700 module_names = xmalloc(bufsize = 256);
2702 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2703 if (errno == ENOSPC && bufsize < ret) {
2704 module_names = xrealloc(module_names, bufsize = ret);
2705 goto retry_modules_load;
2707 bb_perror_msg("QM_MODULES");
2711 n_ext_modules = nmod = ret;
2713 /* Collect the modules' symbols. */
2716 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2717 memset(modules, 0, nmod * sizeof(*modules));
2718 for (i = 0, mn = module_names, m = modules;
2719 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2720 struct new_module_info info;
2722 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2723 if (errno == ENOENT) {
2724 /* The module was removed out from underneath us. */
2727 bb_perror_msg("query_module: QM_INFO: %s", mn);
2731 syms = xmalloc(bufsize = 1024);
2733 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2736 syms = xrealloc(syms, bufsize = ret);
2737 goto retry_mod_sym_load;
2739 /* The module was removed out from underneath us. */
2742 bb_perror_msg("query_module: QM_SYMBOLS: %s", mn);
2749 m->addr = info.addr;
2753 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2754 s->name += (unsigned long) syms;
2759 /* Collect the kernel's symbols. */
2761 syms = xmalloc(bufsize = 16 * 1024);
2762 retry_kern_sym_load:
2763 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2764 if (errno == ENOSPC && bufsize < ret) {
2765 syms = xrealloc(syms, bufsize = ret);
2766 goto retry_kern_sym_load;
2768 bb_perror_msg("kernel: QM_SYMBOLS");
2771 nksyms = nsyms = ret;
2774 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2775 s->name += (unsigned long) syms;
2781 /* Return the kernel symbol checksum version, or zero if not used. */
2783 static int new_is_kernel_checksummed(void)
2785 struct new_module_symbol *s;
2788 /* Using_Versions is not the first symbol, but it should be in there. */
2790 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2791 if (strcmp((char *) s->name, "Using_Versions") == 0)
2798 static int new_create_this_module(struct obj_file *f, const char *m_name)
2800 struct obj_section *sec;
2802 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2803 sizeof(struct new_module));
2804 memset(sec->contents, 0, sizeof(struct new_module));
2806 obj_add_symbol(f, SPFX "__this_module", -1,
2807 ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0,
2808 sizeof(struct new_module));
2810 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2816 #ifdef CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
2817 /* add an entry to the __ksymtab section, creating it if necessary */
2818 static void new_add_ksymtab(struct obj_file *f, struct obj_symbol *sym)
2820 struct obj_section *sec;
2823 /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section.
2824 * If __ksymtab is defined but not marked alloc, x out the first character
2825 * (no obj_delete routine) and create a new __ksymtab with the correct
2828 sec = obj_find_section(f, "__ksymtab");
2829 if (sec && !(sec->header.sh_flags & SHF_ALLOC)) {
2830 *((char *)(sec->name)) = 'x'; /* override const */
2834 sec = obj_create_alloced_section(f, "__ksymtab",
2835 tgt_sizeof_void_p, 0);
2838 sec->header.sh_flags |= SHF_ALLOC;
2839 sec->header.sh_addralign = tgt_sizeof_void_p; /* Empty section might
2841 ofs = sec->header.sh_size;
2842 obj_symbol_patch(f, sec->idx, ofs, sym);
2843 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name);
2844 obj_extend_section(sec, 2 * tgt_sizeof_char_p);
2846 #endif /* CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
2848 static int new_create_module_ksymtab(struct obj_file *f)
2850 struct obj_section *sec;
2853 /* We must always add the module references. */
2855 if (n_ext_modules_used) {
2856 struct new_module_ref *dep;
2857 struct obj_symbol *tm;
2859 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2860 (sizeof(struct new_module_ref)
2861 * n_ext_modules_used));
2865 tm = obj_find_symbol(f, SPFX "__this_module");
2866 dep = (struct new_module_ref *) sec->contents;
2867 for (i = 0; i < n_ext_modules; ++i)
2868 if (ext_modules[i].used) {
2869 dep->dep = ext_modules[i].addr;
2870 obj_symbol_patch(f, sec->idx,
2871 (char *) &dep->ref - sec->contents, tm);
2877 if (!flag_noexport && !obj_find_section(f, "__ksymtab")) {
2882 obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p,
2885 /* We don't want to export symbols residing in sections that
2886 aren't loaded. There are a number of these created so that
2887 we make sure certain module options don't appear twice. */
2889 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2891 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2893 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2894 struct obj_symbol *sym;
2895 for (sym = f->symtab[i]; sym; sym = sym->next)
2896 if (ELF_ST_BIND(sym->info) != STB_LOCAL
2897 && sym->secidx <= SHN_HIRESERVE
2898 && (sym->secidx >= SHN_LORESERVE
2899 || loaded[sym->secidx])) {
2900 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2902 obj_symbol_patch(f, sec->idx, ofs, sym);
2903 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2910 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2918 new_init_module(const char *m_name, struct obj_file *f, unsigned long m_size)
2920 struct new_module *module;
2921 struct obj_section *sec;
2926 sec = obj_find_section(f, ".this");
2927 if (!sec || !sec->contents) {
2928 bb_perror_msg_and_die("corrupt module %s?",m_name);
2930 module = (struct new_module *) sec->contents;
2931 m_addr = sec->header.sh_addr;
2933 module->size_of_struct = sizeof(*module);
2934 module->size = m_size;
2935 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2937 sec = obj_find_section(f, "__ksymtab");
2938 if (sec && sec->header.sh_size) {
2939 module->syms = sec->header.sh_addr;
2940 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2943 if (n_ext_modules_used) {
2944 sec = obj_find_section(f, ".kmodtab");
2945 module->deps = sec->header.sh_addr;
2946 module->ndeps = n_ext_modules_used;
2950 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "init_module"));
2952 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "cleanup_module"));
2954 sec = obj_find_section(f, "__ex_table");
2956 module->ex_table_start = sec->header.sh_addr;
2957 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2960 sec = obj_find_section(f, ".text.init");
2962 module->runsize = sec->header.sh_addr - m_addr;
2964 sec = obj_find_section(f, ".data.init");
2966 if (!module->runsize ||
2967 module->runsize > sec->header.sh_addr - m_addr)
2968 module->runsize = sec->header.sh_addr - m_addr;
2970 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2971 if (sec && sec->header.sh_size) {
2972 module->archdata_start = (void*)sec->header.sh_addr;
2973 module->archdata_end = module->archdata_start + sec->header.sh_size;
2975 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2976 if (sec && sec->header.sh_size) {
2977 module->kallsyms_start = (void*)sec->header.sh_addr;
2978 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2981 /* Whew! All of the initialization is complete. Collect the final
2982 module image and give it to the kernel. */
2984 image = xmalloc(m_size);
2985 obj_create_image(f, image);
2987 ret = init_module(m_name, (struct new_module *) image);
2989 bb_perror_msg("init_module: %s", m_name);
2997 /*======================================================================*/
3000 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
3003 struct obj_string_patch *p;
3004 struct obj_section *strsec;
3005 size_t len = strlen(string) + 1;
3008 p = xmalloc(sizeof(*p));
3009 p->next = f->string_patches;
3010 p->reloc_secidx = secidx;
3011 p->reloc_offset = offset;
3012 f->string_patches = p;
3014 strsec = obj_find_section(f, ".kstrtab");
3015 if (strsec == NULL) {
3016 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
3017 p->string_offset = 0;
3018 loc = strsec->contents;
3020 p->string_offset = strsec->header.sh_size;
3021 loc = obj_extend_section(strsec, len);
3023 memcpy(loc, string, len);
3029 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
3030 struct obj_symbol *sym)
3032 struct obj_symbol_patch *p;
3034 p = xmalloc(sizeof(*p));
3035 p->next = f->symbol_patches;
3036 p->reloc_secidx = secidx;
3037 p->reloc_offset = offset;
3039 f->symbol_patches = p;
3044 static int obj_check_undefineds(struct obj_file *f)
3049 for (i = 0; i < HASH_BUCKETS; ++i) {
3050 struct obj_symbol *sym;
3051 for (sym = f->symtab[i]; sym; sym = sym->next)
3052 if (sym->secidx == SHN_UNDEF) {
3053 if (ELF_ST_BIND(sym->info) == STB_WEAK) {
3054 sym->secidx = SHN_ABS;
3058 bb_error_msg("unresolved symbol %s", sym->name);
3068 static void obj_allocate_commons(struct obj_file *f)
3070 struct common_entry {
3071 struct common_entry *next;
3072 struct obj_symbol *sym;
3073 } *common_head = NULL;
3077 for (i = 0; i < HASH_BUCKETS; ++i) {
3078 struct obj_symbol *sym;
3079 for (sym = f->symtab[i]; sym; sym = sym->next)
3080 if (sym->secidx == SHN_COMMON) {
3081 /* Collect all COMMON symbols and sort them by size so as to
3082 minimize space wasted by alignment requirements. */
3084 struct common_entry **p, *n;
3085 for (p = &common_head; *p; p = &(*p)->next)
3086 if (sym->size <= (*p)->sym->size)
3089 n = alloca(sizeof(*n));
3097 for (i = 1; i < f->local_symtab_size; ++i) {
3098 struct obj_symbol *sym = f->local_symtab[i];
3099 if (sym && sym->secidx == SHN_COMMON) {
3100 struct common_entry **p, *n;
3101 for (p = &common_head; *p; p = &(*p)->next)
3102 if (sym == (*p)->sym)
3104 else if (sym->size < (*p)->sym->size) {
3105 n = alloca(sizeof(*n));
3115 /* Find the bss section. */
3116 for (i = 0; i < f->header.e_shnum; ++i)
3117 if (f->sections[i]->header.sh_type == SHT_NOBITS)
3120 /* If for some reason there hadn't been one, create one. */
3121 if (i == f->header.e_shnum) {
3122 struct obj_section *sec;
3124 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
3125 f->sections[i] = sec = arch_new_section();
3126 f->header.e_shnum = i + 1;
3128 memset(sec, 0, sizeof(*sec));
3129 sec->header.sh_type = SHT_PROGBITS;
3130 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
3135 /* Allocate the COMMONS. */
3137 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
3138 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
3139 struct common_entry *c;
3141 for (c = common_head; c; c = c->next) {
3142 ElfW(Addr) align = c->sym->value;
3144 if (align > max_align)
3146 if (bss_size & (align - 1))
3147 bss_size = (bss_size | (align - 1)) + 1;
3150 c->sym->value = bss_size;
3152 bss_size += c->sym->size;
3155 f->sections[i]->header.sh_size = bss_size;
3156 f->sections[i]->header.sh_addralign = max_align;
3160 /* For the sake of patch relocation and parameter initialization,
3161 allocate zeroed data for NOBITS sections now. Note that after
3162 this we cannot assume NOBITS are really empty. */
3163 for (i = 0; i < f->header.e_shnum; ++i) {
3164 struct obj_section *s = f->sections[i];
3165 if (s->header.sh_type == SHT_NOBITS) {
3166 if (s->header.sh_size != 0)
3167 s->contents = memset(xmalloc(s->header.sh_size),
3168 0, s->header.sh_size);
3172 s->header.sh_type = SHT_PROGBITS;
3177 static unsigned long obj_load_size(struct obj_file *f)
3179 unsigned long dot = 0;
3180 struct obj_section *sec;
3182 /* Finalize the positions of the sections relative to one another. */
3184 for (sec = f->load_order; sec; sec = sec->load_next) {
3187 align = sec->header.sh_addralign;
3188 if (align && (dot & (align - 1)))
3189 dot = (dot | (align - 1)) + 1;
3191 sec->header.sh_addr = dot;
3192 dot += sec->header.sh_size;
3198 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
3200 int i, n = f->header.e_shnum;
3203 /* Finalize the addresses of the sections. */
3206 for (i = 0; i < n; ++i)
3207 f->sections[i]->header.sh_addr += base;
3209 /* And iterate over all of the relocations. */
3211 for (i = 0; i < n; ++i) {
3212 struct obj_section *relsec, *symsec, *targsec, *strsec;
3213 ElfW(RelM) * rel, *relend;
3217 relsec = f->sections[i];
3218 if (relsec->header.sh_type != SHT_RELM)
3221 symsec = f->sections[relsec->header.sh_link];
3222 targsec = f->sections[relsec->header.sh_info];
3223 strsec = f->sections[symsec->header.sh_link];
3225 rel = (ElfW(RelM) *) relsec->contents;
3226 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
3227 symtab = (ElfW(Sym) *) symsec->contents;
3228 strtab = (const char *) strsec->contents;
3230 for (; rel < relend; ++rel) {
3231 ElfW(Addr) value = 0;
3232 struct obj_symbol *intsym = NULL;
3233 unsigned long symndx;
3234 ElfW(Sym) * extsym = 0;
3237 /* Attempt to find a value to use for this relocation. */
3239 symndx = ELF_R_SYM(rel->r_info);
3241 /* Note we've already checked for undefined symbols. */
3243 extsym = &symtab[symndx];
3244 if (ELF_ST_BIND(extsym->st_info) == STB_LOCAL) {
3245 /* Local symbols we look up in the local table to be sure
3246 we get the one that is really intended. */
3247 intsym = f->local_symtab[symndx];
3249 /* Others we look up in the hash table. */
3251 if (extsym->st_name)
3252 name = strtab + extsym->st_name;
3254 name = f->sections[extsym->st_shndx]->name;
3255 intsym = obj_find_symbol(f, name);
3258 value = obj_symbol_final_value(f, intsym);
3259 intsym->referenced = 1;
3261 #if SHT_RELM == SHT_RELA
3262 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
3263 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
3264 if (!extsym || !extsym->st_name ||
3265 ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
3267 value += rel->r_addend;
3271 switch (arch_apply_relocation
3272 (f, targsec, symsec, intsym, rel, value)) {
3276 case obj_reloc_overflow:
3277 errmsg = "Relocation overflow";
3279 case obj_reloc_dangerous:
3280 errmsg = "Dangerous relocation";
3282 case obj_reloc_unhandled:
3283 errmsg = "Unhandled relocation";
3286 bb_error_msg("%s of type %ld for %s", errmsg,
3287 (long) ELF_R_TYPE(rel->r_info),
3288 strtab + extsym->st_name);
3290 bb_error_msg("%s of type %ld", errmsg,
3291 (long) ELF_R_TYPE(rel->r_info));
3299 /* Finally, take care of the patches. */
3301 if (f->string_patches) {
3302 struct obj_string_patch *p;
3303 struct obj_section *strsec;
3304 ElfW(Addr) strsec_base;
3305 strsec = obj_find_section(f, ".kstrtab");
3306 strsec_base = strsec->header.sh_addr;
3308 for (p = f->string_patches; p; p = p->next) {
3309 struct obj_section *targsec = f->sections[p->reloc_secidx];
3310 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3311 = strsec_base + p->string_offset;
3315 if (f->symbol_patches) {
3316 struct obj_symbol_patch *p;
3318 for (p = f->symbol_patches; p; p = p->next) {
3319 struct obj_section *targsec = f->sections[p->reloc_secidx];
3320 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3321 = obj_symbol_final_value(f, p->sym);
3328 static int obj_create_image(struct obj_file *f, char *image)
3330 struct obj_section *sec;
3331 ElfW(Addr) base = f->baseaddr;
3333 for (sec = f->load_order; sec; sec = sec->load_next) {
3336 if (sec->contents == 0 || sec->header.sh_size == 0)
3339 secimg = image + (sec->header.sh_addr - base);
3341 /* Note that we allocated data for NOBITS sections earlier. */
3342 memcpy(secimg, sec->contents, sec->header.sh_size);
3348 /*======================================================================*/
3350 static struct obj_file *obj_load(FILE * fp, int loadprogbits)
3353 ElfW(Shdr) * section_headers;
3357 /* Read the file header. */
3359 f = arch_new_file();
3360 memset(f, 0, sizeof(*f));
3361 f->symbol_cmp = strcmp;
3362 f->symbol_hash = obj_elf_hash;
3363 f->load_order_search_start = &f->load_order;
3365 fseek(fp, 0, SEEK_SET);
3366 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
3367 bb_perror_msg("error reading ELF header");
3371 if (f->header.e_ident[EI_MAG0] != ELFMAG0
3372 || f->header.e_ident[EI_MAG1] != ELFMAG1
3373 || f->header.e_ident[EI_MAG2] != ELFMAG2
3374 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
3375 bb_error_msg("not an ELF file");
3378 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3379 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN
3380 ? ELFDATA2MSB : ELFDATA2LSB)
3381 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3382 || !MATCH_MACHINE(f->header.e_machine)) {
3383 bb_error_msg("ELF file not for this architecture");
3386 if (f->header.e_type != ET_REL) {
3387 bb_error_msg("ELF file not a relocatable object");
3391 /* Read the section headers. */
3393 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3394 bb_error_msg("section header size mismatch: %lu != %lu",
3395 (unsigned long) f->header.e_shentsize,
3396 (unsigned long) sizeof(ElfW(Shdr)));
3400 shnum = f->header.e_shnum;
3401 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3402 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3404 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3405 fseek(fp, f->header.e_shoff, SEEK_SET);
3406 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3407 bb_perror_msg("error reading ELF section headers");
3411 /* Read the section data. */
3413 for (i = 0; i < shnum; ++i) {
3414 struct obj_section *sec;
3416 f->sections[i] = sec = arch_new_section();
3417 memset(sec, 0, sizeof(*sec));
3419 sec->header = section_headers[i];
3422 if(sec->header.sh_size) switch (sec->header.sh_type) {
3431 if (!loadprogbits) {
3432 sec->contents = NULL;
3439 if (sec->header.sh_size > 0) {
3440 sec->contents = xmalloc(sec->header.sh_size);
3441 fseek(fp, sec->header.sh_offset, SEEK_SET);
3442 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3443 bb_perror_msg("error reading ELF section data");
3447 sec->contents = NULL;
3451 #if SHT_RELM == SHT_REL
3453 bb_error_msg("RELA relocations not supported on this architecture");
3457 bb_error_msg("REL relocations not supported on this architecture");
3462 if (sec->header.sh_type >= SHT_LOPROC) {
3463 /* Assume processor specific section types are debug
3464 info and can safely be ignored. If this is ever not
3465 the case (Hello MIPS?), don't put ifdefs here but
3466 create an arch_load_proc_section(). */
3470 bb_error_msg("can't handle sections of type %ld",
3471 (long) sec->header.sh_type);
3476 /* Do what sort of interpretation as needed by each section. */
3478 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3480 for (i = 0; i < shnum; ++i) {
3481 struct obj_section *sec = f->sections[i];
3482 sec->name = shstrtab + sec->header.sh_name;
3485 for (i = 0; i < shnum; ++i) {
3486 struct obj_section *sec = f->sections[i];
3488 /* .modinfo should be contents only but gcc has no attribute for that.
3489 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3491 if (strcmp(sec->name, ".modinfo") == 0)
3492 sec->header.sh_flags &= ~SHF_ALLOC;
3494 if (sec->header.sh_flags & SHF_ALLOC)
3495 obj_insert_section_load_order(f, sec);
3497 switch (sec->header.sh_type) {
3500 unsigned long nsym, j;
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)));
3511 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3512 strtab = f->sections[sec->header.sh_link]->contents;
3513 sym = (ElfW(Sym) *) sec->contents;
3515 /* Allocate space for a table of local symbols. */
3516 j = f->local_symtab_size = sec->header.sh_info;
3517 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3519 /* Insert all symbols into the hash table. */
3520 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3521 ElfW(Addr) val = sym->st_value;
3524 name = strtab + sym->st_name;
3525 else if (sym->st_shndx < shnum)
3526 name = f->sections[sym->st_shndx]->name;
3530 #if defined(__SH5__)
3532 * For sh64 it is possible that the target of a branch
3533 * requires a mode switch (32 to 16 and back again).
3535 * This is implied by the lsb being set in the target
3536 * address for SHmedia mode and clear for SHcompact.
3538 val |= sym->st_other & 4;
3541 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3548 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3549 bb_error_msg("relocation entry size mismatch: %lu != %lu",
3550 (unsigned long) sec->header.sh_entsize,
3551 (unsigned long) sizeof(ElfW(RelM)));
3555 /* 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,
3557 * which gets done in a second pass through the sections.
3558 * This BusyBox insmod does similar work in obj_relocate(). */
3565 #ifdef CONFIG_FEATURE_INSMOD_LOADINKMEM
3567 * load the unloaded sections directly into the memory allocated by
3568 * kernel for the module
3571 static int obj_load_progbits(FILE * fp, struct obj_file* f, char* imagebase)
3573 ElfW(Addr) base = f->baseaddr;
3574 struct obj_section* sec;
3576 for (sec = f->load_order; sec; sec = sec->load_next) {
3578 /* section already loaded? */
3579 if (sec->contents != NULL)
3582 if (sec->header.sh_size == 0)
3585 sec->contents = imagebase + (sec->header.sh_addr - base);
3586 fseek(fp, sec->header.sh_offset, SEEK_SET);
3587 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3588 bb_perror_msg("error reading ELF section data");
3597 static void hide_special_symbols(struct obj_file *f)
3599 static const char *const specials[] = {
3600 SPFX "cleanup_module",
3602 SPFX "kernel_version",
3606 struct obj_symbol *sym;
3607 const char *const *p;
3609 for (p = specials; *p; ++p)
3610 if ((sym = obj_find_symbol(f, *p)) != NULL)
3612 ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info));
3616 #ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
3617 static int obj_gpl_license(struct obj_file *f, const char **license)
3619 struct obj_section *sec;
3620 /* This list must match *exactly* the list of allowable licenses in
3621 * linux/include/linux/module.h. Checking for leading "GPL" will not
3622 * work, somebody will use "GPL sucks, this is proprietary".
3624 static const char * const gpl_licenses[] = {
3627 "GPL and additional rights",
3632 if ((sec = obj_find_section(f, ".modinfo"))) {
3633 const char *value, *ptr, *endptr;
3634 ptr = sec->contents;
3635 endptr = ptr + sec->header.sh_size;
3636 while (ptr < endptr) {
3637 if ((value = strchr(ptr, '=')) && strncmp(ptr, "license", value-ptr) == 0) {
3641 for (i = 0; i < sizeof(gpl_licenses)/sizeof(gpl_licenses[0]); ++i) {
3642 if (strcmp(value+1, gpl_licenses[i]) == 0)
3647 if (strchr(ptr, '\0'))
3648 ptr = strchr(ptr, '\0') + 1;
3656 #define TAINT_FILENAME "/proc/sys/kernel/tainted"
3657 #define TAINT_PROPRIETORY_MODULE (1<<0)
3658 #define TAINT_FORCED_MODULE (1<<1)
3659 #define TAINT_UNSAFE_SMP (1<<2)
3660 #define TAINT_URL "http://www.tux.org/lkml/#export-tainted"
3662 static void set_tainted(struct obj_file *f, int fd, char *m_name,
3663 int kernel_has_tainted, int taint, const char *text1, const char *text2)
3667 static int first = 1;
3668 if (fd < 0 && !kernel_has_tainted)
3669 return; /* New modutils on old kernel */
3670 printf("Warning: loading %s will taint the kernel: %s%s\n",
3671 m_name, text1, text2);
3673 printf(" See %s for information about tainted modules\n", TAINT_URL);
3677 read(fd, buf, sizeof(buf)-1);
3678 buf[sizeof(buf)-1] = '\0';
3679 oldval = strtoul(buf, NULL, 10);
3680 sprintf(buf, "%d\n", oldval | taint);
3681 write(fd, buf, strlen(buf));
3685 /* Check if loading this module will taint the kernel. */
3686 static void check_tainted_module(struct obj_file *f, char *m_name)
3688 static const char tainted_file[] = TAINT_FILENAME;
3689 int fd, kernel_has_tainted;
3692 kernel_has_tainted = 1;
3693 if ((fd = open(tainted_file, O_RDWR)) < 0) {
3694 if (errno == ENOENT)
3695 kernel_has_tainted = 0;
3696 else if (errno == EACCES)
3697 kernel_has_tainted = 1;
3699 perror(tainted_file);
3700 kernel_has_tainted = 0;
3704 switch (obj_gpl_license(f, &ptr)) {
3708 set_tainted(f, fd, m_name, kernel_has_tainted, TAINT_PROPRIETORY_MODULE, "no license", "");
3711 /* The module has a non-GPL license so we pretend that the
3712 * kernel always has a taint flag to get a warning even on
3713 * kernels without the proc flag.
3715 set_tainted(f, fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr);
3718 set_tainted(f, fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", "");
3722 if (flag_force_load)
3723 set_tainted(f, fd, m_name, 1, TAINT_FORCED_MODULE, "forced load", "");
3728 #else /* CONFIG_FEATURE_CHECK_TAINTED_MODULE */
3729 #define check_tainted_module(x, y) do { } while(0);
3730 #endif /* CONFIG_FEATURE_CHECK_TAINTED_MODULE */
3732 #ifdef CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
3733 /* add module source, timestamp, kernel version and a symbol for the
3734 * start of some sections. this info is used by ksymoops to do better
3738 get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
3740 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
3741 return new_get_module_version(f, str);
3742 #else /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
3743 strncpy(str, "???", sizeof(str));
3745 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
3748 /* add module source, timestamp, kernel version and a symbol for the
3749 * start of some sections. this info is used by ksymoops to do better
3753 add_ksymoops_symbols(struct obj_file *f, const char *filename,
3756 static const char symprefix[] = "__insmod_";
3757 struct obj_section *sec;
3758 struct obj_symbol *sym;
3759 char *name, *absolute_filename;
3760 char str[STRVERSIONLEN], real[PATH_MAX];
3761 int i, l, lm_name, lfilename, use_ksymtab, version;
3762 struct stat statbuf;
3764 static const char *section_names[] = {
3772 if (realpath(filename, real)) {
3773 absolute_filename = xstrdup(real);
3776 int save_errno = errno;
3777 bb_error_msg("cannot get realpath for %s", filename);
3780 absolute_filename = xstrdup(filename);
3783 lm_name = strlen(m_name);
3784 lfilename = strlen(absolute_filename);
3786 /* add to ksymtab if it already exists or there is no ksymtab and other symbols
3787 * are not to be exported. otherwise leave ksymtab alone for now, the
3788 * "export all symbols" compatibility code will export these symbols later.
3790 use_ksymtab = obj_find_section(f, "__ksymtab") || flag_noexport;
3792 if ((sec = obj_find_section(f, ".this"))) {
3793 /* tag the module header with the object name, last modified
3794 * timestamp and module version. worst case for module version
3795 * is 0xffffff, decimal 16777215. putting all three fields in
3796 * one symbol is less readable but saves kernel space.
3798 l = sizeof(symprefix)+ /* "__insmod_" */
3799 lm_name+ /* module name */
3801 lfilename+ /* object filename */
3803 2*sizeof(statbuf.st_mtime)+ /* mtime in hex */
3805 8+ /* version in dec */
3808 if (stat(absolute_filename, &statbuf) != 0)
3809 statbuf.st_mtime = 0;
3810 version = get_module_version(f, str); /* -1 if not found */
3811 snprintf(name, l, "%s%s_O%s_M%0*lX_V%d",
3812 symprefix, m_name, absolute_filename,
3813 (int)(2*sizeof(statbuf.st_mtime)), statbuf.st_mtime,
3815 sym = obj_add_symbol(f, name, -1,
3816 ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3817 sec->idx, sec->header.sh_addr, 0);
3819 new_add_ksymtab(f, sym);
3821 free(absolute_filename);
3822 #ifdef _NOT_SUPPORTED_
3823 /* record where the persistent data is going, same address as previous symbol */
3826 l = sizeof(symprefix)+ /* "__insmod_" */
3827 lm_name+ /* module name */
3829 strlen(f->persist)+ /* data store */
3832 snprintf(name, l, "%s%s_P%s",
3833 symprefix, m_name, f->persist);
3834 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3835 sec->idx, sec->header.sh_addr, 0);
3837 new_add_ksymtab(f, sym);
3839 #endif /* _NOT_SUPPORTED_ */
3840 /* tag the desired sections if size is non-zero */
3842 for (i = 0; i < sizeof(section_names)/sizeof(section_names[0]); ++i) {
3843 if ((sec = obj_find_section(f, section_names[i])) &&
3844 sec->header.sh_size) {
3845 l = sizeof(symprefix)+ /* "__insmod_" */
3846 lm_name+ /* module name */
3848 strlen(sec->name)+ /* section name */
3850 8+ /* length in dec */
3853 snprintf(name, l, "%s%s_S%s_L%ld",
3854 symprefix, m_name, sec->name,
3855 (long)sec->header.sh_size);
3856 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3857 sec->idx, sec->header.sh_addr, 0);
3859 new_add_ksymtab(f, sym);
3863 #endif /* CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
3865 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP
3866 static void print_load_map(struct obj_file *f)
3868 struct obj_symbol *sym;
3869 struct obj_symbol **all, **p;
3870 struct obj_section *sec;
3871 int i, nsyms, *loaded;
3873 /* Report on the section layout. */
3875 printf("Sections: Size %-*s Align\n",
3876 (int) (2 * sizeof(void *)), "Address");
3878 for (sec = f->load_order; sec; sec = sec->load_next) {
3882 for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a)
3887 printf("%-15s %08lx %0*lx 2**%d\n",
3889 (long)sec->header.sh_size,
3890 (int) (2 * sizeof(void *)),
3891 (long)sec->header.sh_addr,
3894 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL
3895 /* Quick reference which section indicies are loaded. */
3897 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
3899 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
3901 /* Collect the symbols we'll be listing. */
3903 for (nsyms = i = 0; i < HASH_BUCKETS; ++i)
3904 for (sym = f->symtab[i]; sym; sym = sym->next)
3905 if (sym->secidx <= SHN_HIRESERVE
3906 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3909 all = alloca(nsyms * sizeof(struct obj_symbol *));
3911 for (i = 0, p = all; i < HASH_BUCKETS; ++i)
3912 for (sym = f->symtab[i]; sym; sym = sym->next)
3913 if (sym->secidx <= SHN_HIRESERVE
3914 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3917 /* And list them. */
3918 printf("\nSymbols:\n");
3919 for (p = all; p < all + nsyms; ++p) {
3921 unsigned long value;
3924 if (sym->secidx == SHN_ABS) {
3927 } else if (sym->secidx == SHN_UNDEF) {
3931 sec = f->sections[sym->secidx];
3933 if (sec->header.sh_type == SHT_NOBITS)
3935 else if (sec->header.sh_flags & SHF_ALLOC) {
3936 if (sec->header.sh_flags & SHF_EXECINSTR)
3938 else if (sec->header.sh_flags & SHF_WRITE)
3943 value = sym->value + sec->header.sh_addr;
3946 if (ELF_ST_BIND(sym->info) == STB_LOCAL)
3947 type = tolower(type);
3949 printf("%0*lx %c %s\n", (int) (2 * sizeof(void *)), value,
3954 #else /* !CONFIG_FEATURE_INSMOD_LOAD_MAP */
3955 void print_load_map(struct obj_file *f);
3958 int insmod_main( int argc, char **argv)
3964 unsigned long m_size;
3969 int exit_status = EXIT_FAILURE;
3971 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
3972 struct utsname uts_info;
3973 char m_strversion[STRVERSIONLEN];
3974 int m_version, m_crcs;
3976 #ifdef CONFIG_FEATURE_CLEAN_UP
3982 struct utsname myuname;
3984 /* Parse any options */
3985 getopt32(argc, argv, OPTION_STR, &opt_o);
3986 if (option_mask32 & OPT_o) { // -o /* name the output module */
3988 m_name = xstrdup(opt_o);
3991 if (argv[optind] == NULL) {
3995 /* Grab the module name */
3996 tmp1 = xstrdup(argv[optind]);
3997 tmp = basename(tmp1);
4000 if (uname(&myuname) == 0) {
4001 if (myuname.release[0] == '2') {
4002 k_version = myuname.release[2] - '0';
4006 #if defined(CONFIG_FEATURE_2_6_MODULES)
4007 if (k_version > 4 && len > 3 && tmp[len - 3] == '.' &&
4008 tmp[len - 2] == 'k' && tmp[len - 1] == 'o') {
4014 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
4020 #if defined(CONFIG_FEATURE_2_6_MODULES)
4022 m_fullName = xasprintf("%s.ko", tmp);
4025 m_fullName = xasprintf("%s.o", tmp);
4031 tmp1 = 0; /* flag for free(m_name) before exit() */
4034 /* 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) ||
4036 (fp = fopen(argv[optind], "r")) == NULL) {
4037 /* 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... */
4039 if (k_version) { /* uname succeedd */
4042 char real_module_dir[FILENAME_MAX];
4044 tmdn = concat_path_file(_PATH_MODULES, myuname.release);
4045 /* Jump through hoops in case /lib/modules/`uname -r`
4046 * is a symlink. We do not want recursive_action to
4047 * follow symlinks, but we do want to follow the
4048 * /lib/modules/`uname -r` dir, So resolve it ourselves
4049 * if it is a link... */
4050 if (realpath (tmdn, real_module_dir) == NULL)
4053 module_dir = real_module_dir;
4054 recursive_action(module_dir, TRUE, FALSE, FALSE,
4055 check_module_name_match, 0, m_fullName);
4059 /* Check if we have found anything yet */
4060 if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL))
4062 char module_dir[FILENAME_MAX];
4066 if (realpath (_PATH_MODULES, module_dir) == NULL)
4067 strcpy(module_dir, _PATH_MODULES);
4068 /* No module found under /lib/modules/`uname -r`, this
4069 * time cast the net a bit wider. Search /lib/modules/ */
4070 if (! recursive_action(module_dir, TRUE, FALSE, FALSE,
4071 check_module_name_match, 0, m_fullName))
4074 || ((fp = fopen(m_filename, "r")) == NULL))
4076 bb_error_msg("%s: no module by that name found", m_fullName);
4080 bb_error_msg_and_die("%s: no module by that name found", m_fullName);
4083 m_filename = xstrdup(argv[optind]);
4086 printf("Using %s\n", m_filename);
4088 #ifdef CONFIG_FEATURE_2_6_MODULES
4092 argv[optind + 1] = m_filename;
4093 return insmod_ng_main(argc - optind, argv + optind);
4097 if ((f = obj_load(fp, LOADBITS)) == NULL)
4098 bb_perror_msg_and_die("Could not load the module");
4100 if (get_modinfo_value(f, "kernel_version") == NULL)
4105 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
4106 /* Version correspondence? */
4108 if (uname(&uts_info) < 0)
4109 uts_info.release[0] = '\0';
4110 if (m_has_modinfo) {
4111 m_version = new_get_module_version(f, m_strversion);
4112 if (m_version == -1) {
4113 bb_error_msg("cannot find the kernel version the module was "
4119 if (strncmp(uts_info.release, m_strversion, STRVERSIONLEN) != 0) {
4120 if (flag_force_load) {
4121 bb_error_msg("Warning: kernel-module version mismatch\n"
4122 "\t%s was compiled for kernel version %s\n"
4123 "\twhile this kernel is version %s",
4124 m_filename, m_strversion, uts_info.release);
4126 bb_error_msg("kernel-module version mismatch\n"
4127 "\t%s was compiled for kernel version %s\n"
4128 "\twhile this kernel is version %s.",
4129 m_filename, m_strversion, uts_info.release);
4135 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
4137 if (!query_module(NULL, 0, NULL, 0, NULL)) {
4138 if (!new_get_kernel_symbols())
4140 k_crcs = new_is_kernel_checksummed();
4142 bb_error_msg("Not configured to support old kernels");
4146 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
4149 m_crcs = new_is_module_checksummed(f);
4151 if (m_crcs != k_crcs)
4152 obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
4153 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
4155 /* Let the module know about the kernel symbols. */
4156 add_kernel_symbols(f);
4158 /* Allocate common symbols, symbol tables, and string tables. */
4160 if (!new_create_this_module(f, m_name))
4165 if (!obj_check_undefineds(f)) {
4168 obj_allocate_commons(f);
4169 check_tainted_module(f, m_name);
4171 /* done with the module name, on to the optional var=value arguments */
4174 if (optind < argc) {
4175 if (!new_process_module_arguments(f, argc - optind, argv + optind))
4182 hide_special_symbols(f);
4184 #ifdef CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
4185 add_ksymoops_symbols(f, m_filename, m_name);
4186 #endif /* CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
4188 new_create_module_ksymtab(f);
4190 /* Find current size of the module */
4191 m_size = obj_load_size(f);
4194 m_addr = create_module(m_name, m_size);
4195 if (m_addr == -1) switch (errno) {
4197 bb_error_msg("A module named %s already exists", m_name);
4200 bb_error_msg("Can't allocate kernel memory for module; needed %lu bytes",
4204 bb_perror_msg("create_module: %s", m_name);
4210 * the PROGBITS section was not loaded by the obj_load
4211 * now we can load them directly into the kernel memory
4213 if (!obj_load_progbits(fp, f, (char*)m_addr)) {
4214 delete_module(m_name);
4219 if (!obj_relocate(f, m_addr)) {
4220 delete_module(m_name);
4224 if (!new_init_module(m_name, f, m_size))
4226 delete_module(m_name);
4230 if(flag_print_load_map)
4233 exit_status = EXIT_SUCCESS;
4236 #ifdef CONFIG_FEATURE_CLEAN_UP
4245 return(exit_status);
4252 #ifdef CONFIG_FEATURE_2_6_MODULES
4254 #include <sys/mman.h>
4255 #include <asm/unistd.h>
4256 #include <sys/syscall.h>
4258 /* We use error numbers in a loose translation... */
4259 static const char *moderror(int err)
4263 return "Invalid module format";
4265 return "Unknown symbol in module";
4267 return "Module has wrong symbol version";
4269 return "Invalid parameters";
4271 return strerror(err);
4275 int insmod_ng_main( int argc, char **argv)
4283 char *filename, *options = xstrdup("");
4291 /* Rest is options */
4292 for (i = 2; i < argc; i++) {
4293 options = xrealloc(options, strlen(options) + 2 + strlen(argv[i]) + 2);
4294 /* Spaces handled by "" pairs, but no way of escaping quotes */
4295 if (strchr(argv[i], ' ')) {
4296 strcat(options, "\"");
4297 strcat(options, argv[i]);
4298 strcat(options, "\"");
4300 strcat(options, argv[i]);
4302 strcat(options, " ");
4305 fd = xopen(filename, O_RDONLY);
4309 map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
4310 if (map == MAP_FAILED) {
4311 bb_perror_msg_and_die("cannot mmap `%s'", filename);
4314 ret = syscall(__NR_init_module, map, len, options);
4316 bb_perror_msg_and_die("cannot insert `%s': %s (%li)",
4317 filename, moderror(errno), ret);