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 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 !ENABLE_FEATURE_2_4_MODULES && !ENABLE_FEATURE_2_6_MODULES
66 #undef ENABLE_FEATURE_2_4_MODULES
67 #define ENABLE_FEATURE_2_4_MODULES 1
71 * Big piece of 2.4-specific code
73 #if ENABLE_FEATURE_2_4_MODULES
75 #if ENABLE_FEATURE_2_6_MODULES
76 static int insmod_ng_main(int argc, char **argv);
79 #if ENABLE_FEATURE_INSMOD_LOADINKMEM
86 #if defined(__alpha__)
87 #define MATCH_MACHINE(x) (x == EM_ALPHA)
88 #define SHT_RELM SHT_RELA
89 #define Elf64_RelM Elf64_Rela
90 #define ELFCLASSM ELFCLASS64
95 #define MATCH_MACHINE(x) (x == EM_ARM)
96 #define SHT_RELM SHT_REL
97 #define Elf32_RelM Elf32_Rel
98 #define ELFCLASSM ELFCLASS32
99 #define USE_PLT_ENTRIES
100 #define PLT_ENTRY_SIZE 8
101 #define USE_GOT_ENTRIES
102 #define GOT_ENTRY_SIZE 8
108 #define MATCH_MACHINE(x) (x == EM_BLACKFIN)
109 #define SHT_RELM SHT_RELA
110 #define Elf32_RelM Elf32_Rela
111 #define ELFCLASSM ELFCLASS32
115 #if defined(__cris__)
116 #define MATCH_MACHINE(x) (x == EM_CRIS)
117 #define SHT_RELM SHT_RELA
118 #define Elf32_RelM Elf32_Rela
119 #define ELFCLASSM ELFCLASS32
122 #define R_CRIS_NONE 0
128 #if defined(__H8300H__) || defined(__H8300S__)
129 #define MATCH_MACHINE(x) (x == EM_H8_300)
130 #define SHT_RELM SHT_RELA
131 #define Elf32_RelM Elf32_Rela
132 #define ELFCLASSM ELFCLASS32
134 #define SYMBOL_PREFIX "_"
137 /* PA-RISC / HP-PA */
138 #if defined(__hppa__)
139 #define MATCH_MACHINE(x) (x == EM_PARISC)
140 #define SHT_RELM SHT_RELA
141 #if defined(__LP64__)
142 #define Elf64_RelM Elf64_Rela
143 #define ELFCLASSM ELFCLASS64
145 #define Elf32_RelM Elf32_Rela
146 #define ELFCLASSM ELFCLASS32
151 #if defined(__i386__)
153 #define MATCH_MACHINE(x) (x == EM_386)
155 #define MATCH_MACHINE(x) (x == EM_386 || x == EM_486)
157 #define SHT_RELM SHT_REL
158 #define Elf32_RelM Elf32_Rel
159 #define ELFCLASSM ELFCLASS32
160 #define USE_GOT_ENTRIES
161 #define GOT_ENTRY_SIZE 4
165 /* IA64, aka Itanium */
166 #if defined(__ia64__)
167 #define MATCH_MACHINE(x) (x == EM_IA_64)
168 #define SHT_RELM SHT_RELA
169 #define Elf64_RelM Elf64_Rela
170 #define ELFCLASSM ELFCLASS64
174 #if defined(__mc68000__)
175 #define MATCH_MACHINE(x) (x == EM_68K)
176 #define SHT_RELM SHT_RELA
177 #define Elf32_RelM Elf32_Rela
178 #define ELFCLASSM ELFCLASS32
179 #define USE_GOT_ENTRIES
180 #define GOT_ENTRY_SIZE 4
185 #if defined(__microblaze__)
187 #include <linux/elf-em.h>
188 #define MATCH_MACHINE(x) (x == EM_XILINX_MICROBLAZE)
189 #define SHT_RELM SHT_RELA
190 #define Elf32_RelM Elf32_Rela
191 #define ELFCLASSM ELFCLASS32
195 #if defined(__mips__)
196 #define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE)
197 #define SHT_RELM SHT_REL
198 #define Elf32_RelM Elf32_Rel
199 #define ELFCLASSM ELFCLASS32
200 /* Account for ELF spec changes. */
201 #ifndef EM_MIPS_RS3_LE
202 #ifdef EM_MIPS_RS4_BE
203 #define EM_MIPS_RS3_LE EM_MIPS_RS4_BE
205 #define EM_MIPS_RS3_LE 10
207 #endif /* !EM_MIPS_RS3_LE */
208 #define ARCHDATAM "__dbe_table"
212 #if defined(__nios2__)
213 #define MATCH_MACHINE(x) (x == EM_ALTERA_NIOS2)
214 #define SHT_RELM SHT_RELA
215 #define Elf32_RelM Elf32_Rela
216 #define ELFCLASSM ELFCLASS32
220 #if defined(__powerpc64__)
221 #define MATCH_MACHINE(x) (x == EM_PPC64)
222 #define SHT_RELM SHT_RELA
223 #define Elf64_RelM Elf64_Rela
224 #define ELFCLASSM ELFCLASS64
225 #elif defined(__powerpc__)
226 #define MATCH_MACHINE(x) (x == EM_PPC)
227 #define SHT_RELM SHT_RELA
228 #define Elf32_RelM Elf32_Rela
229 #define ELFCLASSM ELFCLASS32
230 #define USE_PLT_ENTRIES
231 #define PLT_ENTRY_SIZE 16
233 #define LIST_ARCHTYPE ElfW(Addr)
235 #define ARCHDATAM "__ftr_fixup"
239 #if defined(__s390__)
240 #define MATCH_MACHINE(x) (x == EM_S390)
241 #define SHT_RELM SHT_RELA
242 #define Elf32_RelM Elf32_Rela
243 #define ELFCLASSM ELFCLASS32
244 #define USE_PLT_ENTRIES
245 #define PLT_ENTRY_SIZE 8
246 #define USE_GOT_ENTRIES
247 #define GOT_ENTRY_SIZE 8
253 #define MATCH_MACHINE(x) (x == EM_SH)
254 #define SHT_RELM SHT_RELA
255 #define Elf32_RelM Elf32_Rela
256 #define ELFCLASSM ELFCLASS32
257 #define USE_GOT_ENTRIES
258 #define GOT_ENTRY_SIZE 4
260 /* the SH changes have only been tested in =little endian= mode */
261 /* I'm not sure about big endian, so let's warn: */
262 #if defined(__sh__) && BB_BIG_ENDIAN
263 # error insmod.c may require changes for use on big endian SH
265 /* it may or may not work on the SH1/SH2... Error on those also */
266 #if ((!(defined(__SH3__) || defined(__SH4__) || defined(__SH5__)))) && (defined(__sh__))
267 #error insmod.c may require changes for SH1 or SH2 use
272 #if defined(__sparc__)
273 #define MATCH_MACHINE(x) (x == EM_SPARC)
274 #define SHT_RELM SHT_RELA
275 #define Elf32_RelM Elf32_Rela
276 #define ELFCLASSM ELFCLASS32
280 #if defined(__v850e__)
281 #define MATCH_MACHINE(x) ((x) == EM_V850 || (x) == EM_CYGNUS_V850)
282 #define SHT_RELM SHT_RELA
283 #define Elf32_RelM Elf32_Rela
284 #define ELFCLASSM ELFCLASS32
285 #define USE_PLT_ENTRIES
286 #define PLT_ENTRY_SIZE 8
288 #ifndef EM_CYGNUS_V850 /* grumble */
289 #define EM_CYGNUS_V850 0x9080
291 #define SYMBOL_PREFIX "_"
295 #if defined(__x86_64__)
296 #define MATCH_MACHINE(x) (x == EM_X86_64)
297 #define SHT_RELM SHT_RELA
298 #define USE_GOT_ENTRIES
299 #define GOT_ENTRY_SIZE 8
301 #define Elf64_RelM Elf64_Rela
302 #define ELFCLASSM ELFCLASS64
306 #error Sorry, but insmod.c does not yet support this architecture...
310 //----------------------------------------------------------------------------
311 //--------modutils module.h, lines 45-242
312 //----------------------------------------------------------------------------
314 /* Definitions for the Linux module syscall interface.
315 Copyright 1996, 1997 Linux International.
317 Contributed by Richard Henderson <rth@tamu.edu>
319 This file is part of the Linux modutils.
321 This program is free software; you can redistribute it and/or modify it
322 under the terms of the GNU General Public License as published by the
323 Free Software Foundation; either version 2 of the License, or (at your
324 option) any later version.
326 This program is distributed in the hope that it will be useful, but
327 WITHOUT ANY WARRANTY; without even the implied warranty of
328 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
329 General Public License for more details.
331 You should have received a copy of the GNU General Public License
332 along with this program; if not, write to the Free Software Foundation,
333 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
336 #ifndef MODUTILS_MODULE_H
338 /*======================================================================*/
339 /* For sizeof() which are related to the module platform and not to the
340 environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
342 #define tgt_sizeof_char sizeof(char)
343 #define tgt_sizeof_short sizeof(short)
344 #define tgt_sizeof_int sizeof(int)
345 #define tgt_sizeof_long sizeof(long)
346 #define tgt_sizeof_char_p sizeof(char *)
347 #define tgt_sizeof_void_p sizeof(void *)
348 #define tgt_long long
350 #if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64)
351 #undef tgt_sizeof_long
352 #undef tgt_sizeof_char_p
353 #undef tgt_sizeof_void_p
357 tgt_sizeof_char_p = 8,
358 tgt_sizeof_void_p = 8
360 #define tgt_long long long
363 /*======================================================================*/
364 /* The structures used in Linux 2.1. */
366 /* Note: new_module_symbol does not use tgt_long intentionally */
367 struct new_module_symbol {
372 struct new_module_persist;
374 struct new_module_ref {
375 unsigned tgt_long dep; /* kernel addresses */
376 unsigned tgt_long ref;
377 unsigned tgt_long next_ref;
381 unsigned tgt_long size_of_struct; /* == sizeof(module) */
382 unsigned tgt_long next;
383 unsigned tgt_long name;
384 unsigned tgt_long size;
387 unsigned tgt_long flags; /* AUTOCLEAN et al */
392 unsigned tgt_long syms;
393 unsigned tgt_long deps;
394 unsigned tgt_long refs;
395 unsigned tgt_long init;
396 unsigned tgt_long cleanup;
397 unsigned tgt_long ex_table_start;
398 unsigned tgt_long ex_table_end;
400 unsigned tgt_long gp;
402 /* Everything after here is extension. */
403 unsigned tgt_long persist_start;
404 unsigned tgt_long persist_end;
405 unsigned tgt_long can_unload;
406 unsigned tgt_long runsize;
407 const char *kallsyms_start; /* All symbols for kernel debugging */
408 const char *kallsyms_end;
409 const char *archdata_start; /* arch specific data for module */
410 const char *archdata_end;
411 const char *kernel_data; /* Reserved for kernel internal use */
415 #define ARCHDATA_SEC_NAME ARCHDATAM
417 #define ARCHDATA_SEC_NAME "__archdata"
419 #define KALLSYMS_SEC_NAME "__kallsyms"
422 struct new_module_info {
429 /* Bits of module.flags. */
433 NEW_MOD_AUTOCLEAN = 4,
435 NEW_MOD_USED_ONCE = 16
438 int init_module(const char *name, const struct new_module *);
439 int query_module(const char *name, int which, void *buf,
440 size_t bufsize, size_t *ret);
442 /* Values for query_module's which. */
451 /*======================================================================*/
452 /* The system calls unchanged between 2.0 and 2.1. */
454 unsigned long create_module(const char *, size_t);
455 int delete_module(const char *);
458 #endif /* module.h */
460 //----------------------------------------------------------------------------
461 //--------end of modutils module.h
462 //----------------------------------------------------------------------------
466 //----------------------------------------------------------------------------
467 //--------modutils obj.h, lines 253-462
468 //----------------------------------------------------------------------------
470 /* Elf object file loading and relocation routines.
471 Copyright 1996, 1997 Linux International.
473 Contributed by Richard Henderson <rth@tamu.edu>
475 This file is part of the Linux modutils.
477 This program is free software; you can redistribute it and/or modify it
478 under the terms of the GNU General Public License as published by the
479 Free Software Foundation; either version 2 of the License, or (at your
480 option) any later version.
482 This program is distributed in the hope that it will be useful, but
483 WITHOUT ANY WARRANTY; without even the implied warranty of
484 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
485 General Public License for more details.
487 You should have received a copy of the GNU General Public License
488 along with this program; if not, write to the Free Software Foundation,
489 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
492 #ifndef MODUTILS_OBJ_H
494 /* The relocatable object is manipulated using elfin types. */
500 # if ELFCLASSM == ELFCLASS32
501 # define ElfW(x) Elf32_ ## x
502 # define ELFW(x) ELF32_ ## x
504 # define ElfW(x) Elf64_ ## x
505 # define ELFW(x) ELF64_ ## x
509 /* For some reason this is missing from some ancient C libraries.... */
510 #ifndef ELF32_ST_INFO
511 # define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
514 #ifndef ELF64_ST_INFO
515 # define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
518 #define ELF_ST_BIND(info) ELFW(ST_BIND)(info)
519 #define ELF_ST_TYPE(info) ELFW(ST_TYPE)(info)
520 #define ELF_ST_INFO(bind, type) ELFW(ST_INFO)(bind, type)
521 #define ELF_R_TYPE(val) ELFW(R_TYPE)(val)
522 #define ELF_R_SYM(val) ELFW(R_SYM)(val)
524 struct obj_string_patch;
525 struct obj_symbol_patch;
532 struct obj_section *load_next;
538 struct obj_symbol *next; /* hash table link */
542 int secidx; /* the defining section index/module */
544 int ksymidx; /* for export to the kernel symtab */
545 int referenced; /* actually used in the link */
548 /* Hardcode the hash table size. We shouldn't be needing so many
549 symbols that we begin to degrade performance, and we get a big win
550 by giving the compiler a constant divisor. */
552 #define HASH_BUCKETS 521
557 struct obj_section **sections;
558 struct obj_section *load_order;
559 struct obj_section **load_order_search_start;
560 struct obj_string_patch *string_patches;
561 struct obj_symbol_patch *symbol_patches;
562 int (*symbol_cmp)(const char *, const char *);
563 unsigned long (*symbol_hash)(const char *);
564 unsigned long local_symtab_size;
565 struct obj_symbol **local_symtab;
566 struct obj_symbol *symtab[HASH_BUCKETS];
576 struct obj_string_patch {
577 struct obj_string_patch *next;
579 ElfW(Addr) reloc_offset;
580 ElfW(Addr) string_offset;
583 struct obj_symbol_patch {
584 struct obj_symbol_patch *next;
586 ElfW(Addr) reloc_offset;
587 struct obj_symbol *sym;
591 /* Generic object manipulation routines. */
593 static unsigned long obj_elf_hash(const char *);
595 static unsigned long obj_elf_hash_n(const char *, unsigned long len);
597 static struct obj_symbol *obj_find_symbol(struct obj_file *f,
600 static ElfW(Addr) obj_symbol_final_value(struct obj_file *f,
601 struct obj_symbol *sym);
603 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
604 static void obj_set_symbol_compare(struct obj_file *f,
605 int (*cmp)(const char *, const char *),
606 unsigned long (*hash)(const char *));
609 static struct obj_section *obj_find_section(struct obj_file *f,
612 static void obj_insert_section_load_order(struct obj_file *f,
613 struct obj_section *sec);
615 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
620 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
625 static void *obj_extend_section(struct obj_section *sec, unsigned long more);
627 static void obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
630 static void obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
631 struct obj_symbol *sym);
633 static void obj_check_undefineds(struct obj_file *f);
635 static void obj_allocate_commons(struct obj_file *f);
637 static unsigned long obj_load_size(struct obj_file *f);
639 static int obj_relocate(struct obj_file *f, ElfW(Addr) base);
641 static struct obj_file *obj_load(FILE *f, int loadprogbits);
643 static int obj_create_image(struct obj_file *f, char *image);
645 /* Architecture specific manipulation routines. */
647 static struct obj_file *arch_new_file(void);
649 static struct obj_section *arch_new_section(void);
651 static struct obj_symbol *arch_new_symbol(void);
653 static enum obj_reloc arch_apply_relocation(struct obj_file *f,
654 struct obj_section *targsec,
655 /*struct obj_section *symsec,*/
656 struct obj_symbol *sym,
657 ElfW(RelM) *rel, ElfW(Addr) value);
659 static void arch_create_got(struct obj_file *f);
660 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
661 static int obj_gpl_license(struct obj_file *f, const char **license);
662 #endif /* FEATURE_CHECK_TAINTED_MODULE */
664 //----------------------------------------------------------------------------
665 //--------end of modutils obj.h
666 //----------------------------------------------------------------------------
669 /* SPFX is always a string, so it can be concatenated to string constants. */
671 #define SPFX SYMBOL_PREFIX
677 #define _PATH_MODULES "/lib/modules"
678 enum { STRVERSIONLEN = 64 };
680 /*======================================================================*/
682 #define OPTION_STR "sLo:fkvqx" USE_FEATURE_INSMOD_LOAD_MAP("m")
684 OPT_s = 0x1, // -s /* log to syslog */
685 /* Not supported but kernel needs this for request_module(),
686 as this calls: modprobe -k -s -- <module>
687 so silently ignore this flag */
688 OPT_L = 0x2, // -L /* Stub warning */
689 /* Compatibility with modprobe.
690 In theory, this does locking, but we don't do
691 that. So be careful and plan your life around not
692 loading the same module 50 times concurrently. */
693 OPT_o = 0x4, // -o /* name the output module */
694 OPT_f = 0x8, // -f /* force loading */
695 OPT_k = 0x10, // -k /* module loaded by kerneld, auto-cleanable */
696 OPT_v = 0x20, // -v /* verbose output */
697 OPT_q = 0x40, // -q /* silent */
698 OPT_x = 0x80, // -x /* do not export externs */
699 OPT_m = 0x100, // -m /* print module load map */
701 #define flag_force_load (option_mask32 & OPT_f)
702 #define flag_autoclean (option_mask32 & OPT_k)
703 #define flag_verbose (option_mask32 & OPT_v)
704 #define flag_quiet (option_mask32 & OPT_q)
705 #define flag_noexport (option_mask32 & OPT_x)
706 #if ENABLE_FEATURE_INSMOD_LOAD_MAP
707 #define flag_print_load_map (option_mask32 & OPT_m)
709 #define flag_print_load_map 0
712 /*======================================================================*/
714 #if defined(USE_LIST)
716 struct arch_list_entry
718 struct arch_list_entry *next;
719 LIST_ARCHTYPE addend;
726 #if defined(USE_SINGLE)
728 struct arch_single_entry
737 #if defined(__mips__)
740 struct mips_hi16 *next;
747 struct obj_file root;
748 #if defined(USE_PLT_ENTRIES)
749 struct obj_section *plt;
751 #if defined(USE_GOT_ENTRIES)
752 struct obj_section *got;
754 #if defined(__mips__)
755 struct mips_hi16 *mips_hi16_list;
760 struct obj_symbol root;
761 #if defined(USE_PLT_ENTRIES)
762 #if defined(USE_PLT_LIST)
763 struct arch_list_entry *pltent;
765 struct arch_single_entry pltent;
768 #if defined(USE_GOT_ENTRIES)
769 struct arch_single_entry gotent;
774 struct external_module {
779 struct new_module_symbol *syms;
782 static struct new_module_symbol *ksyms;
783 static size_t nksyms;
785 static struct external_module *ext_modules;
786 static int n_ext_modules;
787 static int n_ext_modules_used;
789 static char *m_filename;
790 static char *m_fullName;
793 /*======================================================================*/
796 static int check_module_name_match(const char *filename,
797 struct stat *statbuf ATTRIBUTE_UNUSED,
798 void *userdata, int depth ATTRIBUTE_UNUSED)
800 char *fullname = (char *) userdata;
803 if (fullname[0] == '\0')
806 tmp = bb_get_last_path_component_nostrip(filename);
807 if (strcmp(tmp, fullname) == 0) {
808 /* Stop searching if we find a match */
809 m_filename = xstrdup(filename);
816 /*======================================================================*/
818 static struct obj_file *arch_new_file(void)
821 f = xzalloc(sizeof(*f));
822 return &f->root; /* it's a first member */
825 static struct obj_section *arch_new_section(void)
827 return xzalloc(sizeof(struct obj_section));
830 static struct obj_symbol *arch_new_symbol(void)
832 struct arch_symbol *sym;
833 sym = xzalloc(sizeof(*sym));
837 static enum obj_reloc
838 arch_apply_relocation(struct obj_file *f,
839 struct obj_section *targsec,
840 /*struct obj_section *symsec,*/
841 struct obj_symbol *sym,
842 ElfW(RelM) *rel, ElfW(Addr) v)
844 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
845 || defined(__sh__) || defined(__s390__) || defined(__x86_64__)
846 struct arch_file *ifile = (struct arch_file *) f;
848 enum obj_reloc ret = obj_reloc_ok;
849 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
850 #if defined(__arm__) || defined(__H8300H__) || defined(__H8300S__) \
851 || defined(__i386__) || defined(__mc68000__) || defined(__microblaze__) \
852 || defined(__mips__) || defined(__nios2__) || defined(__powerpc__) \
853 || defined(__s390__) || defined(__sh__) || defined(__x86_64__)
854 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
856 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
857 struct arch_symbol *isym = (struct arch_symbol *) sym;
859 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
860 || defined(__sh__) || defined(__s390__)
861 #if defined(USE_GOT_ENTRIES)
862 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
865 #if defined(USE_PLT_ENTRIES)
866 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
868 # if defined(USE_PLT_LIST)
869 struct arch_list_entry *pe;
871 struct arch_single_entry *pe;
875 switch (ELF_R_TYPE(rel->r_info)) {
890 /* relative reloc, always to _GLOBAL_OFFSET_TABLE_
891 * (which is .got) similar to branch,
892 * but is full 32 bits relative */
901 case R_ARM_GOTOFF: /* address relative to the got */
905 #elif defined(__cris__)
911 /* CRIS keeps the relocation value in the r_addend field and
912 * should not use whats in *loc at all
917 #elif defined(__H8300H__) || defined(__H8300S__)
920 loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1);
921 *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
932 if ((ElfW(Sword))v > 0x7fff ||
933 (ElfW(Sword))v < -(ElfW(Sword))0x8000)
934 ret = obj_reloc_overflow;
936 *(unsigned short *)loc = v;
940 if ((ElfW(Sword))v > 0x7f ||
941 (ElfW(Sword))v < -(ElfW(Sword))0x80)
942 ret = obj_reloc_overflow;
944 *(unsigned char *)loc = v;
947 #elif defined(__i386__)
979 #elif defined(__microblaze__)
980 case R_MICROBLAZE_NONE:
981 case R_MICROBLAZE_64_NONE:
982 case R_MICROBLAZE_32_SYM_OP_SYM:
983 case R_MICROBLAZE_32_PCREL:
986 case R_MICROBLAZE_64_PCREL: {
987 /* dot is the address of the current instruction.
988 * v is the target symbol address.
989 * So we need to extract the offset in the code,
990 * adding v, then subtrating the current address
991 * of this instruction.
992 * Ex: "IMM 0xFFFE bralid 0x0000" = "bralid 0xFFFE0000"
995 /* Get split offset stored in code */
996 unsigned int temp = (loc[0] & 0xFFFF) << 16 |
999 /* Adjust relative offset. -4 adjustment required
1000 * because dot points to the IMM insn, but branch
1001 * is computed relative to the branch instruction itself.
1003 temp += v - dot - 4;
1005 /* Store back into code */
1006 loc[0] = (loc[0] & 0xFFFF0000) | temp >> 16;
1007 loc[1] = (loc[1] & 0xFFFF0000) | (temp & 0xFFFF);
1012 case R_MICROBLAZE_32:
1016 case R_MICROBLAZE_64: {
1017 /* Get split pointer stored in code */
1018 unsigned int temp1 = (loc[0] & 0xFFFF) << 16 |
1021 /* Add reloc offset */
1024 /* Store back into code */
1025 loc[0] = (loc[0] & 0xFFFF0000) | temp1 >> 16;
1026 loc[1] = (loc[1] & 0xFFFF0000) | (temp1 & 0xFFFF);
1031 case R_MICROBLAZE_32_PCREL_LO:
1032 case R_MICROBLAZE_32_LO:
1033 case R_MICROBLAZE_SRO32:
1034 case R_MICROBLAZE_SRW32:
1035 ret = obj_reloc_unhandled;
1038 #elif defined(__mc68000__)
1049 ret = obj_reloc_overflow;
1056 ret = obj_reloc_overflow;
1063 if ((ElfW(Sword))v > 0x7f ||
1064 (ElfW(Sword))v < -(ElfW(Sword))0x80) {
1065 ret = obj_reloc_overflow;
1072 if ((ElfW(Sword))v > 0x7fff ||
1073 (ElfW(Sword))v < -(ElfW(Sword))0x8000) {
1074 ret = obj_reloc_overflow;
1080 *(int *)loc = v - dot;
1083 case R_68K_GLOB_DAT:
1084 case R_68K_JMP_SLOT:
1088 case R_68K_RELATIVE:
1089 *(int *)loc += f->baseaddr;
1095 # ifdef R_68K_GOTOFF
1101 #elif defined(__mips__)
1112 ret = obj_reloc_dangerous;
1113 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
1114 ret = obj_reloc_overflow;
1116 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
1122 struct mips_hi16 *n;
1124 /* We cannot relocate this one now because we don't know the value
1125 of the carry we need to add. Save the information, and let LO16
1126 do the actual relocation. */
1127 n = xmalloc(sizeof *n);
1130 n->next = ifile->mips_hi16_list;
1131 ifile->mips_hi16_list = n;
1137 unsigned long insnlo = *loc;
1138 ElfW(Addr) val, vallo;
1140 /* Sign extend the addend we extract from the lo insn. */
1141 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
1143 if (ifile->mips_hi16_list != NULL) {
1144 struct mips_hi16 *l;
1146 l = ifile->mips_hi16_list;
1148 struct mips_hi16 *next;
1151 /* Do the HI16 relocation. Note that we actually don't
1152 need to know anything about the LO16 itself, except where
1153 to find the low 16 bits of the addend needed by the LO16. */
1156 ((insn & 0xffff) << 16) +
1160 /* Account for the sign extension that will happen in the
1167 insn = (insn & ~0xffff) | val;
1175 ifile->mips_hi16_list = NULL;
1178 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
1180 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
1185 #elif defined(__nios2__)
1190 case R_NIOS2_BFD_RELOC_32:
1194 case R_NIOS2_BFD_RELOC_16:
1196 ret = obj_reloc_overflow;
1201 case R_NIOS2_BFD_RELOC_8:
1203 ret = obj_reloc_overflow;
1212 if ((Elf32_Sword)v > 0x7fff ||
1213 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1214 ret = obj_reloc_overflow;
1218 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1228 ret = obj_reloc_overflow;
1232 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1237 case R_NIOS2_PCREL16:
1242 if ((Elf32_Sword)v > 0x7fff ||
1243 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1244 ret = obj_reloc_overflow;
1248 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1254 Elf32_Addr word, gp;
1256 gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp"));
1258 if ((Elf32_Sword)v > 0x7fff ||
1259 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1260 ret = obj_reloc_overflow;
1264 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1268 case R_NIOS2_CALL26:
1270 ret = obj_reloc_dangerous;
1271 if ((v >> 28) != (dot >> 28))
1272 ret = obj_reloc_overflow;
1273 *loc = (*loc & 0x3f) | ((v >> 2) << 6);
1281 ret = obj_reloc_overflow;
1284 word = *loc & ~0x7c0;
1285 *loc = word | ((v & 0x1f) << 6);
1294 ret = obj_reloc_overflow;
1297 word = *loc & ~0xfc0;
1298 *loc = word | ((v & 0x3f) << 6);
1307 ret = obj_reloc_overflow;
1310 word = *loc & ~0x3fc0;
1311 *loc = word | ((v & 0xff) << 6);
1320 *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) |
1330 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1335 case R_NIOS2_HIADJ16:
1337 Elf32_Addr word1, word2;
1340 word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
1341 *loc = ((((word1 >> 22) << 16) | word2) << 6) |
1346 #elif defined(__powerpc64__)
1347 /* PPC64 needs a 2.6 kernel, 2.4 module relocation irrelevant */
1349 #elif defined(__powerpc__)
1351 case R_PPC_ADDR16_HA:
1352 *(unsigned short *)loc = (v + 0x8000) >> 16;
1355 case R_PPC_ADDR16_HI:
1356 *(unsigned short *)loc = v >> 16;
1359 case R_PPC_ADDR16_LO:
1360 *(unsigned short *)loc = v;
1374 #elif defined(__s390__)
1377 *(unsigned int *) loc += v;
1380 *(unsigned short *) loc += v;
1383 *(unsigned char *) loc += v;
1387 *(unsigned int *) loc += v - dot;
1390 *(unsigned short *) loc += (v - dot) >> 1;
1393 *(unsigned short *) loc += v - dot;
1397 case R_390_PLT16DBL:
1398 /* find the plt entry and initialize it. */
1399 pe = (struct arch_single_entry *) &isym->pltent;
1400 if (pe->inited == 0) {
1401 ip = (unsigned long *)(ifile->plt->contents + pe->offset);
1402 ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */
1404 if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1411 /* Insert relative distance to target. */
1412 v = plt + pe->offset - dot;
1413 if (ELF_R_TYPE(rel->r_info) == R_390_PLT32)
1414 *(unsigned int *) loc = (unsigned int) v;
1415 else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1416 *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1);
1419 case R_390_GLOB_DAT:
1420 case R_390_JMP_SLOT:
1424 case R_390_RELATIVE:
1425 *loc += f->baseaddr;
1429 *(unsigned long *) loc += got - dot;
1435 if (!isym->gotent.inited)
1437 isym->gotent.inited = 1;
1438 *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v;
1440 if (ELF_R_TYPE(rel->r_info) == R_390_GOT12)
1441 *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff;
1442 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16)
1443 *(unsigned short *) loc += isym->gotent.offset;
1444 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32)
1445 *(unsigned int *) loc += isym->gotent.offset;
1448 # ifndef R_390_GOTOFF32
1449 # define R_390_GOTOFF32 R_390_GOTOFF
1451 case R_390_GOTOFF32:
1455 #elif defined(__sh__)
1478 *loc = f->baseaddr + rel->r_addend;
1482 *loc = got - dot + rel->r_addend;
1492 # if defined(__SH5__)
1493 case R_SH_IMM_MEDLOW16:
1494 case R_SH_IMM_LOW16:
1498 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16)
1502 * movi and shori have the format:
1504 * | op | imm | reg | reserved |
1505 * 31..26 25..10 9.. 4 3 .. 0
1507 * so we simply mask and or in imm.
1509 word = *loc & ~0x3fffc00;
1510 word |= (v & 0xffff) << 10;
1517 case R_SH_IMM_MEDLOW16_PCREL:
1518 case R_SH_IMM_LOW16_PCREL:
1522 word = *loc & ~0x3fffc00;
1526 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16_PCREL)
1529 word |= (v & 0xffff) << 10;
1535 # endif /* __SH5__ */
1537 #elif defined(__v850e__)
1543 /* We write two shorts instead of a long because even
1544 32-bit insns only need half-word alignment, but
1545 32-bit data needs to be long-word aligned. */
1546 v += ((unsigned short *)loc)[0];
1547 v += ((unsigned short *)loc)[1] << 16;
1548 ((unsigned short *)loc)[0] = v & 0xffff;
1549 ((unsigned short *)loc)[1] = (v >> 16) & 0xffff;
1552 case R_V850_22_PCREL:
1555 #elif defined(__x86_64__)
1565 *(unsigned int *) loc += v;
1568 ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */
1569 /* error("Possibly is module compiled without -mcmodel=kernel!"); */
1574 *(signed int *) loc += v;
1578 *(unsigned short *) loc += v;
1582 *(unsigned char *) loc += v;
1586 *(unsigned int *) loc += v - dot;
1590 *(unsigned short *) loc += v - dot;
1594 *(unsigned char *) loc += v - dot;
1597 case R_X86_64_GLOB_DAT:
1598 case R_X86_64_JUMP_SLOT:
1602 case R_X86_64_RELATIVE:
1603 *loc += f->baseaddr;
1606 case R_X86_64_GOT32:
1607 case R_X86_64_GOTPCREL:
1610 if (!isym->gotent.reloc_done)
1612 isym->gotent.reloc_done = 1;
1613 *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
1615 /* XXX are these really correct? */
1616 if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL)
1617 *(unsigned int *) loc += v + isym->gotent.offset;
1619 *loc += isym->gotent.offset;
1624 # warning "no idea how to handle relocations on your arch"
1628 printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info));
1629 ret = obj_reloc_unhandled;
1632 #if defined(USE_PLT_ENTRIES)
1636 /* find the plt entry and initialize it if necessary */
1638 #if defined(USE_PLT_LIST)
1639 for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend;)
1646 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1648 /* generate some machine code */
1650 #if defined(__arm__)
1651 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1652 ip[1] = v; /* sym@ */
1654 #if defined(__powerpc__)
1655 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1656 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1657 ip[2] = 0x7d6903a6; /* mtctr r11 */
1658 ip[3] = 0x4e800420; /* bctr */
1660 #if defined(__v850e__)
1661 /* We have to trash a register, so we assume that any control
1662 transfer more than 21-bits away must be a function call
1663 (so we can use a call-clobbered register). */
1664 ip[0] = 0x0621 + ((v & 0xffff) << 16); /* mov sym, r1 ... */
1665 ip[1] = ((v >> 16) & 0xffff) + 0x610000; /* ...; jmp r1 */
1670 /* relative distance to target */
1672 /* if the target is too far away.... */
1673 #if defined(__arm__) || defined(__powerpc__)
1674 if ((int)v < -0x02000000 || (int)v >= 0x02000000)
1675 #elif defined(__v850e__)
1676 if ((ElfW(Sword))v > 0x1fffff || (ElfW(Sword))v < (ElfW(Sword))-0x200000)
1678 /* go via the plt */
1679 v = plt + pe->offset - dot;
1681 #if defined(__v850e__)
1686 ret = obj_reloc_dangerous;
1688 /* merge the offset into the instruction. */
1689 #if defined(__arm__)
1690 /* Convert to words. */
1693 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1695 #if defined(__powerpc__)
1696 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1698 #if defined(__v850e__)
1699 /* We write two shorts instead of a long because even 32-bit insns
1700 only need half-word alignment, but the 32-bit data write needs
1701 to be long-word aligned. */
1702 ((unsigned short *)loc)[0] =
1703 (*(unsigned short *)loc & 0xffc0) /* opcode + reg */
1704 | ((v >> 16) & 0x3f); /* offs high part */
1705 ((unsigned short *)loc)[1] =
1706 (v & 0xffff); /* offs low part */
1709 #endif /* USE_PLT_ENTRIES */
1711 #if defined(USE_GOT_ENTRIES)
1714 /* needs an entry in the .got: set it, once */
1715 if (!isym->gotent.inited) {
1716 isym->gotent.inited = 1;
1717 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1719 /* make the reloc with_respect_to_.got */
1721 *loc += isym->gotent.offset + rel->r_addend;
1722 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1723 *loc += isym->gotent.offset;
1727 #endif /* USE_GOT_ENTRIES */
1734 #if defined(USE_LIST)
1736 static int arch_list_add(ElfW(RelM) *rel, struct arch_list_entry **list,
1737 int offset, int size)
1739 struct arch_list_entry *pe;
1741 for (pe = *list; pe != NULL; pe = pe->next) {
1742 if (pe->addend == rel->r_addend) {
1748 pe = xmalloc(sizeof(struct arch_list_entry));
1750 pe->addend = rel->r_addend;
1751 pe->offset = offset;
1761 #if defined(USE_SINGLE)
1763 static int arch_single_init(/*ElfW(RelM) *rel,*/ struct arch_single_entry *single,
1764 int offset, int size)
1766 if (single->allocated == 0) {
1767 single->allocated = 1;
1768 single->offset = offset;
1777 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
1779 static struct obj_section *arch_xsect_init(struct obj_file *f, const char *name,
1780 int offset, int size)
1782 struct obj_section *myrelsec = obj_find_section(f, name);
1789 obj_extend_section(myrelsec, offset);
1791 myrelsec = obj_create_alloced_section(f, name,
1800 static void arch_create_got(struct obj_file *f)
1802 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
1803 struct arch_file *ifile = (struct arch_file *) f;
1805 #if defined(USE_GOT_ENTRIES)
1806 int got_offset = 0, got_needed = 0, got_allocate;
1808 #if defined(USE_PLT_ENTRIES)
1809 int plt_offset = 0, plt_needed = 0, plt_allocate;
1811 struct obj_section *relsec, *symsec, *strsec;
1812 ElfW(RelM) *rel, *relend;
1813 ElfW(Sym) *symtab, *extsym;
1814 const char *strtab, *name;
1815 struct arch_symbol *intsym;
1817 for (i = 0; i < f->header.e_shnum; ++i) {
1818 relsec = f->sections[i];
1819 if (relsec->header.sh_type != SHT_RELM)
1822 symsec = f->sections[relsec->header.sh_link];
1823 strsec = f->sections[symsec->header.sh_link];
1825 rel = (ElfW(RelM) *) relsec->contents;
1826 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1827 symtab = (ElfW(Sym) *) symsec->contents;
1828 strtab = (const char *) strsec->contents;
1830 for (; rel < relend; ++rel) {
1831 extsym = &symtab[ELF_R_SYM(rel->r_info)];
1833 #if defined(USE_GOT_ENTRIES)
1836 #if defined(USE_PLT_ENTRIES)
1840 switch (ELF_R_TYPE(rel->r_info)) {
1841 #if defined(__arm__)
1856 #elif defined(__i386__)
1866 #elif defined(__powerpc__)
1871 #elif defined(__mc68000__)
1882 #elif defined(__sh__)
1892 #elif defined(__v850e__)
1893 case R_V850_22_PCREL:
1902 if (extsym->st_name != 0) {
1903 name = strtab + extsym->st_name;
1905 name = f->sections[extsym->st_shndx]->name;
1907 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1908 #if defined(USE_GOT_ENTRIES)
1910 got_offset += arch_single_init(
1911 /*rel,*/ &intsym->gotent,
1912 got_offset, GOT_ENTRY_SIZE);
1917 #if defined(USE_PLT_ENTRIES)
1919 #if defined(USE_PLT_LIST)
1920 plt_offset += arch_list_add(
1921 rel, &intsym->pltent,
1922 plt_offset, PLT_ENTRY_SIZE);
1924 plt_offset += arch_single_init(
1925 /*rel,*/ &intsym->pltent,
1926 plt_offset, PLT_ENTRY_SIZE);
1934 #if defined(USE_GOT_ENTRIES)
1936 ifile->got = arch_xsect_init(f, ".got", got_offset,
1941 #if defined(USE_PLT_ENTRIES)
1943 ifile->plt = arch_xsect_init(f, ".plt", plt_offset,
1948 #endif /* defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES) */
1951 /*======================================================================*/
1953 /* Standard ELF hash function. */
1954 static unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1956 unsigned long h = 0;
1963 g = (h & 0xf0000000);
1973 static unsigned long obj_elf_hash(const char *name)
1975 return obj_elf_hash_n(name, strlen(name));
1978 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
1979 /* String comparison for non-co-versioned kernel and module. */
1981 static int ncv_strcmp(const char *a, const char *b)
1983 size_t alen = strlen(a), blen = strlen(b);
1985 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
1986 return strncmp(a, b, alen);
1987 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
1988 return strncmp(a, b, blen);
1990 return strcmp(a, b);
1993 /* String hashing for non-co-versioned kernel and module. Here
1994 we are simply forced to drop the crc from the hash. */
1996 static unsigned long ncv_symbol_hash(const char *str)
1998 size_t len = strlen(str);
1999 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
2001 return obj_elf_hash_n(str, len);
2005 obj_set_symbol_compare(struct obj_file *f,
2006 int (*cmp) (const char *, const char *),
2007 unsigned long (*hash) (const char *))
2010 f->symbol_cmp = cmp;
2012 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
2015 f->symbol_hash = hash;
2017 memcpy(tmptab, f->symtab, sizeof(tmptab));
2018 memset(f->symtab, 0, sizeof(f->symtab));
2020 for (i = 0; i < HASH_BUCKETS; ++i)
2021 for (sym = tmptab[i]; sym; sym = next) {
2022 unsigned long h = hash(sym->name) % HASH_BUCKETS;
2024 sym->next = f->symtab[h];
2030 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
2032 static struct obj_symbol *
2033 obj_add_symbol(struct obj_file *f, const char *name,
2034 unsigned long symidx, int info,
2035 int secidx, ElfW(Addr) value,
2038 struct obj_symbol *sym;
2039 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2040 int n_type = ELF_ST_TYPE(info);
2041 int n_binding = ELF_ST_BIND(info);
2043 for (sym = f->symtab[hash]; sym; sym = sym->next) {
2044 if (f->symbol_cmp(sym->name, name) == 0) {
2045 int o_secidx = sym->secidx;
2046 int o_info = sym->info;
2047 int o_type = ELF_ST_TYPE(o_info);
2048 int o_binding = ELF_ST_BIND(o_info);
2050 /* A redefinition! Is it legal? */
2052 if (secidx == SHN_UNDEF)
2054 else if (o_secidx == SHN_UNDEF)
2056 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
2057 /* Cope with local and global symbols of the same name
2058 in the same object file, as might have been created
2059 by ld -r. The only reason locals are now seen at this
2060 level at all is so that we can do semi-sensible things
2063 struct obj_symbol *nsym, **p;
2065 nsym = arch_new_symbol();
2066 nsym->next = sym->next;
2069 /* Excise the old (local) symbol from the hash chain. */
2070 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
2074 } else if (n_binding == STB_LOCAL) {
2075 /* Another symbol of the same name has already been defined.
2076 Just add this to the local table. */
2077 sym = arch_new_symbol();
2080 f->local_symtab[symidx] = sym;
2082 } else if (n_binding == STB_WEAK)
2084 else if (o_binding == STB_WEAK)
2086 /* Don't unify COMMON symbols with object types the programmer
2088 else if (secidx == SHN_COMMON
2089 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
2091 else if (o_secidx == SHN_COMMON
2092 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
2095 /* Don't report an error if the symbol is coming from
2096 the kernel or some external module. */
2097 if (secidx <= SHN_HIRESERVE)
2098 bb_error_msg("%s multiply defined", name);
2104 /* Completely new symbol. */
2105 sym = arch_new_symbol();
2106 sym->next = f->symtab[hash];
2107 f->symtab[hash] = sym;
2109 if (ELF_ST_BIND(info) == STB_LOCAL && symidx != (unsigned long)(-1)) {
2110 if (symidx >= f->local_symtab_size)
2111 bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
2112 name, (long) symidx, (long) f->local_symtab_size);
2114 f->local_symtab[symidx] = sym;
2121 sym->secidx = secidx;
2127 static struct obj_symbol *
2128 obj_find_symbol(struct obj_file *f, const char *name)
2130 struct obj_symbol *sym;
2131 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2133 for (sym = f->symtab[hash]; sym; sym = sym->next)
2134 if (f->symbol_cmp(sym->name, name) == 0)
2140 static ElfW(Addr) obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2143 if (sym->secidx >= SHN_LORESERVE)
2146 return sym->value + f->sections[sym->secidx]->header.sh_addr;
2148 /* As a special case, a NULL sym has value zero. */
2153 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
2155 int i, n = f->header.e_shnum;
2157 for (i = 0; i < n; ++i)
2158 if (strcmp(f->sections[i]->name, name) == 0)
2159 return f->sections[i];
2164 static int obj_load_order_prio(struct obj_section *a)
2166 unsigned long af, ac;
2168 af = a->header.sh_flags;
2171 if (a->name[0] != '.' || strlen(a->name) != 10 ||
2172 strcmp(a->name + 5, ".init"))
2176 if (!(af & SHF_WRITE))
2178 if (af & SHF_EXECINSTR)
2180 if (a->header.sh_type != SHT_NOBITS)
2187 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
2189 struct obj_section **p;
2190 int prio = obj_load_order_prio(sec);
2191 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
2192 if (obj_load_order_prio(*p) < prio)
2194 sec->load_next = *p;
2198 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2200 unsigned long align,
2203 int newidx = f->header.e_shnum++;
2204 struct obj_section *sec;
2206 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2207 f->sections[newidx] = sec = arch_new_section();
2209 sec->header.sh_type = SHT_PROGBITS;
2210 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2211 sec->header.sh_size = size;
2212 sec->header.sh_addralign = align;
2216 sec->contents = xmalloc(size);
2218 obj_insert_section_load_order(f, sec);
2223 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
2225 unsigned long align,
2228 int newidx = f->header.e_shnum++;
2229 struct obj_section *sec;
2231 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2232 f->sections[newidx] = sec = arch_new_section();
2234 sec->header.sh_type = SHT_PROGBITS;
2235 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2236 sec->header.sh_size = size;
2237 sec->header.sh_addralign = align;
2241 sec->contents = xmalloc(size);
2243 sec->load_next = f->load_order;
2244 f->load_order = sec;
2245 if (f->load_order_search_start == &f->load_order)
2246 f->load_order_search_start = &sec->load_next;
2251 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
2253 unsigned long oldsize = sec->header.sh_size;
2255 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
2257 return sec->contents + oldsize;
2261 /* Conditionally add the symbols from the given symbol set to the
2265 add_symbols_from( struct obj_file *f,
2266 int idx, struct new_module_symbol *syms, size_t nsyms)
2268 struct new_module_symbol *s;
2271 #ifdef SYMBOL_PREFIX
2273 size_t name_alloced_size = 0;
2275 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
2278 gpl = obj_gpl_license(f, NULL) == 0;
2280 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
2281 /* Only add symbols that are already marked external.
2282 If we override locals we may cause problems for
2283 argument initialization. We will also create a false
2284 dependency on the module. */
2285 struct obj_symbol *sym;
2288 /* GPL licensed modules can use symbols exported with
2289 * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the
2290 * exported names. Non-GPL modules never see any GPLONLY_
2291 * symbols so they cannot fudge it by adding the prefix on
2294 if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) {
2295 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
2302 name = (char *)s->name;
2304 #ifdef SYMBOL_PREFIX
2305 /* Prepend SYMBOL_PREFIX to the symbol's name (the
2306 kernel exports `C names', but module object files
2307 reference `linker names'). */
2308 size_t extra = sizeof SYMBOL_PREFIX;
2309 size_t name_size = strlen(name) + extra;
2310 if (name_size > name_alloced_size) {
2311 name_alloced_size = name_size * 2;
2312 name_buf = alloca(name_alloced_size);
2314 strcpy(name_buf, SYMBOL_PREFIX);
2315 strcpy(name_buf + extra - 1, name);
2317 #endif /* SYMBOL_PREFIX */
2319 sym = obj_find_symbol(f, name);
2320 if (sym && !(ELF_ST_BIND(sym->info) == STB_LOCAL)) {
2321 #ifdef SYMBOL_PREFIX
2322 /* Put NAME_BUF into more permanent storage. */
2323 name = xmalloc(name_size);
2324 strcpy(name, name_buf);
2326 sym = obj_add_symbol(f, name, -1,
2327 ELF_ST_INFO(STB_GLOBAL,
2330 /* Did our symbol just get installed? If so, mark the
2331 module as "used". */
2332 if (sym->secidx == idx)
2340 static void add_kernel_symbols(struct obj_file *f)
2342 struct external_module *m;
2345 /* Add module symbols first. */
2347 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m) {
2349 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms)
2356 n_ext_modules_used = nused;
2358 /* And finally the symbols from the kernel proper. */
2361 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
2364 static char *get_modinfo_value(struct obj_file *f, const char *key)
2366 struct obj_section *sec;
2367 char *p, *v, *n, *ep;
2368 size_t klen = strlen(key);
2370 sec = obj_find_section(f, ".modinfo");
2374 ep = p + sec->header.sh_size;
2377 n = strchr(p, '\0');
2379 if (p + klen == v && strncmp(p, key, klen) == 0)
2382 if (p + klen == n && strcmp(p, key) == 0)
2392 /*======================================================================*/
2393 /* Functions relating to module loading after 2.1.18. */
2396 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2399 char *p, *q, *key, *sym_name;
2400 struct obj_symbol *sym;
2401 char *contents, *loc;
2411 key = alloca(q - p + 6);
2412 memcpy(key, "parm_", 5);
2413 memcpy(key + 5, p, q - p);
2416 p = get_modinfo_value(f, key);
2419 bb_error_msg_and_die("invalid parameter %s", key);
2422 #ifdef SYMBOL_PREFIX
2423 sym_name = alloca(strlen(key) + sizeof SYMBOL_PREFIX);
2424 strcpy(sym_name, SYMBOL_PREFIX);
2425 strcat(sym_name, key);
2429 sym = obj_find_symbol(f, sym_name);
2431 /* Also check that the parameter was not resolved from the kernel. */
2432 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2433 bb_error_msg_and_die("symbol for parameter %s not found", key);
2437 min = strtoul(p, &p, 10);
2439 max = strtoul(p + 1, &p, 10);
2445 contents = f->sections[sym->secidx]->contents;
2446 loc = contents + sym->value;
2450 if ((*p == 's') || (*p == 'c')) {
2453 /* Do C quoting if we begin with a ", else slurp the lot. */
2457 str = alloca(strlen(q));
2458 for (r = str, q++; *q != '"'; ++q, ++r) {
2460 bb_error_msg_and_die("improperly terminated string argument for %s",
2496 if (q[1] >= '0' && q[1] <= '7') {
2497 c = (c * 8) + *++q - '0';
2498 if (q[1] >= '0' && q[1] <= '7')
2499 c = (c * 8) + *++q - '0';
2517 /* In this case, the string is not quoted. We will break
2518 it using the coma (like for ints). If the user wants to
2519 include comas in a string, he just has to quote it */
2521 /* Search the next coma */
2525 if (r != (char *) NULL) {
2526 /* Recopy the current field */
2527 str = alloca(r - q + 1);
2528 memcpy(str, q, r - q);
2530 /* I don't know if it is useful, as the previous case
2531 doesn't nul terminate the string ??? */
2534 /* Keep next fields */
2545 obj_string_patch(f, sym->secidx, loc - contents, str);
2546 loc += tgt_sizeof_char_p;
2548 /* Array of chars (in fact, matrix!) */
2549 unsigned long charssize; /* size of each member */
2551 /* Get the size of each member */
2552 /* Probably we should do that outside the loop ? */
2553 if (!isdigit(*(p + 1))) {
2554 bb_error_msg_and_die("parameter type 'c' for %s must be followed by"
2555 " the maximum size", key);
2557 charssize = strtoul(p + 1, (char **) NULL, 10);
2560 if (strlen(str) >= charssize) {
2561 bb_error_msg_and_die("string too long for %s (max %ld)", key,
2565 /* Copy to location */
2566 strcpy((char *) loc, str);
2570 long v = strtoul(q, &q, 0);
2577 loc += tgt_sizeof_short;
2581 loc += tgt_sizeof_int;
2585 loc += tgt_sizeof_long;
2589 bb_error_msg_and_die("unknown parameter type '%c' for %s", *p, key);
2602 goto retry_end_of_value;
2606 bb_error_msg_and_die("too many values for %s (max %d)", key, max);
2612 bb_error_msg_and_die("invalid argument syntax for %s", key);
2617 bb_error_msg_and_die("too few values for %s (min %d)", key, min);
2625 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
2626 static int new_is_module_checksummed(struct obj_file *f)
2628 const char *p = get_modinfo_value(f, "using_checksums");
2634 /* Get the module's kernel version in the canonical integer form. */
2637 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2642 p = get_modinfo_value(f, "kernel_version");
2645 safe_strncpy(str, p, STRVERSIONLEN);
2647 a = strtoul(p, &p, 10);
2650 b = strtoul(p + 1, &p, 10);
2653 c = strtoul(p + 1, &q, 10);
2657 return a << 16 | b << 8 | c;
2660 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
2663 /* Fetch the loaded modules, and all currently exported symbols. */
2665 static void new_get_kernel_symbols(void)
2667 char *module_names, *mn;
2668 struct external_module *modules, *m;
2669 struct new_module_symbol *syms, *s;
2670 size_t ret, bufsize, nmod, nsyms, i, j;
2672 /* Collect the loaded modules. */
2675 module_names = xmalloc(bufsize);
2678 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2679 if (errno == ENOSPC && bufsize < ret) {
2681 module_names = xrealloc(module_names, bufsize);
2682 goto retry_modules_load;
2684 bb_perror_msg_and_die("QM_MODULES");
2687 n_ext_modules = nmod = ret;
2689 /* Collect the modules' symbols. */
2692 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2693 memset(modules, 0, nmod * sizeof(*modules));
2694 for (i = 0, mn = module_names, m = modules;
2695 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2696 struct new_module_info info;
2698 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2699 if (errno == ENOENT) {
2700 /* The module was removed out from underneath us. */
2703 bb_perror_msg_and_die("query_module: QM_INFO: %s", mn);
2707 syms = xmalloc(bufsize);
2709 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2713 syms = xrealloc(syms, bufsize);
2714 goto retry_mod_sym_load;
2716 /* The module was removed out from underneath us. */
2719 bb_perror_msg_and_die("query_module: QM_SYMBOLS: %s", mn);
2725 m->addr = info.addr;
2729 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2730 s->name += (unsigned long) syms;
2735 /* Collect the kernel's symbols. */
2737 syms = xmalloc(bufsize = 16 * 1024);
2738 retry_kern_sym_load:
2739 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2740 if (errno == ENOSPC && bufsize < ret) {
2741 syms = xrealloc(syms, bufsize = ret);
2742 goto retry_kern_sym_load;
2744 bb_perror_msg_and_die("kernel: QM_SYMBOLS");
2746 nksyms = nsyms = ret;
2749 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2750 s->name += (unsigned long) syms;
2755 /* Return the kernel symbol checksum version, or zero if not used. */
2757 static int new_is_kernel_checksummed(void)
2759 struct new_module_symbol *s;
2762 /* Using_Versions is not the first symbol, but it should be in there. */
2764 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2765 if (strcmp((char *) s->name, "Using_Versions") == 0)
2772 static void new_create_this_module(struct obj_file *f, const char *m_name)
2774 struct obj_section *sec;
2776 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2777 sizeof(struct new_module));
2778 memset(sec->contents, 0, sizeof(struct new_module));
2780 obj_add_symbol(f, SPFX "__this_module", -1,
2781 ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0,
2782 sizeof(struct new_module));
2784 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2788 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
2789 /* add an entry to the __ksymtab section, creating it if necessary */
2790 static void new_add_ksymtab(struct obj_file *f, struct obj_symbol *sym)
2792 struct obj_section *sec;
2795 /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section.
2796 * If __ksymtab is defined but not marked alloc, x out the first character
2797 * (no obj_delete routine) and create a new __ksymtab with the correct
2800 sec = obj_find_section(f, "__ksymtab");
2801 if (sec && !(sec->header.sh_flags & SHF_ALLOC)) {
2802 *((char *)(sec->name)) = 'x'; /* override const */
2806 sec = obj_create_alloced_section(f, "__ksymtab",
2807 tgt_sizeof_void_p, 0);
2810 sec->header.sh_flags |= SHF_ALLOC;
2811 /* Empty section might be byte-aligned */
2812 sec->header.sh_addralign = tgt_sizeof_void_p;
2813 ofs = sec->header.sh_size;
2814 obj_symbol_patch(f, sec->idx, ofs, sym);
2815 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name);
2816 obj_extend_section(sec, 2 * tgt_sizeof_char_p);
2818 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
2820 static int new_create_module_ksymtab(struct obj_file *f)
2822 struct obj_section *sec;
2825 /* We must always add the module references. */
2827 if (n_ext_modules_used) {
2828 struct new_module_ref *dep;
2829 struct obj_symbol *tm;
2831 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2832 (sizeof(struct new_module_ref)
2833 * n_ext_modules_used));
2837 tm = obj_find_symbol(f, SPFX "__this_module");
2838 dep = (struct new_module_ref *) sec->contents;
2839 for (i = 0; i < n_ext_modules; ++i)
2840 if (ext_modules[i].used) {
2841 dep->dep = ext_modules[i].addr;
2842 obj_symbol_patch(f, sec->idx,
2843 (char *) &dep->ref - sec->contents, tm);
2849 if (!flag_noexport && !obj_find_section(f, "__ksymtab")) {
2853 sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0);
2855 /* We don't want to export symbols residing in sections that
2856 aren't loaded. There are a number of these created so that
2857 we make sure certain module options don't appear twice. */
2859 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2861 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2863 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2864 struct obj_symbol *sym;
2865 for (sym = f->symtab[i]; sym; sym = sym->next)
2866 if (ELF_ST_BIND(sym->info) != STB_LOCAL
2867 && sym->secidx <= SHN_HIRESERVE
2868 && (sym->secidx >= SHN_LORESERVE
2869 || loaded[sym->secidx])) {
2870 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2872 obj_symbol_patch(f, sec->idx, ofs, sym);
2873 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2880 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2888 new_init_module(const char *m_name, struct obj_file *f, unsigned long m_size)
2890 struct new_module *module;
2891 struct obj_section *sec;
2896 sec = obj_find_section(f, ".this");
2897 if (!sec || !sec->contents) {
2898 bb_perror_msg_and_die("corrupt module %s?",m_name);
2900 module = (struct new_module *) sec->contents;
2901 m_addr = sec->header.sh_addr;
2903 module->size_of_struct = sizeof(*module);
2904 module->size = m_size;
2905 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2907 sec = obj_find_section(f, "__ksymtab");
2908 if (sec && sec->header.sh_size) {
2909 module->syms = sec->header.sh_addr;
2910 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2913 if (n_ext_modules_used) {
2914 sec = obj_find_section(f, ".kmodtab");
2915 module->deps = sec->header.sh_addr;
2916 module->ndeps = n_ext_modules_used;
2920 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "init_module"));
2922 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "cleanup_module"));
2924 sec = obj_find_section(f, "__ex_table");
2926 module->ex_table_start = sec->header.sh_addr;
2927 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2930 sec = obj_find_section(f, ".text.init");
2932 module->runsize = sec->header.sh_addr - m_addr;
2934 sec = obj_find_section(f, ".data.init");
2936 if (!module->runsize ||
2937 module->runsize > sec->header.sh_addr - m_addr)
2938 module->runsize = sec->header.sh_addr - m_addr;
2940 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2941 if (sec && sec->header.sh_size) {
2942 module->archdata_start = (void*)sec->header.sh_addr;
2943 module->archdata_end = module->archdata_start + sec->header.sh_size;
2945 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2946 if (sec && sec->header.sh_size) {
2947 module->kallsyms_start = (void*)sec->header.sh_addr;
2948 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2951 /* Whew! All of the initialization is complete. Collect the final
2952 module image and give it to the kernel. */
2954 image = xmalloc(m_size);
2955 obj_create_image(f, image);
2957 ret = init_module(m_name, (struct new_module *) image);
2959 bb_perror_msg("init_module: %s", m_name);
2967 /*======================================================================*/
2970 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2973 struct obj_string_patch *p;
2974 struct obj_section *strsec;
2975 size_t len = strlen(string) + 1;
2978 p = xmalloc(sizeof(*p));
2979 p->next = f->string_patches;
2980 p->reloc_secidx = secidx;
2981 p->reloc_offset = offset;
2982 f->string_patches = p;
2984 strsec = obj_find_section(f, ".kstrtab");
2985 if (strsec == NULL) {
2986 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
2987 p->string_offset = 0;
2988 loc = strsec->contents;
2990 p->string_offset = strsec->header.sh_size;
2991 loc = obj_extend_section(strsec, len);
2993 memcpy(loc, string, len);
2997 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2998 struct obj_symbol *sym)
3000 struct obj_symbol_patch *p;
3002 p = xmalloc(sizeof(*p));
3003 p->next = f->symbol_patches;
3004 p->reloc_secidx = secidx;
3005 p->reloc_offset = offset;
3007 f->symbol_patches = p;
3010 static void obj_check_undefineds(struct obj_file *f)
3014 for (i = 0; i < HASH_BUCKETS; ++i) {
3015 struct obj_symbol *sym;
3016 for (sym = f->symtab[i]; sym; sym = sym->next)
3017 if (sym->secidx == SHN_UNDEF) {
3018 if (ELF_ST_BIND(sym->info) == STB_WEAK) {
3019 sym->secidx = SHN_ABS;
3023 bb_error_msg_and_die("unresolved symbol %s", sym->name);
3029 static void obj_allocate_commons(struct obj_file *f)
3031 struct common_entry {
3032 struct common_entry *next;
3033 struct obj_symbol *sym;
3034 } *common_head = NULL;
3038 for (i = 0; i < HASH_BUCKETS; ++i) {
3039 struct obj_symbol *sym;
3040 for (sym = f->symtab[i]; sym; sym = sym->next)
3041 if (sym->secidx == SHN_COMMON) {
3042 /* Collect all COMMON symbols and sort them by size so as to
3043 minimize space wasted by alignment requirements. */
3045 struct common_entry **p, *n;
3046 for (p = &common_head; *p; p = &(*p)->next)
3047 if (sym->size <= (*p)->sym->size)
3050 n = alloca(sizeof(*n));
3058 for (i = 1; i < f->local_symtab_size; ++i) {
3059 struct obj_symbol *sym = f->local_symtab[i];
3060 if (sym && sym->secidx == SHN_COMMON) {
3061 struct common_entry **p, *n;
3062 for (p = &common_head; *p; p = &(*p)->next)
3063 if (sym == (*p)->sym)
3065 else if (sym->size < (*p)->sym->size) {
3066 n = alloca(sizeof(*n));
3076 /* Find the bss section. */
3077 for (i = 0; i < f->header.e_shnum; ++i)
3078 if (f->sections[i]->header.sh_type == SHT_NOBITS)
3081 /* If for some reason there hadn't been one, create one. */
3082 if (i == f->header.e_shnum) {
3083 struct obj_section *sec;
3085 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
3086 f->sections[i] = sec = arch_new_section();
3087 f->header.e_shnum = i + 1;
3089 sec->header.sh_type = SHT_PROGBITS;
3090 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
3095 /* Allocate the COMMONS. */
3097 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
3098 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
3099 struct common_entry *c;
3101 for (c = common_head; c; c = c->next) {
3102 ElfW(Addr) align = c->sym->value;
3104 if (align > max_align)
3106 if (bss_size & (align - 1))
3107 bss_size = (bss_size | (align - 1)) + 1;
3110 c->sym->value = bss_size;
3112 bss_size += c->sym->size;
3115 f->sections[i]->header.sh_size = bss_size;
3116 f->sections[i]->header.sh_addralign = max_align;
3120 /* For the sake of patch relocation and parameter initialization,
3121 allocate zeroed data for NOBITS sections now. Note that after
3122 this we cannot assume NOBITS are really empty. */
3123 for (i = 0; i < f->header.e_shnum; ++i) {
3124 struct obj_section *s = f->sections[i];
3125 if (s->header.sh_type == SHT_NOBITS) {
3126 if (s->header.sh_size != 0)
3127 s->contents = memset(xmalloc(s->header.sh_size),
3128 0, s->header.sh_size);
3132 s->header.sh_type = SHT_PROGBITS;
3137 static unsigned long obj_load_size(struct obj_file *f)
3139 unsigned long dot = 0;
3140 struct obj_section *sec;
3142 /* Finalize the positions of the sections relative to one another. */
3144 for (sec = f->load_order; sec; sec = sec->load_next) {
3147 align = sec->header.sh_addralign;
3148 if (align && (dot & (align - 1)))
3149 dot = (dot | (align - 1)) + 1;
3151 sec->header.sh_addr = dot;
3152 dot += sec->header.sh_size;
3158 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
3160 int i, n = f->header.e_shnum;
3163 /* Finalize the addresses of the sections. */
3166 for (i = 0; i < n; ++i)
3167 f->sections[i]->header.sh_addr += base;
3169 /* And iterate over all of the relocations. */
3171 for (i = 0; i < n; ++i) {
3172 struct obj_section *relsec, *symsec, *targsec, *strsec;
3173 ElfW(RelM) * rel, *relend;
3177 relsec = f->sections[i];
3178 if (relsec->header.sh_type != SHT_RELM)
3181 symsec = f->sections[relsec->header.sh_link];
3182 targsec = f->sections[relsec->header.sh_info];
3183 strsec = f->sections[symsec->header.sh_link];
3185 rel = (ElfW(RelM) *) relsec->contents;
3186 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
3187 symtab = (ElfW(Sym) *) symsec->contents;
3188 strtab = (const char *) strsec->contents;
3190 for (; rel < relend; ++rel) {
3191 ElfW(Addr) value = 0;
3192 struct obj_symbol *intsym = NULL;
3193 unsigned long symndx;
3194 ElfW(Sym) * extsym = 0;
3197 /* Attempt to find a value to use for this relocation. */
3199 symndx = ELF_R_SYM(rel->r_info);
3201 /* Note we've already checked for undefined symbols. */
3203 extsym = &symtab[symndx];
3204 if (ELF_ST_BIND(extsym->st_info) == STB_LOCAL) {
3205 /* Local symbols we look up in the local table to be sure
3206 we get the one that is really intended. */
3207 intsym = f->local_symtab[symndx];
3209 /* Others we look up in the hash table. */
3211 if (extsym->st_name)
3212 name = strtab + extsym->st_name;
3214 name = f->sections[extsym->st_shndx]->name;
3215 intsym = obj_find_symbol(f, name);
3218 value = obj_symbol_final_value(f, intsym);
3219 intsym->referenced = 1;
3221 #if SHT_RELM == SHT_RELA
3222 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
3223 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
3224 if (!extsym || !extsym->st_name ||
3225 ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
3227 value += rel->r_addend;
3231 switch (arch_apply_relocation
3232 (f, targsec, /*symsec,*/ intsym, rel, value)
3237 case obj_reloc_overflow:
3238 errmsg = "Relocation overflow";
3240 case obj_reloc_dangerous:
3241 errmsg = "Dangerous relocation";
3243 case obj_reloc_unhandled:
3244 errmsg = "Unhandled relocation";
3247 bb_error_msg("%s of type %ld for %s", errmsg,
3248 (long) ELF_R_TYPE(rel->r_info),
3249 strtab + extsym->st_name);
3251 bb_error_msg("%s of type %ld", errmsg,
3252 (long) ELF_R_TYPE(rel->r_info));
3260 /* Finally, take care of the patches. */
3262 if (f->string_patches) {
3263 struct obj_string_patch *p;
3264 struct obj_section *strsec;
3265 ElfW(Addr) strsec_base;
3266 strsec = obj_find_section(f, ".kstrtab");
3267 strsec_base = strsec->header.sh_addr;
3269 for (p = f->string_patches; p; p = p->next) {
3270 struct obj_section *targsec = f->sections[p->reloc_secidx];
3271 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3272 = strsec_base + p->string_offset;
3276 if (f->symbol_patches) {
3277 struct obj_symbol_patch *p;
3279 for (p = f->symbol_patches; p; p = p->next) {
3280 struct obj_section *targsec = f->sections[p->reloc_secidx];
3281 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3282 = obj_symbol_final_value(f, p->sym);
3289 static int obj_create_image(struct obj_file *f, char *image)
3291 struct obj_section *sec;
3292 ElfW(Addr) base = f->baseaddr;
3294 for (sec = f->load_order; sec; sec = sec->load_next) {
3297 if (sec->contents == 0 || sec->header.sh_size == 0)
3300 secimg = image + (sec->header.sh_addr - base);
3302 /* Note that we allocated data for NOBITS sections earlier. */
3303 memcpy(secimg, sec->contents, sec->header.sh_size);
3309 /*======================================================================*/
3311 static struct obj_file *obj_load(FILE * fp, int loadprogbits ATTRIBUTE_UNUSED)
3314 ElfW(Shdr) * section_headers;
3318 /* Read the file header. */
3320 f = arch_new_file();
3321 f->symbol_cmp = strcmp;
3322 f->symbol_hash = obj_elf_hash;
3323 f->load_order_search_start = &f->load_order;
3325 fseek(fp, 0, SEEK_SET);
3326 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
3327 bb_perror_msg_and_die("error reading ELF header");
3330 if (f->header.e_ident[EI_MAG0] != ELFMAG0
3331 || f->header.e_ident[EI_MAG1] != ELFMAG1
3332 || f->header.e_ident[EI_MAG2] != ELFMAG2
3333 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
3334 bb_error_msg_and_die("not an ELF file");
3336 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3337 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN
3338 ? ELFDATA2MSB : ELFDATA2LSB)
3339 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3340 || !MATCH_MACHINE(f->header.e_machine)) {
3341 bb_error_msg_and_die("ELF file not for this architecture");
3343 if (f->header.e_type != ET_REL) {
3344 bb_error_msg_and_die("ELF file not a relocatable object");
3347 /* Read the section headers. */
3349 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3350 bb_error_msg_and_die("section header size mismatch: %lu != %lu",
3351 (unsigned long) f->header.e_shentsize,
3352 (unsigned long) sizeof(ElfW(Shdr)));
3355 shnum = f->header.e_shnum;
3356 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3357 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3359 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3360 fseek(fp, f->header.e_shoff, SEEK_SET);
3361 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3362 bb_perror_msg_and_die("error reading ELF section headers");
3365 /* Read the section data. */
3367 for (i = 0; i < shnum; ++i) {
3368 struct obj_section *sec;
3370 f->sections[i] = sec = arch_new_section();
3372 sec->header = section_headers[i];
3375 if (sec->header.sh_size) {
3376 switch (sec->header.sh_type) {
3385 if (!loadprogbits) {
3386 sec->contents = NULL;
3393 if (sec->header.sh_size > 0) {
3394 sec->contents = xmalloc(sec->header.sh_size);
3395 fseek(fp, sec->header.sh_offset, SEEK_SET);
3396 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3397 bb_perror_msg_and_die("error reading ELF section data");
3400 sec->contents = NULL;
3404 #if SHT_RELM == SHT_REL
3406 bb_error_msg_and_die("RELA relocations not supported on this architecture");
3409 bb_error_msg_and_die("REL relocations not supported on this architecture");
3412 if (sec->header.sh_type >= SHT_LOPROC) {
3413 /* Assume processor specific section types are debug
3414 info and can safely be ignored. If this is ever not
3415 the case (Hello MIPS?), don't put ifdefs here but
3416 create an arch_load_proc_section(). */
3420 bb_error_msg_and_die("can't handle sections of type %ld",
3421 (long) sec->header.sh_type);
3426 /* Do what sort of interpretation as needed by each section. */
3428 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3430 for (i = 0; i < shnum; ++i) {
3431 struct obj_section *sec = f->sections[i];
3432 sec->name = shstrtab + sec->header.sh_name;
3435 for (i = 0; i < shnum; ++i) {
3436 struct obj_section *sec = f->sections[i];
3438 /* .modinfo should be contents only but gcc has no attribute for that.
3439 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3441 if (strcmp(sec->name, ".modinfo") == 0)
3442 sec->header.sh_flags &= ~SHF_ALLOC;
3444 if (sec->header.sh_flags & SHF_ALLOC)
3445 obj_insert_section_load_order(f, sec);
3447 switch (sec->header.sh_type) {
3450 unsigned long nsym, j;
3454 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3455 bb_error_msg_and_die("symbol size mismatch: %lu != %lu",
3456 (unsigned long) sec->header.sh_entsize,
3457 (unsigned long) sizeof(ElfW(Sym)));
3460 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3461 strtab = f->sections[sec->header.sh_link]->contents;
3462 sym = (ElfW(Sym) *) sec->contents;
3464 /* Allocate space for a table of local symbols. */
3465 j = f->local_symtab_size = sec->header.sh_info;
3466 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3468 /* Insert all symbols into the hash table. */
3469 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3470 ElfW(Addr) val = sym->st_value;
3473 name = strtab + sym->st_name;
3474 else if (sym->st_shndx < shnum)
3475 name = f->sections[sym->st_shndx]->name;
3478 #if defined(__SH5__)
3480 * For sh64 it is possible that the target of a branch
3481 * requires a mode switch (32 to 16 and back again).
3483 * This is implied by the lsb being set in the target
3484 * address for SHmedia mode and clear for SHcompact.
3486 val |= sym->st_other & 4;
3488 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3495 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3496 bb_error_msg_and_die("relocation entry size mismatch: %lu != %lu",
3497 (unsigned long) sec->header.sh_entsize,
3498 (unsigned long) sizeof(ElfW(RelM)));
3501 /* XXX Relocation code from modutils-2.3.19 is not here.
3502 * Why? That's about 20 lines of code from obj/obj_load.c,
3503 * which gets done in a second pass through the sections.
3504 * This BusyBox insmod does similar work in obj_relocate(). */
3511 #if ENABLE_FEATURE_INSMOD_LOADINKMEM
3513 * load the unloaded sections directly into the memory allocated by
3514 * kernel for the module
3517 static int obj_load_progbits(FILE * fp, struct obj_file* f, char* imagebase)
3519 ElfW(Addr) base = f->baseaddr;
3520 struct obj_section* sec;
3522 for (sec = f->load_order; sec; sec = sec->load_next) {
3524 /* section already loaded? */
3525 if (sec->contents != NULL)
3528 if (sec->header.sh_size == 0)
3531 sec->contents = imagebase + (sec->header.sh_addr - base);
3532 fseek(fp, sec->header.sh_offset, SEEK_SET);
3533 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3534 bb_perror_msg("error reading ELF section data");
3543 static void hide_special_symbols(struct obj_file *f)
3545 static const char *const specials[] = {
3546 SPFX "cleanup_module",
3548 SPFX "kernel_version",
3552 struct obj_symbol *sym;
3553 const char *const *p;
3555 for (p = specials; *p; ++p) {
3556 sym = obj_find_symbol(f, *p);
3558 sym->info = ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info));
3563 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
3564 static int obj_gpl_license(struct obj_file *f, const char **license)
3566 struct obj_section *sec;
3567 /* This list must match *exactly* the list of allowable licenses in
3568 * linux/include/linux/module.h. Checking for leading "GPL" will not
3569 * work, somebody will use "GPL sucks, this is proprietary".
3571 static const char *const gpl_licenses[] = {
3574 "GPL and additional rights",
3579 sec = obj_find_section(f, ".modinfo");
3581 const char *value, *ptr, *endptr;
3582 ptr = sec->contents;
3583 endptr = ptr + sec->header.sh_size;
3584 while (ptr < endptr) {
3585 value = strchr(ptr, '=');
3586 if (value && strncmp(ptr, "license", value-ptr) == 0) {
3590 for (i = 0; i < ARRAY_SIZE(gpl_licenses); ++i) {
3591 if (strcmp(value+1, gpl_licenses[i]) == 0)
3596 ptr = strchr(ptr, '\0');
3606 #define TAINT_FILENAME "/proc/sys/kernel/tainted"
3607 #define TAINT_PROPRIETORY_MODULE (1 << 0)
3608 #define TAINT_FORCED_MODULE (1 << 1)
3609 #define TAINT_UNSAFE_SMP (1 << 2)
3610 #define TAINT_URL "http://www.tux.org/lkml/#export-tainted"
3612 static void set_tainted(int fd, char *m_name,
3613 int kernel_has_tainted, int taint, const char *text1, const char *text2)
3615 static smallint printed_info;
3620 if (fd < 0 && !kernel_has_tainted)
3621 return; /* New modutils on old kernel */
3622 printf("Warning: loading %s will taint the kernel: %s%s\n",
3623 m_name, text1, text2);
3624 if (!printed_info) {
3625 printf(" See %s for information about tainted modules\n", TAINT_URL);
3629 read(fd, buf, sizeof(buf)-1);
3630 buf[sizeof(buf)-1] = '\0';
3631 oldval = strtoul(buf, NULL, 10);
3632 sprintf(buf, "%d\n", oldval | taint);
3633 write(fd, buf, strlen(buf));
3637 /* Check if loading this module will taint the kernel. */
3638 static void check_tainted_module(struct obj_file *f, char *m_name)
3640 static const char tainted_file[] ALIGN1 = TAINT_FILENAME;
3642 int fd, kernel_has_tainted;
3645 kernel_has_tainted = 1;
3646 fd = open(tainted_file, O_RDWR);
3648 if (errno == ENOENT)
3649 kernel_has_tainted = 0;
3650 else if (errno == EACCES)
3651 kernel_has_tainted = 1;
3653 perror(tainted_file);
3654 kernel_has_tainted = 0;
3658 switch (obj_gpl_license(f, &ptr)) {
3662 set_tainted(fd, m_name, kernel_has_tainted, TAINT_PROPRIETORY_MODULE, "no license", "");
3665 /* The module has a non-GPL license so we pretend that the
3666 * kernel always has a taint flag to get a warning even on
3667 * kernels without the proc flag.
3669 set_tainted(fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr);
3672 set_tainted(fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", "");
3676 if (flag_force_load)
3677 set_tainted(fd, m_name, 1, TAINT_FORCED_MODULE, "forced load", "");
3682 #else /* FEATURE_CHECK_TAINTED_MODULE */
3683 #define check_tainted_module(x, y) do { } while (0);
3684 #endif /* FEATURE_CHECK_TAINTED_MODULE */
3686 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
3687 /* add module source, timestamp, kernel version and a symbol for the
3688 * start of some sections. this info is used by ksymoops to do better
3691 #if !ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3692 #define get_module_version(f, str) get_module_version(str)
3695 get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
3697 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3698 return new_get_module_version(f, str);
3699 #else /* FEATURE_INSMOD_VERSION_CHECKING */
3700 strncpy(str, "???", sizeof(str));
3702 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
3705 /* add module source, timestamp, kernel version and a symbol for the
3706 * start of some sections. this info is used by ksymoops to do better
3710 add_ksymoops_symbols(struct obj_file *f, const char *filename,
3713 static const char symprefix[] ALIGN1 = "__insmod_";
3714 static const char section_names[][8] = {
3722 struct obj_section *sec;
3723 struct obj_symbol *sym;
3724 char *name, *absolute_filename;
3725 char str[STRVERSIONLEN];
3727 int l, lm_name, lfilename, use_ksymtab, version;
3728 struct stat statbuf;
3730 /* WARNING: was using realpath, but replaced by readlink to stop using
3731 * lots of stack. But here it seems to be able to cause problems? */
3732 absolute_filename = xmalloc_readlink(filename);
3733 if (!absolute_filename)
3734 absolute_filename = xstrdup(filename);
3736 lm_name = strlen(m_name);
3737 lfilename = strlen(absolute_filename);
3739 /* add to ksymtab if it already exists or there is no ksymtab and other symbols
3740 * are not to be exported. otherwise leave ksymtab alone for now, the
3741 * "export all symbols" compatibility code will export these symbols later.
3743 use_ksymtab = obj_find_section(f, "__ksymtab") || flag_noexport;
3745 sec = obj_find_section(f, ".this");
3747 /* tag the module header with the object name, last modified
3748 * timestamp and module version. worst case for module version
3749 * is 0xffffff, decimal 16777215. putting all three fields in
3750 * one symbol is less readable but saves kernel space.
3752 l = sizeof(symprefix) + /* "__insmod_" */
3753 lm_name + /* module name */
3755 lfilename + /* object filename */
3757 2 * sizeof(statbuf.st_mtime) + /* mtime in hex */
3759 8 + /* version in dec */
3762 if (stat(absolute_filename, &statbuf) != 0)
3763 statbuf.st_mtime = 0;
3764 version = get_module_version(f, str); /* -1 if not found */
3765 snprintf(name, l, "%s%s_O%s_M%0*lX_V%d",
3766 symprefix, m_name, absolute_filename,
3767 (int)(2 * sizeof(statbuf.st_mtime)), statbuf.st_mtime,
3769 sym = obj_add_symbol(f, name, -1,
3770 ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3771 sec->idx, sec->header.sh_addr, 0);
3773 new_add_ksymtab(f, sym);
3775 free(absolute_filename);
3776 #ifdef _NOT_SUPPORTED_
3777 /* record where the persistent data is going, same address as previous symbol */
3780 l = sizeof(symprefix) + /* "__insmod_" */
3781 lm_name + /* module name */
3783 strlen(f->persist) + /* data store */
3786 snprintf(name, l, "%s%s_P%s",
3787 symprefix, m_name, f->persist);
3788 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3789 sec->idx, sec->header.sh_addr, 0);
3791 new_add_ksymtab(f, sym);
3793 #endif /* _NOT_SUPPORTED_ */
3794 /* tag the desired sections if size is non-zero */
3796 for (i = 0; i < ARRAY_SIZE(section_names); ++i) {
3797 sec = obj_find_section(f, section_names[i]);
3798 if (sec && sec->header.sh_size) {
3799 l = sizeof(symprefix) + /* "__insmod_" */
3800 lm_name + /* module name */
3802 strlen(sec->name) + /* section name */
3804 8 + /* length in dec */
3807 snprintf(name, l, "%s%s_S%s_L%ld",
3808 symprefix, m_name, sec->name,
3809 (long)sec->header.sh_size);
3810 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3811 sec->idx, sec->header.sh_addr, 0);
3813 new_add_ksymtab(f, sym);
3817 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
3819 #if ENABLE_FEATURE_INSMOD_LOAD_MAP
3820 static void print_load_map(struct obj_file *f)
3822 struct obj_section *sec;
3823 #if ENABLE_FEATURE_INSMOD_LOAD_MAP_FULL
3824 struct obj_symbol **all, **p;
3825 int i, nsyms, *loaded;
3826 struct obj_symbol *sym;
3828 /* Report on the section layout. */
3830 printf("Sections: Size %-*s Align\n",
3831 (int) (2 * sizeof(void *)), "Address");
3833 for (sec = f->load_order; sec; sec = sec->load_next) {
3837 for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a)
3842 printf("%-15s %08lx %0*lx 2**%d\n",
3844 (long)sec->header.sh_size,
3845 (int) (2 * sizeof(void *)),
3846 (long)sec->header.sh_addr,
3849 #if ENABLE_FEATURE_INSMOD_LOAD_MAP_FULL
3850 /* Quick reference which section indicies are loaded. */
3852 i = f->header.e_shnum;
3853 loaded = alloca(sizeof(int) * i);
3855 loaded[i] = ((f->sections[i]->header.sh_flags & SHF_ALLOC) != 0);
3857 /* Collect the symbols we'll be listing. */
3859 for (nsyms = i = 0; i < HASH_BUCKETS; ++i)
3860 for (sym = f->symtab[i]; sym; sym = sym->next)
3861 if (sym->secidx <= SHN_HIRESERVE
3862 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3865 all = alloca(nsyms * sizeof(struct obj_symbol *));
3867 for (i = 0, p = all; i < HASH_BUCKETS; ++i)
3868 for (sym = f->symtab[i]; sym; sym = sym->next)
3869 if (sym->secidx <= SHN_HIRESERVE
3870 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3873 /* And list them. */
3874 printf("\nSymbols:\n");
3875 for (p = all; p < all + nsyms; ++p) {
3877 unsigned long value;
3880 if (sym->secidx == SHN_ABS) {
3883 } else if (sym->secidx == SHN_UNDEF) {
3887 sec = f->sections[sym->secidx];
3889 if (sec->header.sh_type == SHT_NOBITS)
3891 else if (sec->header.sh_flags & SHF_ALLOC) {
3892 if (sec->header.sh_flags & SHF_EXECINSTR)
3894 else if (sec->header.sh_flags & SHF_WRITE)
3899 value = sym->value + sec->header.sh_addr;
3902 if (ELF_ST_BIND(sym->info) == STB_LOCAL)
3903 type = tolower(type);
3905 printf("%0*lx %c %s\n", (int) (2 * sizeof(void *)), value,
3910 #else /* !FEATURE_INSMOD_LOAD_MAP */
3911 void print_load_map(struct obj_file *f);
3914 int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
3915 int insmod_main(int argc, char **argv)
3921 unsigned long m_size;
3925 char *m_name = NULL;
3926 int exit_status = EXIT_FAILURE;
3928 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3929 struct utsname uts_info;
3930 char m_strversion[STRVERSIONLEN];
3931 int m_version, m_crcs;
3933 #if ENABLE_FEATURE_CLEAN_UP
3939 struct utsname myuname;
3941 /* Parse any options */
3942 getopt32(argv, OPTION_STR, &opt_o);
3943 arg1 = argv[optind];
3944 if (option_mask32 & OPT_o) { // -o /* name the output module */
3946 m_name = xstrdup(opt_o);
3953 /* Grab the module name */
3954 tmp1 = xstrdup(arg1);
3955 tmp = basename(tmp1);
3958 if (uname(&myuname) == 0) {
3959 if (myuname.release[0] == '2') {
3960 k_version = myuname.release[2] - '0';
3964 #if ENABLE_FEATURE_2_6_MODULES
3965 if (k_version > 4 && len > 3 && tmp[len - 3] == '.'
3966 && tmp[len - 2] == 'k' && tmp[len - 1] == 'o'
3972 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
3978 #if ENABLE_FEATURE_2_6_MODULES
3980 m_fullName = xasprintf("%s.ko", tmp);
3983 m_fullName = xasprintf("%s.o", tmp);
3989 tmp1 = NULL; /* flag for free(m_name) before exit() */
3992 /* Get a filedesc for the module. Check that we have a complete path */
3993 if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
3994 || (fp = fopen(arg1, "r")) == NULL
3996 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
3997 * but do not error out yet if we fail to find it... */
3998 if (k_version) { /* uname succeedd */
4002 tmdn = concat_path_file(_PATH_MODULES, myuname.release);
4003 /* Jump through hoops in case /lib/modules/`uname -r`
4004 * is a symlink. We do not want recursive_action to
4005 * follow symlinks, but we do want to follow the
4006 * /lib/modules/`uname -r` dir, So resolve it ourselves
4007 * if it is a link... */
4008 module_dir = xmalloc_readlink(tmdn);
4010 module_dir = xstrdup(tmdn);
4011 recursive_action(module_dir, ACTION_RECURSE,
4012 check_module_name_match, NULL, m_fullName, 0);
4017 /* Check if we have found anything yet */
4018 if (!m_filename || ((fp = fopen(m_filename, "r")) == NULL)) {
4024 module_dir = xmalloc_readlink(_PATH_MODULES);
4026 module_dir = xstrdup(_PATH_MODULES);
4027 /* No module found under /lib/modules/`uname -r`, this
4028 * time cast the net a bit wider. Search /lib/modules/ */
4029 r = recursive_action(module_dir, ACTION_RECURSE,
4030 check_module_name_match, NULL, m_fullName, 0);
4032 bb_error_msg_and_die("%s: module not found", m_fullName);
4034 if (m_filename == NULL
4035 || ((fp = fopen(m_filename, "r")) == NULL)
4037 bb_error_msg_and_die("%s: module not found", m_fullName);
4041 m_filename = xstrdup(arg1);
4044 printf("Using %s\n", m_filename);
4046 #if ENABLE_FEATURE_2_6_MODULES
4047 if (k_version > 4) {
4048 argv[optind] = m_filename;
4050 return insmod_ng_main(argc - optind, argv + optind);
4054 f = obj_load(fp, LOADBITS);
4056 if (get_modinfo_value(f, "kernel_version") == NULL)
4061 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
4062 /* Version correspondence? */
4064 if (uname(&uts_info) < 0)
4065 uts_info.release[0] = '\0';
4066 if (m_has_modinfo) {
4067 m_version = new_get_module_version(f, m_strversion);
4068 if (m_version == -1) {
4069 bb_error_msg_and_die("cannot find the kernel version the module was "
4074 if (strncmp(uts_info.release, m_strversion, STRVERSIONLEN) != 0) {
4075 bb_error_msg("%skernel-module version mismatch\n"
4076 "\t%s was compiled for kernel version %s\n"
4077 "\twhile this kernel is version %s",
4078 flag_force_load ? "warning: " : "",
4079 m_filename, m_strversion, uts_info.release);
4080 if (!flag_force_load)
4085 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
4087 if (query_module(NULL, 0, NULL, 0, NULL))
4088 bb_error_msg_and_die("not configured to support old kernels");
4089 new_get_kernel_symbols();
4090 k_crcs = new_is_kernel_checksummed();
4092 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
4095 m_crcs = new_is_module_checksummed(f);
4097 if (m_crcs != k_crcs)
4098 obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
4099 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
4101 /* Let the module know about the kernel symbols. */
4102 add_kernel_symbols(f);
4104 /* Allocate common symbols, symbol tables, and string tables. */
4106 new_create_this_module(f, m_name);
4107 obj_check_undefineds(f);
4108 obj_allocate_commons(f);
4109 check_tainted_module(f, m_name);
4111 /* done with the module name, on to the optional var=value arguments */
4113 if (optind < argc) {
4114 new_process_module_arguments(f, argc - optind, argv + optind);
4118 hide_special_symbols(f);
4120 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
4121 add_ksymoops_symbols(f, m_filename, m_name);
4122 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
4124 new_create_module_ksymtab(f);
4126 /* Find current size of the module */
4127 m_size = obj_load_size(f);
4129 m_addr = create_module(m_name, m_size);
4130 if (m_addr == (ElfW(Addr))(-1)) switch (errno) {
4132 bb_error_msg_and_die("a module named %s already exists", m_name);
4134 bb_error_msg_and_die("can't allocate kernel memory for module; needed %lu bytes",
4137 bb_perror_msg_and_die("create_module: %s", m_name);
4142 * the PROGBITS section was not loaded by the obj_load
4143 * now we can load them directly into the kernel memory
4145 if (!obj_load_progbits(fp, f, (char*)m_addr)) {
4146 delete_module(m_name);
4151 if (!obj_relocate(f, m_addr)) {
4152 delete_module(m_name);
4156 if (!new_init_module(m_name, f, m_size)) {
4157 delete_module(m_name);
4161 if (flag_print_load_map)
4164 exit_status = EXIT_SUCCESS;
4167 #if ENABLE_FEATURE_CLEAN_UP
4178 #endif /* ENABLE_FEATURE_2_4_MODULES */
4180 * End of big piece of 2.4-specific code
4184 #if ENABLE_FEATURE_2_6_MODULES
4186 #include <sys/mman.h>
4189 extern int init_module(void *module, unsigned long len, const char *options);
4191 #include <asm/unistd.h>
4192 #include <sys/syscall.h>
4193 #define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
4196 /* We use error numbers in a loose translation... */
4197 static const char *moderror(int err)
4201 return "invalid module format";
4203 return "unknown symbol in module";
4205 return "module has wrong symbol version";
4207 return "invalid parameters";
4209 return strerror(err);
4213 #if !ENABLE_FEATURE_2_4_MODULES
4214 int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
4215 int insmod_main(int argc ATTRIBUTE_UNUSED, char **argv)
4217 static int insmod_ng_main(int argc ATTRIBUTE_UNUSED, char **argv)
4223 char *filename, *options;
4229 /* Rest is options */
4230 options = xzalloc(1);
4233 options = xrealloc(options, optlen + 2 + strlen(*argv) + 2);
4234 /* Spaces handled by "" pairs, but no way of escaping quotes */
4235 optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
4239 /* Any special reason why mmap? It isn't performace critical... */
4241 /* yes, xmalloc'ing can use *alot* of RAM. Don't forget that there are
4242 * modules out there that are half a megabyte! mmap()ing is way nicer
4243 * for small mem boxes, i guess.
4248 fd = xopen(filename, O_RDONLY);
4251 map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
4252 if (map == MAP_FAILED) {
4253 bb_perror_msg_and_die("cannot mmap '%s'", filename);
4256 /* map == NULL on Blackfin, probably on other MMU-less systems too. Workaround. */
4259 xread(fd, map, len);
4262 len = MAXINT(ssize_t);
4263 map = xmalloc_open_read_close(filename, &len);
4266 if (init_module(map, len, options) != 0)
4267 bb_error_msg_and_die("cannot insert '%s': %s",
4268 filename, moderror(errno));