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 static unsigned option_mask;
697 #define OPTION_STR "sLo:fkvqx" USE_FEATURE_INSMOD_LOAD_MAP("m")
699 OPT_s = 0x1, // -s /* log to syslog */
700 /* Not supported but kernel needs this for request_module(),
701 as this calls: modprobe -k -s -- <module>
702 so silently ignore this flag */
703 OPT_L = 0x2, // -L /* Stub warning */
704 /* Compatibility with modprobe.
705 In theory, this does locking, but we don't do
706 that. So be careful and plan your life around not
707 loading the same module 50 times concurrently. */
708 OPT_o = 0x4, // -o /* name the output module */
709 OPT_f = 0x8, // -f /* force loading */
710 OPT_k = 0x10, // -k /* module loaded by kerneld, auto-cleanable */
711 OPT_v = 0x20, // -v /* verbose output */
712 OPT_q = 0x40, // -q /* silent */
713 OPT_x = 0x80, // -x /* do not export externs */
714 OPT_m = 0x100, // -m /* print module load map */
716 #define flag_force_load (option_mask & OPT_f)
717 #define flag_autoclean (option_mask & OPT_k)
718 #define flag_verbose (option_mask & OPT_v)
719 #define flag_quiet (option_mask & OPT_q)
720 #define flag_noexport (option_mask & OPT_x)
721 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP
722 #define flag_print_load_map (option_mask & OPT_m)
724 #define flag_print_load_map 0
727 /*======================================================================*/
729 #if defined(CONFIG_USE_LIST)
731 struct arch_list_entry
733 struct arch_list_entry *next;
734 CONFIG_LIST_ARCHTYPE addend;
741 #if defined(CONFIG_USE_SINGLE)
743 struct arch_single_entry
752 #if defined(__mips__)
755 struct mips_hi16 *next;
762 struct obj_file root;
763 #if defined(CONFIG_USE_PLT_ENTRIES)
764 struct obj_section *plt;
766 #if defined(CONFIG_USE_GOT_ENTRIES)
767 struct obj_section *got;
769 #if defined(__mips__)
770 struct mips_hi16 *mips_hi16_list;
775 struct obj_symbol root;
776 #if defined(CONFIG_USE_PLT_ENTRIES)
777 #if defined(CONFIG_USE_PLT_LIST)
778 struct arch_list_entry *pltent;
780 struct arch_single_entry pltent;
783 #if defined(CONFIG_USE_GOT_ENTRIES)
784 struct arch_single_entry gotent;
789 struct external_module {
794 struct new_module_symbol *syms;
797 static struct new_module_symbol *ksyms;
798 static size_t nksyms;
800 static struct external_module *ext_modules;
801 static int n_ext_modules;
802 static int n_ext_modules_used;
803 extern int delete_module(const char *);
805 static char *m_filename;
806 static char *m_fullName;
810 /*======================================================================*/
813 static int check_module_name_match(const char *filename, struct stat *statbuf,
816 char *fullname = (char *) userdata;
818 if (fullname[0] == '\0')
821 char *tmp, *tmp1 = xstrdup(filename);
822 tmp = bb_get_last_path_component(tmp1);
823 if (strcmp(tmp, fullname) == 0) {
825 /* Stop searching if we find a match */
826 m_filename = xstrdup(filename);
835 /*======================================================================*/
837 static struct obj_file *arch_new_file(void)
840 f = xmalloc(sizeof(*f));
842 memset(f, 0, sizeof(*f));
847 static struct obj_section *arch_new_section(void)
849 return xmalloc(sizeof(struct obj_section));
852 static struct obj_symbol *arch_new_symbol(void)
854 struct arch_symbol *sym;
855 sym = xmalloc(sizeof(*sym));
857 memset(sym, 0, sizeof(*sym));
862 static enum obj_reloc
863 arch_apply_relocation(struct obj_file *f,
864 struct obj_section *targsec,
865 struct obj_section *symsec,
866 struct obj_symbol *sym,
867 ElfW(RelM) *rel, ElfW(Addr) v)
869 struct arch_file *ifile = (struct arch_file *) f;
870 enum obj_reloc ret = obj_reloc_ok;
871 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
872 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
873 #if defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES)
874 struct arch_symbol *isym = (struct arch_symbol *) sym;
876 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) || defined(__sh__) || defined(__s390__)
877 #if defined(CONFIG_USE_GOT_ENTRIES)
878 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
881 #if defined(CONFIG_USE_PLT_ENTRIES)
882 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
884 # if defined(CONFIG_USE_PLT_LIST)
885 struct arch_list_entry *pe;
887 struct arch_single_entry *pe;
891 switch (ELF_R_TYPE(rel->r_info)) {
906 /* relative reloc, always to _GLOBAL_OFFSET_TABLE_
907 * (which is .got) similar to branch,
908 * but is full 32 bits relative */
917 case R_ARM_GOTOFF: /* address relative to the got */
921 #elif defined(__cris__)
927 /* CRIS keeps the relocation value in the r_addend field and
928 * should not use whats in *loc at all
933 #elif defined(__H8300H__) || defined(__H8300S__)
936 loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1);
937 *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
948 if ((ElfW(Sword))v > 0x7fff ||
949 (ElfW(Sword))v < -(ElfW(Sword))0x8000)
950 ret = obj_reloc_overflow;
952 *(unsigned short *)loc = v;
956 if ((ElfW(Sword))v > 0x7f ||
957 (ElfW(Sword))v < -(ElfW(Sword))0x80)
958 ret = obj_reloc_overflow;
960 *(unsigned char *)loc = v;
963 #elif defined(__i386__)
997 #elif defined (__microblaze__)
998 case R_MICROBLAZE_NONE:
999 case R_MICROBLAZE_64_NONE:
1000 case R_MICROBLAZE_32_SYM_OP_SYM:
1001 case R_MICROBLAZE_32_PCREL:
1004 case R_MICROBLAZE_64_PCREL: {
1005 /* dot is the address of the current instruction.
1006 * v is the target symbol address.
1007 * So we need to extract the offset in the code,
1008 * adding v, then subtrating the current address
1009 * of this instruction.
1010 * Ex: "IMM 0xFFFE bralid 0x0000" = "bralid 0xFFFE0000"
1013 /* Get split offset stored in code */
1014 unsigned int temp = (loc[0] & 0xFFFF) << 16 |
1017 /* Adjust relative offset. -4 adjustment required
1018 * because dot points to the IMM insn, but branch
1019 * is computed relative to the branch instruction itself.
1021 temp += v - dot - 4;
1023 /* Store back into code */
1024 loc[0] = (loc[0] & 0xFFFF0000) | temp >> 16;
1025 loc[1] = (loc[1] & 0xFFFF0000) | (temp & 0xFFFF);
1030 case R_MICROBLAZE_32:
1034 case R_MICROBLAZE_64: {
1035 /* Get split pointer stored in code */
1036 unsigned int temp1 = (loc[0] & 0xFFFF) << 16 |
1039 /* Add reloc offset */
1042 /* Store back into code */
1043 loc[0] = (loc[0] & 0xFFFF0000) | temp1 >> 16;
1044 loc[1] = (loc[1] & 0xFFFF0000) | (temp1 & 0xFFFF);
1049 case R_MICROBLAZE_32_PCREL_LO:
1050 case R_MICROBLAZE_32_LO:
1051 case R_MICROBLAZE_SRO32:
1052 case R_MICROBLAZE_SRW32:
1053 ret = obj_reloc_unhandled;
1056 #elif defined(__mc68000__)
1067 ret = obj_reloc_overflow;
1074 ret = obj_reloc_overflow;
1081 if ((ElfW(Sword))v > 0x7f ||
1082 (ElfW(Sword))v < -(ElfW(Sword))0x80) {
1083 ret = obj_reloc_overflow;
1090 if ((ElfW(Sword))v > 0x7fff ||
1091 (ElfW(Sword))v < -(ElfW(Sword))0x8000) {
1092 ret = obj_reloc_overflow;
1098 *(int *)loc = v - dot;
1101 case R_68K_GLOB_DAT:
1102 case R_68K_JMP_SLOT:
1106 case R_68K_RELATIVE:
1107 *(int *)loc += f->baseaddr;
1113 # ifdef R_68K_GOTOFF
1119 #elif defined(__mips__)
1130 ret = obj_reloc_dangerous;
1131 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
1132 ret = obj_reloc_overflow;
1134 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
1140 struct mips_hi16 *n;
1142 /* We cannot relocate this one now because we don't know the value
1143 of the carry we need to add. Save the information, and let LO16
1144 do the actual relocation. */
1145 n = (struct mips_hi16 *) xmalloc(sizeof *n);
1148 n->next = ifile->mips_hi16_list;
1149 ifile->mips_hi16_list = n;
1155 unsigned long insnlo = *loc;
1156 ElfW(Addr) val, vallo;
1158 /* Sign extend the addend we extract from the lo insn. */
1159 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
1161 if (ifile->mips_hi16_list != NULL) {
1162 struct mips_hi16 *l;
1164 l = ifile->mips_hi16_list;
1166 struct mips_hi16 *next;
1169 /* Do the HI16 relocation. Note that we actually don't
1170 need to know anything about the LO16 itself, except where
1171 to find the low 16 bits of the addend needed by the LO16. */
1174 ((insn & 0xffff) << 16) +
1178 /* Account for the sign extension that will happen in the
1185 insn = (insn & ~0xffff) | val;
1193 ifile->mips_hi16_list = NULL;
1196 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
1198 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
1203 #elif defined(__nios2__)
1208 case R_NIOS2_BFD_RELOC_32:
1212 case R_NIOS2_BFD_RELOC_16:
1214 ret = obj_reloc_overflow;
1219 case R_NIOS2_BFD_RELOC_8:
1221 ret = obj_reloc_overflow;
1230 if ((Elf32_Sword)v > 0x7fff ||
1231 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1232 ret = obj_reloc_overflow;
1236 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1246 ret = obj_reloc_overflow;
1250 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1255 case R_NIOS2_PCREL16:
1260 if ((Elf32_Sword)v > 0x7fff ||
1261 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1262 ret = obj_reloc_overflow;
1266 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1272 Elf32_Addr word, gp;
1274 gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp"));
1276 if ((Elf32_Sword)v > 0x7fff ||
1277 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1278 ret = obj_reloc_overflow;
1282 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1286 case R_NIOS2_CALL26:
1288 ret = obj_reloc_dangerous;
1289 if ((v >> 28) != (dot >> 28))
1290 ret = obj_reloc_overflow;
1291 *loc = (*loc & 0x3f) | ((v >> 2) << 6);
1299 ret = obj_reloc_overflow;
1302 word = *loc & ~0x7c0;
1303 *loc = word | ((v & 0x1f) << 6);
1312 ret = obj_reloc_overflow;
1315 word = *loc & ~0xfc0;
1316 *loc = word | ((v & 0x3f) << 6);
1325 ret = obj_reloc_overflow;
1328 word = *loc & ~0x3fc0;
1329 *loc = word | ((v & 0xff) << 6);
1338 *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) |
1348 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1353 case R_NIOS2_HIADJ16:
1355 Elf32_Addr word1, word2;
1358 word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
1359 *loc = ((((word1 >> 22) << 16) | word2) << 6) |
1364 #elif defined(__powerpc64__)
1365 /* PPC64 needs a 2.6 kernel, 2.4 module relocation irrelevant */
1367 #elif defined(__powerpc__)
1369 case R_PPC_ADDR16_HA:
1370 *(unsigned short *)loc = (v + 0x8000) >> 16;
1373 case R_PPC_ADDR16_HI:
1374 *(unsigned short *)loc = v >> 16;
1377 case R_PPC_ADDR16_LO:
1378 *(unsigned short *)loc = v;
1392 #elif defined(__s390__)
1395 *(unsigned int *) loc += v;
1398 *(unsigned short *) loc += v;
1401 *(unsigned char *) loc += v;
1405 *(unsigned int *) loc += v - dot;
1408 *(unsigned short *) loc += (v - dot) >> 1;
1411 *(unsigned short *) loc += v - dot;
1415 case R_390_PLT16DBL:
1416 /* find the plt entry and initialize it. */
1417 pe = (struct arch_single_entry *) &isym->pltent;
1418 if (pe->inited == 0) {
1419 ip = (unsigned long *)(ifile->plt->contents + pe->offset);
1420 ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */
1422 if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1429 /* Insert relative distance to target. */
1430 v = plt + pe->offset - dot;
1431 if (ELF_R_TYPE(rel->r_info) == R_390_PLT32)
1432 *(unsigned int *) loc = (unsigned int) v;
1433 else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1434 *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1);
1437 case R_390_GLOB_DAT:
1438 case R_390_JMP_SLOT:
1442 case R_390_RELATIVE:
1443 *loc += f->baseaddr;
1447 *(unsigned long *) loc += got - dot;
1453 if (!isym->gotent.inited)
1455 isym->gotent.inited = 1;
1456 *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v;
1458 if (ELF_R_TYPE(rel->r_info) == R_390_GOT12)
1459 *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff;
1460 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16)
1461 *(unsigned short *) loc += isym->gotent.offset;
1462 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32)
1463 *(unsigned int *) loc += isym->gotent.offset;
1466 # ifndef R_390_GOTOFF32
1467 # define R_390_GOTOFF32 R_390_GOTOFF
1469 case R_390_GOTOFF32:
1473 #elif defined(__sh__)
1496 *loc = f->baseaddr + rel->r_addend;
1500 *loc = got - dot + rel->r_addend;
1510 # if defined(__SH5__)
1511 case R_SH_IMM_MEDLOW16:
1512 case R_SH_IMM_LOW16:
1516 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16)
1520 * movi and shori have the format:
1522 * | op | imm | reg | reserved |
1523 * 31..26 25..10 9.. 4 3 .. 0
1525 * so we simply mask and or in imm.
1527 word = *loc & ~0x3fffc00;
1528 word |= (v & 0xffff) << 10;
1535 case R_SH_IMM_MEDLOW16_PCREL:
1536 case R_SH_IMM_LOW16_PCREL:
1540 word = *loc & ~0x3fffc00;
1544 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16_PCREL)
1547 word |= (v & 0xffff) << 10;
1553 # endif /* __SH5__ */
1555 #elif defined (__v850e__)
1561 /* We write two shorts instead of a long because even
1562 32-bit insns only need half-word alignment, but
1563 32-bit data needs to be long-word aligned. */
1564 v += ((unsigned short *)loc)[0];
1565 v += ((unsigned short *)loc)[1] << 16;
1566 ((unsigned short *)loc)[0] = v & 0xffff;
1567 ((unsigned short *)loc)[1] = (v >> 16) & 0xffff;
1570 case R_V850_22_PCREL:
1573 #elif defined(__x86_64__)
1583 *(unsigned int *) loc += v;
1586 ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */
1587 /* error("Possibly is module compiled without -mcmodel=kernel!"); */
1592 *(signed int *) loc += v;
1596 *(unsigned short *) loc += v;
1600 *(unsigned char *) loc += v;
1604 *(unsigned int *) loc += v - dot;
1608 *(unsigned short *) loc += v - dot;
1612 *(unsigned char *) loc += v - dot;
1615 case R_X86_64_GLOB_DAT:
1616 case R_X86_64_JUMP_SLOT:
1620 case R_X86_64_RELATIVE:
1621 *loc += f->baseaddr;
1624 case R_X86_64_GOT32:
1625 case R_X86_64_GOTPCREL:
1628 if (!isym->gotent.reloc_done)
1630 isym->gotent.reloc_done = 1;
1631 *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
1633 /* XXX are these really correct? */
1634 if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL)
1635 *(unsigned int *) loc += v + isym->gotent.offset;
1637 *loc += isym->gotent.offset;
1642 # warning "no idea how to handle relocations on your arch"
1646 printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info));
1647 ret = obj_reloc_unhandled;
1650 #if defined(CONFIG_USE_PLT_ENTRIES)
1654 /* find the plt entry and initialize it if necessary */
1656 #if defined(CONFIG_USE_PLT_LIST)
1657 for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend;)
1664 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1666 /* generate some machine code */
1668 #if defined(__arm__)
1669 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1670 ip[1] = v; /* sym@ */
1672 #if defined(__powerpc__)
1673 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1674 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1675 ip[2] = 0x7d6903a6; /* mtctr r11 */
1676 ip[3] = 0x4e800420; /* bctr */
1678 #if defined (__v850e__)
1679 /* We have to trash a register, so we assume that any control
1680 transfer more than 21-bits away must be a function call
1681 (so we can use a call-clobbered register). */
1682 ip[0] = 0x0621 + ((v & 0xffff) << 16); /* mov sym, r1 ... */
1683 ip[1] = ((v >> 16) & 0xffff) + 0x610000; /* ...; jmp r1 */
1688 /* relative distance to target */
1690 /* if the target is too far away.... */
1691 #if defined (__arm__) || defined (__powerpc__)
1692 if ((int)v < -0x02000000 || (int)v >= 0x02000000)
1693 #elif defined (__v850e__)
1694 if ((ElfW(Sword))v > 0x1fffff || (ElfW(Sword))v < (ElfW(Sword))-0x200000)
1696 /* go via the plt */
1697 v = plt + pe->offset - dot;
1699 #if defined (__v850e__)
1704 ret = obj_reloc_dangerous;
1706 /* merge the offset into the instruction. */
1707 #if defined(__arm__)
1708 /* Convert to words. */
1711 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1713 #if defined(__powerpc__)
1714 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1716 #if defined (__v850e__)
1717 /* We write two shorts instead of a long because even 32-bit insns
1718 only need half-word alignment, but the 32-bit data write needs
1719 to be long-word aligned. */
1720 ((unsigned short *)loc)[0] =
1721 (*(unsigned short *)loc & 0xffc0) /* opcode + reg */
1722 | ((v >> 16) & 0x3f); /* offs high part */
1723 ((unsigned short *)loc)[1] =
1724 (v & 0xffff); /* offs low part */
1727 #endif /* CONFIG_USE_PLT_ENTRIES */
1729 #if defined(CONFIG_USE_GOT_ENTRIES)
1732 /* needs an entry in the .got: set it, once */
1733 if (!isym->gotent.inited) {
1734 isym->gotent.inited = 1;
1735 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1737 /* make the reloc with_respect_to_.got */
1739 *loc += isym->gotent.offset + rel->r_addend;
1740 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1741 *loc += isym->gotent.offset;
1745 #endif /* CONFIG_USE_GOT_ENTRIES */
1752 #if defined(CONFIG_USE_LIST)
1754 static int arch_list_add(ElfW(RelM) *rel, struct arch_list_entry **list,
1755 int offset, int size)
1757 struct arch_list_entry *pe;
1759 for (pe = *list; pe != NULL; pe = pe->next) {
1760 if (pe->addend == rel->r_addend) {
1766 pe = xmalloc(sizeof(struct arch_list_entry));
1768 pe->addend = rel->r_addend;
1769 pe->offset = offset;
1779 #if defined(CONFIG_USE_SINGLE)
1781 static int arch_single_init(ElfW(RelM) *rel, struct arch_single_entry *single,
1782 int offset, int size)
1784 if (single->allocated == 0) {
1785 single->allocated = 1;
1786 single->offset = offset;
1795 #if defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES)
1797 static struct obj_section *arch_xsect_init(struct obj_file *f, char *name,
1798 int offset, int size)
1800 struct obj_section *myrelsec = obj_find_section(f, name);
1807 obj_extend_section(myrelsec, offset);
1809 myrelsec = obj_create_alloced_section(f, name,
1818 static void arch_create_got(struct obj_file *f)
1820 #if defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES)
1821 struct arch_file *ifile = (struct arch_file *) f;
1823 #if defined(CONFIG_USE_GOT_ENTRIES)
1824 int got_offset = 0, got_needed = 0, got_allocate;
1826 #if defined(CONFIG_USE_PLT_ENTRIES)
1827 int plt_offset = 0, plt_needed = 0, plt_allocate;
1829 struct obj_section *relsec, *symsec, *strsec;
1830 ElfW(RelM) *rel, *relend;
1831 ElfW(Sym) *symtab, *extsym;
1832 const char *strtab, *name;
1833 struct arch_symbol *intsym;
1835 for (i = 0; i < f->header.e_shnum; ++i) {
1836 relsec = f->sections[i];
1837 if (relsec->header.sh_type != SHT_RELM)
1840 symsec = f->sections[relsec->header.sh_link];
1841 strsec = f->sections[symsec->header.sh_link];
1843 rel = (ElfW(RelM) *) relsec->contents;
1844 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1845 symtab = (ElfW(Sym) *) symsec->contents;
1846 strtab = (const char *) strsec->contents;
1848 for (; rel < relend; ++rel) {
1849 extsym = &symtab[ELF_R_SYM(rel->r_info)];
1851 #if defined(CONFIG_USE_GOT_ENTRIES)
1854 #if defined(CONFIG_USE_PLT_ENTRIES)
1858 switch (ELF_R_TYPE(rel->r_info)) {
1859 #if defined(__arm__)
1874 #elif defined(__i386__)
1884 #elif defined(__powerpc__)
1889 #elif defined(__mc68000__)
1900 #elif defined(__sh__)
1910 #elif defined (__v850e__)
1911 case R_V850_22_PCREL:
1920 if (extsym->st_name != 0) {
1921 name = strtab + extsym->st_name;
1923 name = f->sections[extsym->st_shndx]->name;
1925 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1926 #if defined(CONFIG_USE_GOT_ENTRIES)
1928 got_offset += arch_single_init(
1929 rel, &intsym->gotent,
1930 got_offset, CONFIG_GOT_ENTRY_SIZE);
1935 #if defined(CONFIG_USE_PLT_ENTRIES)
1937 #if defined(CONFIG_USE_PLT_LIST)
1938 plt_offset += arch_list_add(
1939 rel, &intsym->pltent,
1940 plt_offset, CONFIG_PLT_ENTRY_SIZE);
1942 plt_offset += arch_single_init(
1943 rel, &intsym->pltent,
1944 plt_offset, CONFIG_PLT_ENTRY_SIZE);
1952 #if defined(CONFIG_USE_GOT_ENTRIES)
1954 ifile->got = arch_xsect_init(f, ".got", got_offset,
1955 CONFIG_GOT_ENTRY_SIZE);
1959 #if defined(CONFIG_USE_PLT_ENTRIES)
1961 ifile->plt = arch_xsect_init(f, ".plt", plt_offset,
1962 CONFIG_PLT_ENTRY_SIZE);
1966 #endif /* defined(CONFIG_USE_GOT_ENTRIES) || defined(CONFIG_USE_PLT_ENTRIES) */
1969 /*======================================================================*/
1971 /* Standard ELF hash function. */
1972 static unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1974 unsigned long h = 0;
1981 if ((g = (h & 0xf0000000)) != 0) {
1990 static unsigned long obj_elf_hash(const char *name)
1992 return obj_elf_hash_n(name, strlen(name));
1995 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
1996 /* String comparison for non-co-versioned kernel and module. */
1998 static int ncv_strcmp(const char *a, const char *b)
2000 size_t alen = strlen(a), blen = strlen(b);
2002 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
2003 return strncmp(a, b, alen);
2004 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
2005 return strncmp(a, b, blen);
2007 return strcmp(a, b);
2010 /* String hashing for non-co-versioned kernel and module. Here
2011 we are simply forced to drop the crc from the hash. */
2013 static unsigned long ncv_symbol_hash(const char *str)
2015 size_t len = strlen(str);
2016 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
2018 return obj_elf_hash_n(str, len);
2022 obj_set_symbol_compare(struct obj_file *f,
2023 int (*cmp) (const char *, const char *),
2024 unsigned long (*hash) (const char *))
2027 f->symbol_cmp = cmp;
2029 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
2032 f->symbol_hash = hash;
2034 memcpy(tmptab, f->symtab, sizeof(tmptab));
2035 memset(f->symtab, 0, sizeof(f->symtab));
2037 for (i = 0; i < HASH_BUCKETS; ++i)
2038 for (sym = tmptab[i]; sym; sym = next) {
2039 unsigned long h = hash(sym->name) % HASH_BUCKETS;
2041 sym->next = f->symtab[h];
2047 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
2049 static struct obj_symbol *
2050 obj_add_symbol(struct obj_file *f, const char *name,
2051 unsigned long symidx, int info,
2052 int secidx, ElfW(Addr) value,
2055 struct obj_symbol *sym;
2056 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2057 int n_type = ELF_ST_TYPE(info);
2058 int n_binding = ELF_ST_BIND(info);
2060 for (sym = f->symtab[hash]; sym; sym = sym->next)
2061 if (f->symbol_cmp(sym->name, name) == 0) {
2062 int o_secidx = sym->secidx;
2063 int o_info = sym->info;
2064 int o_type = ELF_ST_TYPE(o_info);
2065 int o_binding = ELF_ST_BIND(o_info);
2067 /* A redefinition! Is it legal? */
2069 if (secidx == SHN_UNDEF)
2071 else if (o_secidx == SHN_UNDEF)
2073 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
2074 /* Cope with local and global symbols of the same name
2075 in the same object file, as might have been created
2076 by ld -r. The only reason locals are now seen at this
2077 level at all is so that we can do semi-sensible things
2080 struct obj_symbol *nsym, **p;
2082 nsym = arch_new_symbol();
2083 nsym->next = sym->next;
2086 /* Excise the old (local) symbol from the hash chain. */
2087 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
2091 } else if (n_binding == STB_LOCAL) {
2092 /* Another symbol of the same name has already been defined.
2093 Just add this to the local table. */
2094 sym = arch_new_symbol();
2097 f->local_symtab[symidx] = sym;
2099 } else if (n_binding == STB_WEAK)
2101 else if (o_binding == STB_WEAK)
2103 /* Don't unify COMMON symbols with object types the programmer
2105 else if (secidx == SHN_COMMON
2106 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
2108 else if (o_secidx == SHN_COMMON
2109 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
2112 /* Don't report an error if the symbol is coming from
2113 the kernel or some external module. */
2114 if (secidx <= SHN_HIRESERVE)
2115 bb_error_msg("%s multiply defined", name);
2120 /* Completely new symbol. */
2121 sym = arch_new_symbol();
2122 sym->next = f->symtab[hash];
2123 f->symtab[hash] = sym;
2126 if (ELF_ST_BIND(info) == STB_LOCAL && symidx != -1) {
2127 if (symidx >= f->local_symtab_size)
2128 bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
2129 name, (long) symidx, (long) f->local_symtab_size);
2131 f->local_symtab[symidx] = sym;
2138 sym->secidx = secidx;
2144 static struct obj_symbol *
2145 obj_find_symbol(struct obj_file *f, const char *name)
2147 struct obj_symbol *sym;
2148 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2150 for (sym = f->symtab[hash]; sym; sym = sym->next)
2151 if (f->symbol_cmp(sym->name, name) == 0)
2158 obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2161 if (sym->secidx >= SHN_LORESERVE)
2164 return sym->value + f->sections[sym->secidx]->header.sh_addr;
2166 /* As a special case, a NULL sym has value zero. */
2171 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
2173 int i, n = f->header.e_shnum;
2175 for (i = 0; i < n; ++i)
2176 if (strcmp(f->sections[i]->name, name) == 0)
2177 return f->sections[i];
2182 static int obj_load_order_prio(struct obj_section *a)
2184 unsigned long af, ac;
2186 af = a->header.sh_flags;
2189 if (a->name[0] != '.' || strlen(a->name) != 10 ||
2190 strcmp(a->name + 5, ".init"))
2194 if (!(af & SHF_WRITE))
2196 if (af & SHF_EXECINSTR)
2198 if (a->header.sh_type != SHT_NOBITS)
2205 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
2207 struct obj_section **p;
2208 int prio = obj_load_order_prio(sec);
2209 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
2210 if (obj_load_order_prio(*p) < prio)
2212 sec->load_next = *p;
2216 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2218 unsigned long align,
2221 int newidx = f->header.e_shnum++;
2222 struct obj_section *sec;
2224 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2225 f->sections[newidx] = sec = arch_new_section();
2227 memset(sec, 0, sizeof(*sec));
2228 sec->header.sh_type = SHT_PROGBITS;
2229 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2230 sec->header.sh_size = size;
2231 sec->header.sh_addralign = align;
2235 sec->contents = xmalloc(size);
2237 obj_insert_section_load_order(f, sec);
2242 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
2244 unsigned long align,
2247 int newidx = f->header.e_shnum++;
2248 struct obj_section *sec;
2250 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2251 f->sections[newidx] = sec = arch_new_section();
2253 memset(sec, 0, sizeof(*sec));
2254 sec->header.sh_type = SHT_PROGBITS;
2255 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2256 sec->header.sh_size = size;
2257 sec->header.sh_addralign = align;
2261 sec->contents = xmalloc(size);
2263 sec->load_next = f->load_order;
2264 f->load_order = sec;
2265 if (f->load_order_search_start == &f->load_order)
2266 f->load_order_search_start = &sec->load_next;
2271 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
2273 unsigned long oldsize = sec->header.sh_size;
2275 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
2277 return sec->contents + oldsize;
2281 /* Conditionally add the symbols from the given symbol set to the
2285 add_symbols_from( struct obj_file *f,
2286 int idx, struct new_module_symbol *syms, size_t nsyms)
2288 struct new_module_symbol *s;
2291 #ifdef SYMBOL_PREFIX
2293 size_t name_alloced_size = 0;
2295 #ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
2298 gpl = obj_gpl_license(f, NULL) == 0;
2300 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
2301 /* Only add symbols that are already marked external.
2302 If we override locals we may cause problems for
2303 argument initialization. We will also create a false
2304 dependency on the module. */
2305 struct obj_symbol *sym;
2308 /* GPL licensed modules can use symbols exported with
2309 * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the
2310 * exported names. Non-GPL modules never see any GPLONLY_
2311 * symbols so they cannot fudge it by adding the prefix on
2314 if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) {
2315 #ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
2322 name = (char *)s->name;
2324 #ifdef SYMBOL_PREFIX
2325 /* Prepend SYMBOL_PREFIX to the symbol's name (the
2326 kernel exports `C names', but module object files
2327 reference `linker names'). */
2328 size_t extra = sizeof SYMBOL_PREFIX;
2329 size_t name_size = strlen (name) + extra;
2330 if (name_size > name_alloced_size) {
2331 name_alloced_size = name_size * 2;
2332 name_buf = alloca (name_alloced_size);
2334 strcpy (name_buf, SYMBOL_PREFIX);
2335 strcpy (name_buf + extra - 1, name);
2337 #endif /* SYMBOL_PREFIX */
2339 sym = obj_find_symbol(f, name);
2340 if (sym && !(ELF_ST_BIND(sym->info) == STB_LOCAL)) {
2341 #ifdef SYMBOL_PREFIX
2342 /* Put NAME_BUF into more permanent storage. */
2343 name = xmalloc (name_size);
2344 strcpy (name, name_buf);
2346 sym = obj_add_symbol(f, name, -1,
2347 ELF_ST_INFO(STB_GLOBAL,
2350 /* Did our symbol just get installed? If so, mark the
2351 module as "used". */
2352 if (sym->secidx == idx)
2360 static void add_kernel_symbols(struct obj_file *f)
2362 struct external_module *m;
2365 /* Add module symbols first. */
2367 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m)
2369 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms,
2370 m->nsyms)) m->used = 1, ++nused;
2372 n_ext_modules_used = nused;
2374 /* And finally the symbols from the kernel proper. */
2377 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
2380 static char *get_modinfo_value(struct obj_file *f, const char *key)
2382 struct obj_section *sec;
2383 char *p, *v, *n, *ep;
2384 size_t klen = strlen(key);
2386 sec = obj_find_section(f, ".modinfo");
2390 ep = p + sec->header.sh_size;
2393 n = strchr(p, '\0');
2395 if (p + klen == v && strncmp(p, key, klen) == 0)
2398 if (p + klen == n && strcmp(p, key) == 0)
2408 /*======================================================================*/
2409 /* Functions relating to module loading after 2.1.18. */
2412 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2415 char *p, *q, *key, *sym_name;
2416 struct obj_symbol *sym;
2417 char *contents, *loc;
2421 if ((q = strchr(p, '=')) == NULL) {
2426 key = alloca(q - p + 6);
2427 memcpy(key, "parm_", 5);
2428 memcpy(key + 5, p, q - p);
2431 p = get_modinfo_value(f, key);
2434 bb_error_msg("invalid parameter %s", key);
2438 #ifdef SYMBOL_PREFIX
2439 sym_name = alloca (strlen (key) + sizeof SYMBOL_PREFIX);
2440 strcpy (sym_name, SYMBOL_PREFIX);
2441 strcat (sym_name, key);
2445 sym = obj_find_symbol(f, sym_name);
2447 /* Also check that the parameter was not resolved from the kernel. */
2448 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2449 bb_error_msg("symbol for parameter %s not found", key);
2454 min = strtoul(p, &p, 10);
2456 max = strtoul(p + 1, &p, 10);
2462 contents = f->sections[sym->secidx]->contents;
2463 loc = contents + sym->value;
2467 if ((*p == 's') || (*p == 'c')) {
2470 /* Do C quoting if we begin with a ", else slurp the lot. */
2474 str = alloca(strlen(q));
2475 for (r = str, q++; *q != '"'; ++q, ++r) {
2477 bb_error_msg("improperly terminated string argument for %s",
2480 } else if (*q == '\\')
2514 if (q[1] >= '0' && q[1] <= '7') {
2515 c = (c * 8) + *++q - '0';
2516 if (q[1] >= '0' && q[1] <= '7')
2517 c = (c * 8) + *++q - '0';
2534 /* In this case, the string is not quoted. We will break
2535 it using the coma (like for ints). If the user wants to
2536 include comas in a string, he just has to quote it */
2538 /* Search the next coma */
2542 if (r != (char *) NULL) {
2543 /* Recopy the current field */
2544 str = alloca(r - q + 1);
2545 memcpy(str, q, r - q);
2547 /* I don't know if it is useful, as the previous case
2548 doesn't nul terminate the string ??? */
2551 /* Keep next fields */
2562 obj_string_patch(f, sym->secidx, loc - contents, str);
2563 loc += tgt_sizeof_char_p;
2565 /* Array of chars (in fact, matrix !) */
2566 unsigned long charssize; /* size of each member */
2568 /* Get the size of each member */
2569 /* Probably we should do that outside the loop ? */
2570 if (!isdigit(*(p + 1))) {
2571 bb_error_msg("parameter type 'c' for %s must be followed by"
2572 " the maximum size", key);
2575 charssize = strtoul(p + 1, (char **) NULL, 10);
2578 if (strlen(str) >= charssize) {
2579 bb_error_msg("string too long for %s (max %ld)", key,
2584 /* Copy to location */
2585 strcpy((char *) loc, str);
2589 long v = strtoul(q, &q, 0);
2596 loc += tgt_sizeof_short;
2600 loc += tgt_sizeof_int;
2604 loc += tgt_sizeof_long;
2608 bb_error_msg("unknown parameter type '%c' for %s", *p, key);
2623 goto retry_end_of_value;
2627 bb_error_msg("too many values for %s (max %d)", key, max);
2634 bb_error_msg("invalid argument syntax for %s", key);
2641 bb_error_msg("too few values for %s (min %d)", key, min);
2651 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
2652 static int new_is_module_checksummed(struct obj_file *f)
2654 const char *p = get_modinfo_value(f, "using_checksums");
2661 /* Get the module's kernel version in the canonical integer form. */
2664 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2669 p = get_modinfo_value(f, "kernel_version");
2672 safe_strncpy(str, p, STRVERSIONLEN);
2674 a = strtoul(p, &p, 10);
2677 b = strtoul(p + 1, &p, 10);
2680 c = strtoul(p + 1, &q, 10);
2684 return a << 16 | b << 8 | c;
2687 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
2690 /* Fetch the loaded modules, and all currently exported symbols. */
2692 static int new_get_kernel_symbols(void)
2694 char *module_names, *mn;
2695 struct external_module *modules, *m;
2696 struct new_module_symbol *syms, *s;
2697 size_t ret, bufsize, nmod, nsyms, i, j;
2699 /* Collect the loaded modules. */
2701 module_names = xmalloc(bufsize = 256);
2703 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2704 if (errno == ENOSPC && bufsize < ret) {
2705 module_names = xrealloc(module_names, bufsize = ret);
2706 goto retry_modules_load;
2708 bb_perror_msg("QM_MODULES");
2712 n_ext_modules = nmod = ret;
2714 /* Collect the modules' symbols. */
2717 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2718 memset(modules, 0, nmod * sizeof(*modules));
2719 for (i = 0, mn = module_names, m = modules;
2720 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2721 struct new_module_info info;
2723 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2724 if (errno == ENOENT) {
2725 /* The module was removed out from underneath us. */
2728 bb_perror_msg("query_module: QM_INFO: %s", mn);
2732 syms = xmalloc(bufsize = 1024);
2734 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2737 syms = xrealloc(syms, bufsize = ret);
2738 goto retry_mod_sym_load;
2740 /* The module was removed out from underneath us. */
2743 bb_perror_msg("query_module: QM_SYMBOLS: %s", mn);
2750 m->addr = info.addr;
2754 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2755 s->name += (unsigned long) syms;
2760 /* Collect the kernel's symbols. */
2762 syms = xmalloc(bufsize = 16 * 1024);
2763 retry_kern_sym_load:
2764 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2765 if (errno == ENOSPC && bufsize < ret) {
2766 syms = xrealloc(syms, bufsize = ret);
2767 goto retry_kern_sym_load;
2769 bb_perror_msg("kernel: QM_SYMBOLS");
2772 nksyms = nsyms = ret;
2775 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2776 s->name += (unsigned long) syms;
2782 /* Return the kernel symbol checksum version, or zero if not used. */
2784 static int new_is_kernel_checksummed(void)
2786 struct new_module_symbol *s;
2789 /* Using_Versions is not the first symbol, but it should be in there. */
2791 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2792 if (strcmp((char *) s->name, "Using_Versions") == 0)
2799 static int new_create_this_module(struct obj_file *f, const char *m_name)
2801 struct obj_section *sec;
2803 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2804 sizeof(struct new_module));
2805 memset(sec->contents, 0, sizeof(struct new_module));
2807 obj_add_symbol(f, SPFX "__this_module", -1,
2808 ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0,
2809 sizeof(struct new_module));
2811 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2817 #ifdef CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
2818 /* add an entry to the __ksymtab section, creating it if necessary */
2819 static void new_add_ksymtab(struct obj_file *f, struct obj_symbol *sym)
2821 struct obj_section *sec;
2824 /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section.
2825 * If __ksymtab is defined but not marked alloc, x out the first character
2826 * (no obj_delete routine) and create a new __ksymtab with the correct
2829 sec = obj_find_section(f, "__ksymtab");
2830 if (sec && !(sec->header.sh_flags & SHF_ALLOC)) {
2831 *((char *)(sec->name)) = 'x'; /* override const */
2835 sec = obj_create_alloced_section(f, "__ksymtab",
2836 tgt_sizeof_void_p, 0);
2839 sec->header.sh_flags |= SHF_ALLOC;
2840 sec->header.sh_addralign = tgt_sizeof_void_p; /* Empty section might
2842 ofs = sec->header.sh_size;
2843 obj_symbol_patch(f, sec->idx, ofs, sym);
2844 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name);
2845 obj_extend_section(sec, 2 * tgt_sizeof_char_p);
2847 #endif /* CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
2849 static int new_create_module_ksymtab(struct obj_file *f)
2851 struct obj_section *sec;
2854 /* We must always add the module references. */
2856 if (n_ext_modules_used) {
2857 struct new_module_ref *dep;
2858 struct obj_symbol *tm;
2860 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2861 (sizeof(struct new_module_ref)
2862 * n_ext_modules_used));
2866 tm = obj_find_symbol(f, SPFX "__this_module");
2867 dep = (struct new_module_ref *) sec->contents;
2868 for (i = 0; i < n_ext_modules; ++i)
2869 if (ext_modules[i].used) {
2870 dep->dep = ext_modules[i].addr;
2871 obj_symbol_patch(f, sec->idx,
2872 (char *) &dep->ref - sec->contents, tm);
2878 if (!flag_noexport && !obj_find_section(f, "__ksymtab")) {
2883 obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p,
2886 /* We don't want to export symbols residing in sections that
2887 aren't loaded. There are a number of these created so that
2888 we make sure certain module options don't appear twice. */
2890 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2892 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2894 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2895 struct obj_symbol *sym;
2896 for (sym = f->symtab[i]; sym; sym = sym->next)
2897 if (ELF_ST_BIND(sym->info) != STB_LOCAL
2898 && sym->secidx <= SHN_HIRESERVE
2899 && (sym->secidx >= SHN_LORESERVE
2900 || loaded[sym->secidx])) {
2901 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2903 obj_symbol_patch(f, sec->idx, ofs, sym);
2904 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2911 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2919 new_init_module(const char *m_name, struct obj_file *f, unsigned long m_size)
2921 struct new_module *module;
2922 struct obj_section *sec;
2927 sec = obj_find_section(f, ".this");
2928 if (!sec || !sec->contents) {
2929 bb_perror_msg_and_die("corrupt module %s?",m_name);
2931 module = (struct new_module *) sec->contents;
2932 m_addr = sec->header.sh_addr;
2934 module->size_of_struct = sizeof(*module);
2935 module->size = m_size;
2936 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2938 sec = obj_find_section(f, "__ksymtab");
2939 if (sec && sec->header.sh_size) {
2940 module->syms = sec->header.sh_addr;
2941 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2944 if (n_ext_modules_used) {
2945 sec = obj_find_section(f, ".kmodtab");
2946 module->deps = sec->header.sh_addr;
2947 module->ndeps = n_ext_modules_used;
2951 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "init_module"));
2953 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "cleanup_module"));
2955 sec = obj_find_section(f, "__ex_table");
2957 module->ex_table_start = sec->header.sh_addr;
2958 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2961 sec = obj_find_section(f, ".text.init");
2963 module->runsize = sec->header.sh_addr - m_addr;
2965 sec = obj_find_section(f, ".data.init");
2967 if (!module->runsize ||
2968 module->runsize > sec->header.sh_addr - m_addr)
2969 module->runsize = sec->header.sh_addr - m_addr;
2971 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2972 if (sec && sec->header.sh_size) {
2973 module->archdata_start = (void*)sec->header.sh_addr;
2974 module->archdata_end = module->archdata_start + sec->header.sh_size;
2976 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2977 if (sec && sec->header.sh_size) {
2978 module->kallsyms_start = (void*)sec->header.sh_addr;
2979 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2982 /* Whew! All of the initialization is complete. Collect the final
2983 module image and give it to the kernel. */
2985 image = xmalloc(m_size);
2986 obj_create_image(f, image);
2988 ret = init_module(m_name, (struct new_module *) image);
2990 bb_perror_msg("init_module: %s", m_name);
2998 /*======================================================================*/
3001 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
3004 struct obj_string_patch *p;
3005 struct obj_section *strsec;
3006 size_t len = strlen(string) + 1;
3009 p = xmalloc(sizeof(*p));
3010 p->next = f->string_patches;
3011 p->reloc_secidx = secidx;
3012 p->reloc_offset = offset;
3013 f->string_patches = p;
3015 strsec = obj_find_section(f, ".kstrtab");
3016 if (strsec == NULL) {
3017 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
3018 p->string_offset = 0;
3019 loc = strsec->contents;
3021 p->string_offset = strsec->header.sh_size;
3022 loc = obj_extend_section(strsec, len);
3024 memcpy(loc, string, len);
3030 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
3031 struct obj_symbol *sym)
3033 struct obj_symbol_patch *p;
3035 p = xmalloc(sizeof(*p));
3036 p->next = f->symbol_patches;
3037 p->reloc_secidx = secidx;
3038 p->reloc_offset = offset;
3040 f->symbol_patches = p;
3045 static int obj_check_undefineds(struct obj_file *f)
3050 for (i = 0; i < HASH_BUCKETS; ++i) {
3051 struct obj_symbol *sym;
3052 for (sym = f->symtab[i]; sym; sym = sym->next)
3053 if (sym->secidx == SHN_UNDEF) {
3054 if (ELF_ST_BIND(sym->info) == STB_WEAK) {
3055 sym->secidx = SHN_ABS;
3059 bb_error_msg("unresolved symbol %s", sym->name);
3069 static void obj_allocate_commons(struct obj_file *f)
3071 struct common_entry {
3072 struct common_entry *next;
3073 struct obj_symbol *sym;
3074 } *common_head = NULL;
3078 for (i = 0; i < HASH_BUCKETS; ++i) {
3079 struct obj_symbol *sym;
3080 for (sym = f->symtab[i]; sym; sym = sym->next)
3081 if (sym->secidx == SHN_COMMON) {
3082 /* Collect all COMMON symbols and sort them by size so as to
3083 minimize space wasted by alignment requirements. */
3085 struct common_entry **p, *n;
3086 for (p = &common_head; *p; p = &(*p)->next)
3087 if (sym->size <= (*p)->sym->size)
3090 n = alloca(sizeof(*n));
3098 for (i = 1; i < f->local_symtab_size; ++i) {
3099 struct obj_symbol *sym = f->local_symtab[i];
3100 if (sym && sym->secidx == SHN_COMMON) {
3101 struct common_entry **p, *n;
3102 for (p = &common_head; *p; p = &(*p)->next)
3103 if (sym == (*p)->sym)
3105 else if (sym->size < (*p)->sym->size) {
3106 n = alloca(sizeof(*n));
3116 /* Find the bss section. */
3117 for (i = 0; i < f->header.e_shnum; ++i)
3118 if (f->sections[i]->header.sh_type == SHT_NOBITS)
3121 /* If for some reason there hadn't been one, create one. */
3122 if (i == f->header.e_shnum) {
3123 struct obj_section *sec;
3125 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
3126 f->sections[i] = sec = arch_new_section();
3127 f->header.e_shnum = i + 1;
3129 memset(sec, 0, sizeof(*sec));
3130 sec->header.sh_type = SHT_PROGBITS;
3131 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
3136 /* Allocate the COMMONS. */
3138 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
3139 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
3140 struct common_entry *c;
3142 for (c = common_head; c; c = c->next) {
3143 ElfW(Addr) align = c->sym->value;
3145 if (align > max_align)
3147 if (bss_size & (align - 1))
3148 bss_size = (bss_size | (align - 1)) + 1;
3151 c->sym->value = bss_size;
3153 bss_size += c->sym->size;
3156 f->sections[i]->header.sh_size = bss_size;
3157 f->sections[i]->header.sh_addralign = max_align;
3161 /* For the sake of patch relocation and parameter initialization,
3162 allocate zeroed data for NOBITS sections now. Note that after
3163 this we cannot assume NOBITS are really empty. */
3164 for (i = 0; i < f->header.e_shnum; ++i) {
3165 struct obj_section *s = f->sections[i];
3166 if (s->header.sh_type == SHT_NOBITS) {
3167 if (s->header.sh_size != 0)
3168 s->contents = memset(xmalloc(s->header.sh_size),
3169 0, s->header.sh_size);
3173 s->header.sh_type = SHT_PROGBITS;
3178 static unsigned long obj_load_size(struct obj_file *f)
3180 unsigned long dot = 0;
3181 struct obj_section *sec;
3183 /* Finalize the positions of the sections relative to one another. */
3185 for (sec = f->load_order; sec; sec = sec->load_next) {
3188 align = sec->header.sh_addralign;
3189 if (align && (dot & (align - 1)))
3190 dot = (dot | (align - 1)) + 1;
3192 sec->header.sh_addr = dot;
3193 dot += sec->header.sh_size;
3199 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
3201 int i, n = f->header.e_shnum;
3204 /* Finalize the addresses of the sections. */
3207 for (i = 0; i < n; ++i)
3208 f->sections[i]->header.sh_addr += base;
3210 /* And iterate over all of the relocations. */
3212 for (i = 0; i < n; ++i) {
3213 struct obj_section *relsec, *symsec, *targsec, *strsec;
3214 ElfW(RelM) * rel, *relend;
3218 relsec = f->sections[i];
3219 if (relsec->header.sh_type != SHT_RELM)
3222 symsec = f->sections[relsec->header.sh_link];
3223 targsec = f->sections[relsec->header.sh_info];
3224 strsec = f->sections[symsec->header.sh_link];
3226 rel = (ElfW(RelM) *) relsec->contents;
3227 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
3228 symtab = (ElfW(Sym) *) symsec->contents;
3229 strtab = (const char *) strsec->contents;
3231 for (; rel < relend; ++rel) {
3232 ElfW(Addr) value = 0;
3233 struct obj_symbol *intsym = NULL;
3234 unsigned long symndx;
3235 ElfW(Sym) * extsym = 0;
3238 /* Attempt to find a value to use for this relocation. */
3240 symndx = ELF_R_SYM(rel->r_info);
3242 /* Note we've already checked for undefined symbols. */
3244 extsym = &symtab[symndx];
3245 if (ELF_ST_BIND(extsym->st_info) == STB_LOCAL) {
3246 /* Local symbols we look up in the local table to be sure
3247 we get the one that is really intended. */
3248 intsym = f->local_symtab[symndx];
3250 /* Others we look up in the hash table. */
3252 if (extsym->st_name)
3253 name = strtab + extsym->st_name;
3255 name = f->sections[extsym->st_shndx]->name;
3256 intsym = obj_find_symbol(f, name);
3259 value = obj_symbol_final_value(f, intsym);
3260 intsym->referenced = 1;
3262 #if SHT_RELM == SHT_RELA
3263 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
3264 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
3265 if (!extsym || !extsym->st_name ||
3266 ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
3268 value += rel->r_addend;
3272 switch (arch_apply_relocation
3273 (f, targsec, symsec, intsym, rel, value)) {
3277 case obj_reloc_overflow:
3278 errmsg = "Relocation overflow";
3280 case obj_reloc_dangerous:
3281 errmsg = "Dangerous relocation";
3283 case obj_reloc_unhandled:
3284 errmsg = "Unhandled relocation";
3287 bb_error_msg("%s of type %ld for %s", errmsg,
3288 (long) ELF_R_TYPE(rel->r_info),
3289 strtab + extsym->st_name);
3291 bb_error_msg("%s of type %ld", errmsg,
3292 (long) ELF_R_TYPE(rel->r_info));
3300 /* Finally, take care of the patches. */
3302 if (f->string_patches) {
3303 struct obj_string_patch *p;
3304 struct obj_section *strsec;
3305 ElfW(Addr) strsec_base;
3306 strsec = obj_find_section(f, ".kstrtab");
3307 strsec_base = strsec->header.sh_addr;
3309 for (p = f->string_patches; p; p = p->next) {
3310 struct obj_section *targsec = f->sections[p->reloc_secidx];
3311 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3312 = strsec_base + p->string_offset;
3316 if (f->symbol_patches) {
3317 struct obj_symbol_patch *p;
3319 for (p = f->symbol_patches; p; p = p->next) {
3320 struct obj_section *targsec = f->sections[p->reloc_secidx];
3321 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3322 = obj_symbol_final_value(f, p->sym);
3329 static int obj_create_image(struct obj_file *f, char *image)
3331 struct obj_section *sec;
3332 ElfW(Addr) base = f->baseaddr;
3334 for (sec = f->load_order; sec; sec = sec->load_next) {
3337 if (sec->contents == 0 || sec->header.sh_size == 0)
3340 secimg = image + (sec->header.sh_addr - base);
3342 /* Note that we allocated data for NOBITS sections earlier. */
3343 memcpy(secimg, sec->contents, sec->header.sh_size);
3349 /*======================================================================*/
3351 static struct obj_file *obj_load(FILE * fp, int loadprogbits)
3354 ElfW(Shdr) * section_headers;
3358 /* Read the file header. */
3360 f = arch_new_file();
3361 memset(f, 0, sizeof(*f));
3362 f->symbol_cmp = strcmp;
3363 f->symbol_hash = obj_elf_hash;
3364 f->load_order_search_start = &f->load_order;
3366 fseek(fp, 0, SEEK_SET);
3367 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
3368 bb_perror_msg("error reading ELF header");
3372 if (f->header.e_ident[EI_MAG0] != ELFMAG0
3373 || f->header.e_ident[EI_MAG1] != ELFMAG1
3374 || f->header.e_ident[EI_MAG2] != ELFMAG2
3375 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
3376 bb_error_msg("not an ELF file");
3379 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3380 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN
3381 ? ELFDATA2MSB : ELFDATA2LSB)
3382 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3383 || !MATCH_MACHINE(f->header.e_machine)) {
3384 bb_error_msg("ELF file not for this architecture");
3387 if (f->header.e_type != ET_REL) {
3388 bb_error_msg("ELF file not a relocatable object");
3392 /* Read the section headers. */
3394 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3395 bb_error_msg("section header size mismatch: %lu != %lu",
3396 (unsigned long) f->header.e_shentsize,
3397 (unsigned long) sizeof(ElfW(Shdr)));
3401 shnum = f->header.e_shnum;
3402 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3403 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3405 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3406 fseek(fp, f->header.e_shoff, SEEK_SET);
3407 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3408 bb_perror_msg("error reading ELF section headers");
3412 /* Read the section data. */
3414 for (i = 0; i < shnum; ++i) {
3415 struct obj_section *sec;
3417 f->sections[i] = sec = arch_new_section();
3418 memset(sec, 0, sizeof(*sec));
3420 sec->header = section_headers[i];
3423 if(sec->header.sh_size) switch (sec->header.sh_type) {
3432 if (!loadprogbits) {
3433 sec->contents = NULL;
3440 if (sec->header.sh_size > 0) {
3441 sec->contents = xmalloc(sec->header.sh_size);
3442 fseek(fp, sec->header.sh_offset, SEEK_SET);
3443 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3444 bb_perror_msg("error reading ELF section data");
3448 sec->contents = NULL;
3452 #if SHT_RELM == SHT_REL
3454 bb_error_msg("RELA relocations not supported on this architecture");
3458 bb_error_msg("REL relocations not supported on this architecture");
3463 if (sec->header.sh_type >= SHT_LOPROC) {
3464 /* Assume processor specific section types are debug
3465 info and can safely be ignored. If this is ever not
3466 the case (Hello MIPS?), don't put ifdefs here but
3467 create an arch_load_proc_section(). */
3471 bb_error_msg("can't handle sections of type %ld",
3472 (long) sec->header.sh_type);
3477 /* Do what sort of interpretation as needed by each section. */
3479 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3481 for (i = 0; i < shnum; ++i) {
3482 struct obj_section *sec = f->sections[i];
3483 sec->name = shstrtab + sec->header.sh_name;
3486 for (i = 0; i < shnum; ++i) {
3487 struct obj_section *sec = f->sections[i];
3489 /* .modinfo should be contents only but gcc has no attribute for that.
3490 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3492 if (strcmp(sec->name, ".modinfo") == 0)
3493 sec->header.sh_flags &= ~SHF_ALLOC;
3495 if (sec->header.sh_flags & SHF_ALLOC)
3496 obj_insert_section_load_order(f, sec);
3498 switch (sec->header.sh_type) {
3501 unsigned long nsym, j;
3505 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3506 bb_error_msg("symbol size mismatch: %lu != %lu",
3507 (unsigned long) sec->header.sh_entsize,
3508 (unsigned long) sizeof(ElfW(Sym)));
3512 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3513 strtab = f->sections[sec->header.sh_link]->contents;
3514 sym = (ElfW(Sym) *) sec->contents;
3516 /* Allocate space for a table of local symbols. */
3517 j = f->local_symtab_size = sec->header.sh_info;
3518 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3520 /* Insert all symbols into the hash table. */
3521 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3522 ElfW(Addr) val = sym->st_value;
3525 name = strtab + sym->st_name;
3526 else if (sym->st_shndx < shnum)
3527 name = f->sections[sym->st_shndx]->name;
3531 #if defined(__SH5__)
3533 * For sh64 it is possible that the target of a branch
3534 * requires a mode switch (32 to 16 and back again).
3536 * This is implied by the lsb being set in the target
3537 * address for SHmedia mode and clear for SHcompact.
3539 val |= sym->st_other & 4;
3542 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3549 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3550 bb_error_msg("relocation entry size mismatch: %lu != %lu",
3551 (unsigned long) sec->header.sh_entsize,
3552 (unsigned long) sizeof(ElfW(RelM)));
3556 /* XXX Relocation code from modutils-2.3.19 is not here.
3557 * Why? That's about 20 lines of code from obj/obj_load.c,
3558 * which gets done in a second pass through the sections.
3559 * This BusyBox insmod does similar work in obj_relocate(). */
3566 #ifdef CONFIG_FEATURE_INSMOD_LOADINKMEM
3568 * load the unloaded sections directly into the memory allocated by
3569 * kernel for the module
3572 static int obj_load_progbits(FILE * fp, struct obj_file* f, char* imagebase)
3574 ElfW(Addr) base = f->baseaddr;
3575 struct obj_section* sec;
3577 for (sec = f->load_order; sec; sec = sec->load_next) {
3579 /* section already loaded? */
3580 if (sec->contents != NULL)
3583 if (sec->header.sh_size == 0)
3586 sec->contents = imagebase + (sec->header.sh_addr - base);
3587 fseek(fp, sec->header.sh_offset, SEEK_SET);
3588 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3589 bb_perror_msg("error reading ELF section data");
3598 static void hide_special_symbols(struct obj_file *f)
3600 static const char *const specials[] = {
3601 SPFX "cleanup_module",
3603 SPFX "kernel_version",
3607 struct obj_symbol *sym;
3608 const char *const *p;
3610 for (p = specials; *p; ++p)
3611 if ((sym = obj_find_symbol(f, *p)) != NULL)
3613 ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info));
3617 #ifdef CONFIG_FEATURE_CHECK_TAINTED_MODULE
3618 static int obj_gpl_license(struct obj_file *f, const char **license)
3620 struct obj_section *sec;
3621 /* This list must match *exactly* the list of allowable licenses in
3622 * linux/include/linux/module.h. Checking for leading "GPL" will not
3623 * work, somebody will use "GPL sucks, this is proprietary".
3625 static const char * const gpl_licenses[] = {
3628 "GPL and additional rights",
3633 if ((sec = obj_find_section(f, ".modinfo"))) {
3634 const char *value, *ptr, *endptr;
3635 ptr = sec->contents;
3636 endptr = ptr + sec->header.sh_size;
3637 while (ptr < endptr) {
3638 if ((value = strchr(ptr, '=')) && strncmp(ptr, "license", value-ptr) == 0) {
3642 for (i = 0; i < sizeof(gpl_licenses)/sizeof(gpl_licenses[0]); ++i) {
3643 if (strcmp(value+1, gpl_licenses[i]) == 0)
3648 if (strchr(ptr, '\0'))
3649 ptr = strchr(ptr, '\0') + 1;
3657 #define TAINT_FILENAME "/proc/sys/kernel/tainted"
3658 #define TAINT_PROPRIETORY_MODULE (1<<0)
3659 #define TAINT_FORCED_MODULE (1<<1)
3660 #define TAINT_UNSAFE_SMP (1<<2)
3661 #define TAINT_URL "http://www.tux.org/lkml/#export-tainted"
3663 static void set_tainted(struct obj_file *f, int fd, char *m_name,
3664 int kernel_has_tainted, int taint, const char *text1, const char *text2)
3668 static int first = 1;
3669 if (fd < 0 && !kernel_has_tainted)
3670 return; /* New modutils on old kernel */
3671 printf("Warning: loading %s will taint the kernel: %s%s\n",
3672 m_name, text1, text2);
3674 printf(" See %s for information about tainted modules\n", TAINT_URL);
3678 read(fd, buf, sizeof(buf)-1);
3679 buf[sizeof(buf)-1] = '\0';
3680 oldval = strtoul(buf, NULL, 10);
3681 sprintf(buf, "%d\n", oldval | taint);
3682 write(fd, buf, strlen(buf));
3686 /* Check if loading this module will taint the kernel. */
3687 static void check_tainted_module(struct obj_file *f, char *m_name)
3689 static const char tainted_file[] = TAINT_FILENAME;
3690 int fd, kernel_has_tainted;
3693 kernel_has_tainted = 1;
3694 if ((fd = open(tainted_file, O_RDWR)) < 0) {
3695 if (errno == ENOENT)
3696 kernel_has_tainted = 0;
3697 else if (errno == EACCES)
3698 kernel_has_tainted = 1;
3700 perror(tainted_file);
3701 kernel_has_tainted = 0;
3705 switch (obj_gpl_license(f, &ptr)) {
3709 set_tainted(f, fd, m_name, kernel_has_tainted, TAINT_PROPRIETORY_MODULE, "no license", "");
3712 /* The module has a non-GPL license so we pretend that the
3713 * kernel always has a taint flag to get a warning even on
3714 * kernels without the proc flag.
3716 set_tainted(f, fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr);
3719 set_tainted(f, fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", "");
3723 if (flag_force_load)
3724 set_tainted(f, fd, m_name, 1, TAINT_FORCED_MODULE, "forced load", "");
3729 #else /* CONFIG_FEATURE_CHECK_TAINTED_MODULE */
3730 #define check_tainted_module(x, y) do { } while(0);
3731 #endif /* CONFIG_FEATURE_CHECK_TAINTED_MODULE */
3733 #ifdef CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
3734 /* add module source, timestamp, kernel version and a symbol for the
3735 * start of some sections. this info is used by ksymoops to do better
3739 get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
3741 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
3742 return new_get_module_version(f, str);
3743 #else /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
3744 strncpy(str, "???", sizeof(str));
3746 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
3749 /* add module source, timestamp, kernel version and a symbol for the
3750 * start of some sections. this info is used by ksymoops to do better
3754 add_ksymoops_symbols(struct obj_file *f, const char *filename,
3757 static const char symprefix[] = "__insmod_";
3758 struct obj_section *sec;
3759 struct obj_symbol *sym;
3760 char *name, *absolute_filename;
3761 char str[STRVERSIONLEN], real[PATH_MAX];
3762 int i, l, lm_name, lfilename, use_ksymtab, version;
3763 struct stat statbuf;
3765 static const char *section_names[] = {
3773 if (realpath(filename, real)) {
3774 absolute_filename = xstrdup(real);
3777 int save_errno = errno;
3778 bb_error_msg("cannot get realpath for %s", filename);
3781 absolute_filename = xstrdup(filename);
3784 lm_name = strlen(m_name);
3785 lfilename = strlen(absolute_filename);
3787 /* add to ksymtab if it already exists or there is no ksymtab and other symbols
3788 * are not to be exported. otherwise leave ksymtab alone for now, the
3789 * "export all symbols" compatibility code will export these symbols later.
3791 use_ksymtab = obj_find_section(f, "__ksymtab") || flag_noexport;
3793 if ((sec = obj_find_section(f, ".this"))) {
3794 /* tag the module header with the object name, last modified
3795 * timestamp and module version. worst case for module version
3796 * is 0xffffff, decimal 16777215. putting all three fields in
3797 * one symbol is less readable but saves kernel space.
3799 l = sizeof(symprefix)+ /* "__insmod_" */
3800 lm_name+ /* module name */
3802 lfilename+ /* object filename */
3804 2*sizeof(statbuf.st_mtime)+ /* mtime in hex */
3806 8+ /* version in dec */
3809 if (stat(absolute_filename, &statbuf) != 0)
3810 statbuf.st_mtime = 0;
3811 version = get_module_version(f, str); /* -1 if not found */
3812 snprintf(name, l, "%s%s_O%s_M%0*lX_V%d",
3813 symprefix, m_name, absolute_filename,
3814 (int)(2*sizeof(statbuf.st_mtime)), statbuf.st_mtime,
3816 sym = obj_add_symbol(f, name, -1,
3817 ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3818 sec->idx, sec->header.sh_addr, 0);
3820 new_add_ksymtab(f, sym);
3822 free(absolute_filename);
3823 #ifdef _NOT_SUPPORTED_
3824 /* record where the persistent data is going, same address as previous symbol */
3827 l = sizeof(symprefix)+ /* "__insmod_" */
3828 lm_name+ /* module name */
3830 strlen(f->persist)+ /* data store */
3833 snprintf(name, l, "%s%s_P%s",
3834 symprefix, m_name, f->persist);
3835 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3836 sec->idx, sec->header.sh_addr, 0);
3838 new_add_ksymtab(f, sym);
3840 #endif /* _NOT_SUPPORTED_ */
3841 /* tag the desired sections if size is non-zero */
3843 for (i = 0; i < sizeof(section_names)/sizeof(section_names[0]); ++i) {
3844 if ((sec = obj_find_section(f, section_names[i])) &&
3845 sec->header.sh_size) {
3846 l = sizeof(symprefix)+ /* "__insmod_" */
3847 lm_name+ /* module name */
3849 strlen(sec->name)+ /* section name */
3851 8+ /* length in dec */
3854 snprintf(name, l, "%s%s_S%s_L%ld",
3855 symprefix, m_name, sec->name,
3856 (long)sec->header.sh_size);
3857 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3858 sec->idx, sec->header.sh_addr, 0);
3860 new_add_ksymtab(f, sym);
3864 #endif /* CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
3866 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP
3867 static void print_load_map(struct obj_file *f)
3869 struct obj_symbol *sym;
3870 struct obj_symbol **all, **p;
3871 struct obj_section *sec;
3872 int i, nsyms, *loaded;
3874 /* Report on the section layout. */
3876 printf("Sections: Size %-*s Align\n",
3877 (int) (2 * sizeof(void *)), "Address");
3879 for (sec = f->load_order; sec; sec = sec->load_next) {
3883 for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a)
3888 printf("%-15s %08lx %0*lx 2**%d\n",
3890 (long)sec->header.sh_size,
3891 (int) (2 * sizeof(void *)),
3892 (long)sec->header.sh_addr,
3895 #ifdef CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL
3896 /* Quick reference which section indicies are loaded. */
3898 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
3900 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
3902 /* Collect the symbols we'll be listing. */
3904 for (nsyms = i = 0; i < HASH_BUCKETS; ++i)
3905 for (sym = f->symtab[i]; sym; sym = sym->next)
3906 if (sym->secidx <= SHN_HIRESERVE
3907 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3910 all = alloca(nsyms * sizeof(struct obj_symbol *));
3912 for (i = 0, p = all; i < HASH_BUCKETS; ++i)
3913 for (sym = f->symtab[i]; sym; sym = sym->next)
3914 if (sym->secidx <= SHN_HIRESERVE
3915 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3918 /* And list them. */
3919 printf("\nSymbols:\n");
3920 for (p = all; p < all + nsyms; ++p) {
3922 unsigned long value;
3925 if (sym->secidx == SHN_ABS) {
3928 } else if (sym->secidx == SHN_UNDEF) {
3932 sec = f->sections[sym->secidx];
3934 if (sec->header.sh_type == SHT_NOBITS)
3936 else if (sec->header.sh_flags & SHF_ALLOC) {
3937 if (sec->header.sh_flags & SHF_EXECINSTR)
3939 else if (sec->header.sh_flags & SHF_WRITE)
3944 value = sym->value + sec->header.sh_addr;
3947 if (ELF_ST_BIND(sym->info) == STB_LOCAL)
3948 type = tolower(type);
3950 printf("%0*lx %c %s\n", (int) (2 * sizeof(void *)), value,
3955 #else /* !CONFIG_FEATURE_INSMOD_LOAD_MAP */
3956 void print_load_map(struct obj_file *f);
3959 int insmod_main( int argc, char **argv)
3965 unsigned long m_size;
3970 int exit_status = EXIT_FAILURE;
3972 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
3973 struct utsname uts_info;
3974 char m_strversion[STRVERSIONLEN];
3975 int m_version, m_crcs;
3977 #ifdef CONFIG_FEATURE_CLEAN_UP
3983 struct utsname myuname;
3985 /* Parse any options */
3986 option_mask = bb_getopt_ulflags(argc, argv, OPTION_STR, &opt_o);
3987 if (option_mask & OPT_o) { // -o /* name the output module */
3989 m_name = xstrdup(opt_o);
3992 if (argv[optind] == NULL) {
3996 /* Grab the module name */
3997 tmp1 = xstrdup(argv[optind]);
3998 tmp = basename(tmp1);
4001 if (uname(&myuname) == 0) {
4002 if (myuname.release[0] == '2') {
4003 k_version = myuname.release[2] - '0';
4007 #if defined(CONFIG_FEATURE_2_6_MODULES)
4008 if (k_version > 4 && len > 3 && tmp[len - 3] == '.' &&
4009 tmp[len - 2] == 'k' && tmp[len - 1] == 'o') {
4015 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
4021 #if defined(CONFIG_FEATURE_2_6_MODULES)
4023 m_fullName = xasprintf("%s.ko", tmp);
4026 m_fullName = xasprintf("%s.o", tmp);
4032 tmp1 = 0; /* flag for free(m_name) before exit() */
4035 /* Get a filedesc for the module. Check we we have a complete path */
4036 if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) ||
4037 (fp = fopen(argv[optind], "r")) == NULL) {
4038 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
4039 * but do not error out yet if we fail to find it... */
4040 if (k_version) { /* uname succeedd */
4043 char real_module_dir[FILENAME_MAX];
4045 tmdn = concat_path_file(_PATH_MODULES, myuname.release);
4046 /* Jump through hoops in case /lib/modules/`uname -r`
4047 * is a symlink. We do not want recursive_action to
4048 * follow symlinks, but we do want to follow the
4049 * /lib/modules/`uname -r` dir, So resolve it ourselves
4050 * if it is a link... */
4051 if (realpath (tmdn, real_module_dir) == NULL)
4054 module_dir = real_module_dir;
4055 recursive_action(module_dir, TRUE, FALSE, FALSE,
4056 check_module_name_match, 0, m_fullName);
4060 /* Check if we have found anything yet */
4061 if (m_filename == 0 || ((fp = fopen(m_filename, "r")) == NULL))
4063 char module_dir[FILENAME_MAX];
4067 if (realpath (_PATH_MODULES, module_dir) == NULL)
4068 strcpy(module_dir, _PATH_MODULES);
4069 /* No module found under /lib/modules/`uname -r`, this
4070 * time cast the net a bit wider. Search /lib/modules/ */
4071 if (! recursive_action(module_dir, TRUE, FALSE, FALSE,
4072 check_module_name_match, 0, m_fullName))
4075 || ((fp = fopen(m_filename, "r")) == NULL))
4077 bb_error_msg("%s: no module by that name found", m_fullName);
4081 bb_error_msg_and_die("%s: no module by that name found", m_fullName);
4084 m_filename = xstrdup(argv[optind]);
4087 printf("Using %s\n", m_filename);
4089 #ifdef CONFIG_FEATURE_2_6_MODULES
4093 argv[optind + 1] = m_filename;
4094 return insmod_ng_main(argc - optind, argv + optind);
4098 if ((f = obj_load(fp, LOADBITS)) == NULL)
4099 bb_perror_msg_and_die("Could not load the module");
4101 if (get_modinfo_value(f, "kernel_version") == NULL)
4106 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
4107 /* Version correspondence? */
4109 if (uname(&uts_info) < 0)
4110 uts_info.release[0] = '\0';
4111 if (m_has_modinfo) {
4112 m_version = new_get_module_version(f, m_strversion);
4113 if (m_version == -1) {
4114 bb_error_msg("couldn't find the kernel version the module was "
4120 if (strncmp(uts_info.release, m_strversion, STRVERSIONLEN) != 0) {
4121 if (flag_force_load) {
4122 bb_error_msg("Warning: kernel-module version mismatch\n"
4123 "\t%s was compiled for kernel version %s\n"
4124 "\twhile this kernel is version %s",
4125 m_filename, m_strversion, uts_info.release);
4127 bb_error_msg("kernel-module version mismatch\n"
4128 "\t%s was compiled for kernel version %s\n"
4129 "\twhile this kernel is version %s.",
4130 m_filename, m_strversion, uts_info.release);
4136 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
4138 if (!query_module(NULL, 0, NULL, 0, NULL)) {
4139 if (!new_get_kernel_symbols())
4141 k_crcs = new_is_kernel_checksummed();
4143 bb_error_msg("Not configured to support old kernels");
4147 #ifdef CONFIG_FEATURE_INSMOD_VERSION_CHECKING
4150 m_crcs = new_is_module_checksummed(f);
4152 if (m_crcs != k_crcs)
4153 obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
4154 #endif /* CONFIG_FEATURE_INSMOD_VERSION_CHECKING */
4156 /* Let the module know about the kernel symbols. */
4157 add_kernel_symbols(f);
4159 /* Allocate common symbols, symbol tables, and string tables. */
4161 if (!new_create_this_module(f, m_name))
4166 if (!obj_check_undefineds(f)) {
4169 obj_allocate_commons(f);
4170 check_tainted_module(f, m_name);
4172 /* done with the module name, on to the optional var=value arguments */
4175 if (optind < argc) {
4176 if (!new_process_module_arguments(f, argc - optind, argv + optind))
4183 hide_special_symbols(f);
4185 #ifdef CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
4186 add_ksymoops_symbols(f, m_filename, m_name);
4187 #endif /* CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
4189 new_create_module_ksymtab(f);
4191 /* Find current size of the module */
4192 m_size = obj_load_size(f);
4195 m_addr = create_module(m_name, m_size);
4196 if (m_addr == -1) switch (errno) {
4198 bb_error_msg("A module named %s already exists", m_name);
4201 bb_error_msg("Can't allocate kernel memory for module; needed %lu bytes",
4205 bb_perror_msg("create_module: %s", m_name);
4211 * the PROGBITS section was not loaded by the obj_load
4212 * now we can load them directly into the kernel memory
4214 if (!obj_load_progbits(fp, f, (char*)m_addr)) {
4215 delete_module(m_name);
4220 if (!obj_relocate(f, m_addr)) {
4221 delete_module(m_name);
4225 if (!new_init_module(m_name, f, m_size))
4227 delete_module(m_name);
4231 if(flag_print_load_map)
4234 exit_status = EXIT_SUCCESS;
4237 #ifdef CONFIG_FEATURE_CLEAN_UP
4246 return(exit_status);
4253 #ifdef CONFIG_FEATURE_2_6_MODULES
4255 #include <sys/mman.h>
4256 #include <asm/unistd.h>
4257 #include <sys/syscall.h>
4259 /* We use error numbers in a loose translation... */
4260 static const char *moderror(int err)
4264 return "Invalid module format";
4266 return "Unknown symbol in module";
4268 return "Module has wrong symbol version";
4270 return "Invalid parameters";
4272 return strerror(err);
4276 int insmod_ng_main( int argc, char **argv)
4284 char *filename, *options = xstrdup("");
4292 /* Rest is options */
4293 for (i = 2; i < argc; i++) {
4294 options = xrealloc(options, strlen(options) + 2 + strlen(argv[i]) + 2);
4295 /* Spaces handled by "" pairs, but no way of escaping quotes */
4296 if (strchr(argv[i], ' ')) {
4297 strcat(options, "\"");
4298 strcat(options, argv[i]);
4299 strcat(options, "\"");
4301 strcat(options, argv[i]);
4303 strcat(options, " ");
4306 fd = xopen(filename, O_RDONLY);
4310 map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
4311 if (map == MAP_FAILED) {
4312 bb_perror_msg_and_die("cannot mmap `%s'", filename);
4315 ret = syscall(__NR_init_module, map, len, options);
4317 bb_perror_msg_and_die("cannot insert `%s': %s (%li)",
4318 filename, moderror(errno), ret);