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 #define MATCH_MACHINE(x) (x == EM_XILINX_MICROBLAZE)
188 #define SHT_RELM SHT_RELA
189 #define Elf32_RelM Elf32_Rela
190 #define ELFCLASSM ELFCLASS32
194 #if defined(__mips__)
195 #define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE)
196 #define SHT_RELM SHT_REL
197 #define Elf32_RelM Elf32_Rel
198 #define ELFCLASSM ELFCLASS32
199 /* Account for ELF spec changes. */
200 #ifndef EM_MIPS_RS3_LE
201 #ifdef EM_MIPS_RS4_BE
202 #define EM_MIPS_RS3_LE EM_MIPS_RS4_BE
204 #define EM_MIPS_RS3_LE 10
206 #endif /* !EM_MIPS_RS3_LE */
207 #define ARCHDATAM "__dbe_table"
211 #if defined(__nios2__)
212 #define MATCH_MACHINE(x) (x == EM_ALTERA_NIOS2)
213 #define SHT_RELM SHT_RELA
214 #define Elf32_RelM Elf32_Rela
215 #define ELFCLASSM ELFCLASS32
219 #if defined(__powerpc64__)
220 #define MATCH_MACHINE(x) (x == EM_PPC64)
221 #define SHT_RELM SHT_RELA
222 #define Elf64_RelM Elf64_Rela
223 #define ELFCLASSM ELFCLASS64
224 #elif defined(__powerpc__)
225 #define MATCH_MACHINE(x) (x == EM_PPC)
226 #define SHT_RELM SHT_RELA
227 #define Elf32_RelM Elf32_Rela
228 #define ELFCLASSM ELFCLASS32
229 #define USE_PLT_ENTRIES
230 #define PLT_ENTRY_SIZE 16
232 #define LIST_ARCHTYPE ElfW(Addr)
234 #define ARCHDATAM "__ftr_fixup"
238 #if defined(__s390__)
239 #define MATCH_MACHINE(x) (x == EM_S390)
240 #define SHT_RELM SHT_RELA
241 #define Elf32_RelM Elf32_Rela
242 #define ELFCLASSM ELFCLASS32
243 #define USE_PLT_ENTRIES
244 #define PLT_ENTRY_SIZE 8
245 #define USE_GOT_ENTRIES
246 #define GOT_ENTRY_SIZE 8
252 #define MATCH_MACHINE(x) (x == EM_SH)
253 #define SHT_RELM SHT_RELA
254 #define Elf32_RelM Elf32_Rela
255 #define ELFCLASSM ELFCLASS32
256 #define USE_GOT_ENTRIES
257 #define GOT_ENTRY_SIZE 4
259 /* the SH changes have only been tested in =little endian= mode */
260 /* I'm not sure about big endian, so let's warn: */
261 #if defined(__sh__) && BB_BIG_ENDIAN
262 # error insmod.c may require changes for use on big endian SH
264 /* it may or may not work on the SH1/SH2... Error on those also */
265 #if ((!(defined(__SH3__) || defined(__SH4__) || defined(__SH5__)))) && (defined(__sh__))
266 #error insmod.c may require changes for SH1 or SH2 use
271 #if defined(__sparc__)
272 #define MATCH_MACHINE(x) (x == EM_SPARC)
273 #define SHT_RELM SHT_RELA
274 #define Elf32_RelM Elf32_Rela
275 #define ELFCLASSM ELFCLASS32
279 #if defined(__v850e__)
280 #define MATCH_MACHINE(x) ((x) == EM_V850 || (x) == EM_CYGNUS_V850)
281 #define SHT_RELM SHT_RELA
282 #define Elf32_RelM Elf32_Rela
283 #define ELFCLASSM ELFCLASS32
284 #define USE_PLT_ENTRIES
285 #define PLT_ENTRY_SIZE 8
287 #ifndef EM_CYGNUS_V850 /* grumble */
288 #define EM_CYGNUS_V850 0x9080
290 #define SYMBOL_PREFIX "_"
294 #if defined(__x86_64__)
295 #define MATCH_MACHINE(x) (x == EM_X86_64)
296 #define SHT_RELM SHT_RELA
297 #define USE_GOT_ENTRIES
298 #define GOT_ENTRY_SIZE 8
300 #define Elf64_RelM Elf64_Rela
301 #define ELFCLASSM ELFCLASS64
305 #error Sorry, but insmod.c does not yet support this architecture...
309 //----------------------------------------------------------------------------
310 //--------modutils module.h, lines 45-242
311 //----------------------------------------------------------------------------
313 /* Definitions for the Linux module syscall interface.
314 Copyright 1996, 1997 Linux International.
316 Contributed by Richard Henderson <rth@tamu.edu>
318 This file is part of the Linux modutils.
320 This program is free software; you can redistribute it and/or modify it
321 under the terms of the GNU General Public License as published by the
322 Free Software Foundation; either version 2 of the License, or (at your
323 option) any later version.
325 This program is distributed in the hope that it will be useful, but
326 WITHOUT ANY WARRANTY; without even the implied warranty of
327 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
328 General Public License for more details.
330 You should have received a copy of the GNU General Public License
331 along with this program; if not, write to the Free Software Foundation,
332 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
335 #ifndef MODUTILS_MODULE_H
337 /*======================================================================*/
338 /* For sizeof() which are related to the module platform and not to the
339 environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
341 #define tgt_sizeof_char sizeof(char)
342 #define tgt_sizeof_short sizeof(short)
343 #define tgt_sizeof_int sizeof(int)
344 #define tgt_sizeof_long sizeof(long)
345 #define tgt_sizeof_char_p sizeof(char *)
346 #define tgt_sizeof_void_p sizeof(void *)
347 #define tgt_long long
349 #if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64)
350 #undef tgt_sizeof_long
351 #undef tgt_sizeof_char_p
352 #undef tgt_sizeof_void_p
356 tgt_sizeof_char_p = 8,
357 tgt_sizeof_void_p = 8
359 #define tgt_long long long
362 /*======================================================================*/
363 /* The structures used in Linux 2.1. */
365 /* Note: new_module_symbol does not use tgt_long intentionally */
366 struct new_module_symbol {
371 struct new_module_persist;
373 struct new_module_ref {
374 unsigned tgt_long dep; /* kernel addresses */
375 unsigned tgt_long ref;
376 unsigned tgt_long next_ref;
380 unsigned tgt_long size_of_struct; /* == sizeof(module) */
381 unsigned tgt_long next;
382 unsigned tgt_long name;
383 unsigned tgt_long size;
386 unsigned tgt_long flags; /* AUTOCLEAN et al */
391 unsigned tgt_long syms;
392 unsigned tgt_long deps;
393 unsigned tgt_long refs;
394 unsigned tgt_long init;
395 unsigned tgt_long cleanup;
396 unsigned tgt_long ex_table_start;
397 unsigned tgt_long ex_table_end;
399 unsigned tgt_long gp;
401 /* Everything after here is extension. */
402 unsigned tgt_long persist_start;
403 unsigned tgt_long persist_end;
404 unsigned tgt_long can_unload;
405 unsigned tgt_long runsize;
406 const char *kallsyms_start; /* All symbols for kernel debugging */
407 const char *kallsyms_end;
408 const char *archdata_start; /* arch specific data for module */
409 const char *archdata_end;
410 const char *kernel_data; /* Reserved for kernel internal use */
414 #define ARCHDATA_SEC_NAME ARCHDATAM
416 #define ARCHDATA_SEC_NAME "__archdata"
418 #define KALLSYMS_SEC_NAME "__kallsyms"
421 struct new_module_info {
428 /* Bits of module.flags. */
432 NEW_MOD_AUTOCLEAN = 4,
434 NEW_MOD_USED_ONCE = 16
437 int init_module(const char *name, const struct new_module *);
438 int query_module(const char *name, int which, void *buf,
439 size_t bufsize, size_t *ret);
441 /* Values for query_module's which. */
450 /*======================================================================*/
451 /* The system calls unchanged between 2.0 and 2.1. */
453 unsigned long create_module(const char *, size_t);
454 int delete_module(const char *);
457 #endif /* module.h */
459 //----------------------------------------------------------------------------
460 //--------end of modutils module.h
461 //----------------------------------------------------------------------------
465 //----------------------------------------------------------------------------
466 //--------modutils obj.h, lines 253-462
467 //----------------------------------------------------------------------------
469 /* Elf object file loading and relocation routines.
470 Copyright 1996, 1997 Linux International.
472 Contributed by Richard Henderson <rth@tamu.edu>
474 This file is part of the Linux modutils.
476 This program is free software; you can redistribute it and/or modify it
477 under the terms of the GNU General Public License as published by the
478 Free Software Foundation; either version 2 of the License, or (at your
479 option) any later version.
481 This program is distributed in the hope that it will be useful, but
482 WITHOUT ANY WARRANTY; without even the implied warranty of
483 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
484 General Public License for more details.
486 You should have received a copy of the GNU General Public License
487 along with this program; if not, write to the Free Software Foundation,
488 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
491 #ifndef MODUTILS_OBJ_H
493 /* The relocatable object is manipulated using elfin types. */
499 # if ELFCLASSM == ELFCLASS32
500 # define ElfW(x) Elf32_ ## x
501 # define ELFW(x) ELF32_ ## x
503 # define ElfW(x) Elf64_ ## x
504 # define ELFW(x) ELF64_ ## x
508 /* For some reason this is missing from some ancient C libraries.... */
509 #ifndef ELF32_ST_INFO
510 # define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
513 #ifndef ELF64_ST_INFO
514 # define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
517 #define ELF_ST_BIND(info) ELFW(ST_BIND)(info)
518 #define ELF_ST_TYPE(info) ELFW(ST_TYPE)(info)
519 #define ELF_ST_INFO(bind, type) ELFW(ST_INFO)(bind, type)
520 #define ELF_R_TYPE(val) ELFW(R_TYPE)(val)
521 #define ELF_R_SYM(val) ELFW(R_SYM)(val)
523 struct obj_string_patch;
524 struct obj_symbol_patch;
531 struct obj_section *load_next;
537 struct obj_symbol *next; /* hash table link */
541 int secidx; /* the defining section index/module */
543 int ksymidx; /* for export to the kernel symtab */
544 int referenced; /* actually used in the link */
547 /* Hardcode the hash table size. We shouldn't be needing so many
548 symbols that we begin to degrade performance, and we get a big win
549 by giving the compiler a constant divisor. */
551 #define HASH_BUCKETS 521
556 struct obj_section **sections;
557 struct obj_section *load_order;
558 struct obj_section **load_order_search_start;
559 struct obj_string_patch *string_patches;
560 struct obj_symbol_patch *symbol_patches;
561 int (*symbol_cmp)(const char *, const char *);
562 unsigned long (*symbol_hash)(const char *);
563 unsigned long local_symtab_size;
564 struct obj_symbol **local_symtab;
565 struct obj_symbol *symtab[HASH_BUCKETS];
575 struct obj_string_patch {
576 struct obj_string_patch *next;
578 ElfW(Addr) reloc_offset;
579 ElfW(Addr) string_offset;
582 struct obj_symbol_patch {
583 struct obj_symbol_patch *next;
585 ElfW(Addr) reloc_offset;
586 struct obj_symbol *sym;
590 /* Generic object manipulation routines. */
592 static unsigned long obj_elf_hash(const char *);
594 static unsigned long obj_elf_hash_n(const char *, unsigned long len);
596 static struct obj_symbol *obj_find_symbol(struct obj_file *f,
599 static ElfW(Addr) obj_symbol_final_value(struct obj_file *f,
600 struct obj_symbol *sym);
602 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
603 static void obj_set_symbol_compare(struct obj_file *f,
604 int (*cmp)(const char *, const char *),
605 unsigned long (*hash)(const char *));
608 static struct obj_section *obj_find_section(struct obj_file *f,
611 static void obj_insert_section_load_order(struct obj_file *f,
612 struct obj_section *sec);
614 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
619 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
624 static void *obj_extend_section(struct obj_section *sec, unsigned long more);
626 static void obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
629 static void obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
630 struct obj_symbol *sym);
632 static void obj_check_undefineds(struct obj_file *f);
634 static void obj_allocate_commons(struct obj_file *f);
636 static unsigned long obj_load_size(struct obj_file *f);
638 static int obj_relocate(struct obj_file *f, ElfW(Addr) base);
640 static struct obj_file *obj_load(FILE *f, int loadprogbits);
642 static int obj_create_image(struct obj_file *f, char *image);
644 /* Architecture specific manipulation routines. */
646 static struct obj_file *arch_new_file(void);
648 static struct obj_section *arch_new_section(void);
650 static struct obj_symbol *arch_new_symbol(void);
652 static enum obj_reloc arch_apply_relocation(struct obj_file *f,
653 struct obj_section *targsec,
654 struct obj_section *symsec,
655 struct obj_symbol *sym,
656 ElfW(RelM) *rel, ElfW(Addr) value);
658 static void arch_create_got(struct obj_file *f);
659 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
660 static int obj_gpl_license(struct obj_file *f, const char **license);
661 #endif /* FEATURE_CHECK_TAINTED_MODULE */
663 //----------------------------------------------------------------------------
664 //--------end of modutils obj.h
665 //----------------------------------------------------------------------------
668 /* SPFX is always a string, so it can be concatenated to string constants. */
670 #define SPFX SYMBOL_PREFIX
676 #define _PATH_MODULES "/lib/modules"
677 enum { STRVERSIONLEN = 64 };
679 /*======================================================================*/
681 #define OPTION_STR "sLo:fkvqx" USE_FEATURE_INSMOD_LOAD_MAP("m")
683 OPT_s = 0x1, // -s /* log to syslog */
684 /* Not supported but kernel needs this for request_module(),
685 as this calls: modprobe -k -s -- <module>
686 so silently ignore this flag */
687 OPT_L = 0x2, // -L /* Stub warning */
688 /* Compatibility with modprobe.
689 In theory, this does locking, but we don't do
690 that. So be careful and plan your life around not
691 loading the same module 50 times concurrently. */
692 OPT_o = 0x4, // -o /* name the output module */
693 OPT_f = 0x8, // -f /* force loading */
694 OPT_k = 0x10, // -k /* module loaded by kerneld, auto-cleanable */
695 OPT_v = 0x20, // -v /* verbose output */
696 OPT_q = 0x40, // -q /* silent */
697 OPT_x = 0x80, // -x /* do not export externs */
698 OPT_m = 0x100, // -m /* print module load map */
700 #define flag_force_load (option_mask32 & OPT_f)
701 #define flag_autoclean (option_mask32 & OPT_k)
702 #define flag_verbose (option_mask32 & OPT_v)
703 #define flag_quiet (option_mask32 & OPT_q)
704 #define flag_noexport (option_mask32 & OPT_x)
705 #if ENABLE_FEATURE_INSMOD_LOAD_MAP
706 #define flag_print_load_map (option_mask32 & OPT_m)
708 #define flag_print_load_map 0
711 /*======================================================================*/
713 #if defined(USE_LIST)
715 struct arch_list_entry
717 struct arch_list_entry *next;
718 LIST_ARCHTYPE addend;
725 #if defined(USE_SINGLE)
727 struct arch_single_entry
736 #if defined(__mips__)
739 struct mips_hi16 *next;
746 struct obj_file root;
747 #if defined(USE_PLT_ENTRIES)
748 struct obj_section *plt;
750 #if defined(USE_GOT_ENTRIES)
751 struct obj_section *got;
753 #if defined(__mips__)
754 struct mips_hi16 *mips_hi16_list;
759 struct obj_symbol root;
760 #if defined(USE_PLT_ENTRIES)
761 #if defined(USE_PLT_LIST)
762 struct arch_list_entry *pltent;
764 struct arch_single_entry pltent;
767 #if defined(USE_GOT_ENTRIES)
768 struct arch_single_entry gotent;
773 struct external_module {
778 struct new_module_symbol *syms;
781 static struct new_module_symbol *ksyms;
782 static size_t nksyms;
784 static struct external_module *ext_modules;
785 static int n_ext_modules;
786 static int n_ext_modules_used;
788 static char *m_filename;
789 static char *m_fullName;
792 /*======================================================================*/
795 static int check_module_name_match(const char *filename, struct stat *statbuf,
796 void *userdata, int depth)
798 char *fullname = (char *) userdata;
801 if (fullname[0] == '\0')
804 tmp = bb_get_last_path_component_nostrip(filename);
805 if (strcmp(tmp, fullname) == 0) {
806 /* Stop searching if we find a match */
807 m_filename = xstrdup(filename);
814 /*======================================================================*/
816 static struct obj_file *arch_new_file(void)
819 f = xzalloc(sizeof(*f));
820 return &f->root; /* it's a first member */
823 static struct obj_section *arch_new_section(void)
825 return xzalloc(sizeof(struct obj_section));
828 static struct obj_symbol *arch_new_symbol(void)
830 struct arch_symbol *sym;
831 sym = xzalloc(sizeof(*sym));
835 static enum obj_reloc
836 arch_apply_relocation(struct obj_file *f,
837 struct obj_section *targsec,
838 struct obj_section *symsec,
839 struct obj_symbol *sym,
840 ElfW(RelM) *rel, ElfW(Addr) v)
842 struct arch_file *ifile = (struct arch_file *) f;
843 enum obj_reloc ret = obj_reloc_ok;
844 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
845 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
846 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
847 struct arch_symbol *isym = (struct arch_symbol *) sym;
849 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) || defined(__sh__) || defined(__s390__)
850 #if defined(USE_GOT_ENTRIES)
851 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
854 #if defined(USE_PLT_ENTRIES)
855 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
857 # if defined(USE_PLT_LIST)
858 struct arch_list_entry *pe;
860 struct arch_single_entry *pe;
864 switch (ELF_R_TYPE(rel->r_info)) {
879 /* relative reloc, always to _GLOBAL_OFFSET_TABLE_
880 * (which is .got) similar to branch,
881 * but is full 32 bits relative */
890 case R_ARM_GOTOFF: /* address relative to the got */
894 #elif defined(__cris__)
900 /* CRIS keeps the relocation value in the r_addend field and
901 * should not use whats in *loc at all
906 #elif defined(__H8300H__) || defined(__H8300S__)
909 loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1);
910 *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
921 if ((ElfW(Sword))v > 0x7fff ||
922 (ElfW(Sword))v < -(ElfW(Sword))0x8000)
923 ret = obj_reloc_overflow;
925 *(unsigned short *)loc = v;
929 if ((ElfW(Sword))v > 0x7f ||
930 (ElfW(Sword))v < -(ElfW(Sword))0x80)
931 ret = obj_reloc_overflow;
933 *(unsigned char *)loc = v;
936 #elif defined(__i386__)
970 #elif defined(__microblaze__)
971 case R_MICROBLAZE_NONE:
972 case R_MICROBLAZE_64_NONE:
973 case R_MICROBLAZE_32_SYM_OP_SYM:
974 case R_MICROBLAZE_32_PCREL:
977 case R_MICROBLAZE_64_PCREL: {
978 /* dot is the address of the current instruction.
979 * v is the target symbol address.
980 * So we need to extract the offset in the code,
981 * adding v, then subtrating the current address
982 * of this instruction.
983 * Ex: "IMM 0xFFFE bralid 0x0000" = "bralid 0xFFFE0000"
986 /* Get split offset stored in code */
987 unsigned int temp = (loc[0] & 0xFFFF) << 16 |
990 /* Adjust relative offset. -4 adjustment required
991 * because dot points to the IMM insn, but branch
992 * is computed relative to the branch instruction itself.
996 /* Store back into code */
997 loc[0] = (loc[0] & 0xFFFF0000) | temp >> 16;
998 loc[1] = (loc[1] & 0xFFFF0000) | (temp & 0xFFFF);
1003 case R_MICROBLAZE_32:
1007 case R_MICROBLAZE_64: {
1008 /* Get split pointer stored in code */
1009 unsigned int temp1 = (loc[0] & 0xFFFF) << 16 |
1012 /* Add reloc offset */
1015 /* Store back into code */
1016 loc[0] = (loc[0] & 0xFFFF0000) | temp1 >> 16;
1017 loc[1] = (loc[1] & 0xFFFF0000) | (temp1 & 0xFFFF);
1022 case R_MICROBLAZE_32_PCREL_LO:
1023 case R_MICROBLAZE_32_LO:
1024 case R_MICROBLAZE_SRO32:
1025 case R_MICROBLAZE_SRW32:
1026 ret = obj_reloc_unhandled;
1029 #elif defined(__mc68000__)
1040 ret = obj_reloc_overflow;
1047 ret = obj_reloc_overflow;
1054 if ((ElfW(Sword))v > 0x7f ||
1055 (ElfW(Sword))v < -(ElfW(Sword))0x80) {
1056 ret = obj_reloc_overflow;
1063 if ((ElfW(Sword))v > 0x7fff ||
1064 (ElfW(Sword))v < -(ElfW(Sword))0x8000) {
1065 ret = obj_reloc_overflow;
1071 *(int *)loc = v - dot;
1074 case R_68K_GLOB_DAT:
1075 case R_68K_JMP_SLOT:
1079 case R_68K_RELATIVE:
1080 *(int *)loc += f->baseaddr;
1086 # ifdef R_68K_GOTOFF
1092 #elif defined(__mips__)
1103 ret = obj_reloc_dangerous;
1104 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
1105 ret = obj_reloc_overflow;
1107 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
1113 struct mips_hi16 *n;
1115 /* We cannot relocate this one now because we don't know the value
1116 of the carry we need to add. Save the information, and let LO16
1117 do the actual relocation. */
1118 n = xmalloc(sizeof *n);
1121 n->next = ifile->mips_hi16_list;
1122 ifile->mips_hi16_list = n;
1128 unsigned long insnlo = *loc;
1129 ElfW(Addr) val, vallo;
1131 /* Sign extend the addend we extract from the lo insn. */
1132 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
1134 if (ifile->mips_hi16_list != NULL) {
1135 struct mips_hi16 *l;
1137 l = ifile->mips_hi16_list;
1139 struct mips_hi16 *next;
1142 /* Do the HI16 relocation. Note that we actually don't
1143 need to know anything about the LO16 itself, except where
1144 to find the low 16 bits of the addend needed by the LO16. */
1147 ((insn & 0xffff) << 16) +
1151 /* Account for the sign extension that will happen in the
1158 insn = (insn & ~0xffff) | val;
1166 ifile->mips_hi16_list = NULL;
1169 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
1171 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
1176 #elif defined(__nios2__)
1181 case R_NIOS2_BFD_RELOC_32:
1185 case R_NIOS2_BFD_RELOC_16:
1187 ret = obj_reloc_overflow;
1192 case R_NIOS2_BFD_RELOC_8:
1194 ret = obj_reloc_overflow;
1203 if ((Elf32_Sword)v > 0x7fff ||
1204 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1205 ret = obj_reloc_overflow;
1209 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1219 ret = obj_reloc_overflow;
1223 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1228 case R_NIOS2_PCREL16:
1233 if ((Elf32_Sword)v > 0x7fff ||
1234 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1235 ret = obj_reloc_overflow;
1239 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1245 Elf32_Addr word, gp;
1247 gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp"));
1249 if ((Elf32_Sword)v > 0x7fff ||
1250 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1251 ret = obj_reloc_overflow;
1255 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1259 case R_NIOS2_CALL26:
1261 ret = obj_reloc_dangerous;
1262 if ((v >> 28) != (dot >> 28))
1263 ret = obj_reloc_overflow;
1264 *loc = (*loc & 0x3f) | ((v >> 2) << 6);
1272 ret = obj_reloc_overflow;
1275 word = *loc & ~0x7c0;
1276 *loc = word | ((v & 0x1f) << 6);
1285 ret = obj_reloc_overflow;
1288 word = *loc & ~0xfc0;
1289 *loc = word | ((v & 0x3f) << 6);
1298 ret = obj_reloc_overflow;
1301 word = *loc & ~0x3fc0;
1302 *loc = word | ((v & 0xff) << 6);
1311 *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) |
1321 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1326 case R_NIOS2_HIADJ16:
1328 Elf32_Addr word1, word2;
1331 word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
1332 *loc = ((((word1 >> 22) << 16) | word2) << 6) |
1337 #elif defined(__powerpc64__)
1338 /* PPC64 needs a 2.6 kernel, 2.4 module relocation irrelevant */
1340 #elif defined(__powerpc__)
1342 case R_PPC_ADDR16_HA:
1343 *(unsigned short *)loc = (v + 0x8000) >> 16;
1346 case R_PPC_ADDR16_HI:
1347 *(unsigned short *)loc = v >> 16;
1350 case R_PPC_ADDR16_LO:
1351 *(unsigned short *)loc = v;
1365 #elif defined(__s390__)
1368 *(unsigned int *) loc += v;
1371 *(unsigned short *) loc += v;
1374 *(unsigned char *) loc += v;
1378 *(unsigned int *) loc += v - dot;
1381 *(unsigned short *) loc += (v - dot) >> 1;
1384 *(unsigned short *) loc += v - dot;
1388 case R_390_PLT16DBL:
1389 /* find the plt entry and initialize it. */
1390 pe = (struct arch_single_entry *) &isym->pltent;
1391 if (pe->inited == 0) {
1392 ip = (unsigned long *)(ifile->plt->contents + pe->offset);
1393 ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */
1395 if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1402 /* Insert relative distance to target. */
1403 v = plt + pe->offset - dot;
1404 if (ELF_R_TYPE(rel->r_info) == R_390_PLT32)
1405 *(unsigned int *) loc = (unsigned int) v;
1406 else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1407 *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1);
1410 case R_390_GLOB_DAT:
1411 case R_390_JMP_SLOT:
1415 case R_390_RELATIVE:
1416 *loc += f->baseaddr;
1420 *(unsigned long *) loc += got - dot;
1426 if (!isym->gotent.inited)
1428 isym->gotent.inited = 1;
1429 *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v;
1431 if (ELF_R_TYPE(rel->r_info) == R_390_GOT12)
1432 *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff;
1433 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16)
1434 *(unsigned short *) loc += isym->gotent.offset;
1435 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32)
1436 *(unsigned int *) loc += isym->gotent.offset;
1439 # ifndef R_390_GOTOFF32
1440 # define R_390_GOTOFF32 R_390_GOTOFF
1442 case R_390_GOTOFF32:
1446 #elif defined(__sh__)
1469 *loc = f->baseaddr + rel->r_addend;
1473 *loc = got - dot + rel->r_addend;
1483 # if defined(__SH5__)
1484 case R_SH_IMM_MEDLOW16:
1485 case R_SH_IMM_LOW16:
1489 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16)
1493 * movi and shori have the format:
1495 * | op | imm | reg | reserved |
1496 * 31..26 25..10 9.. 4 3 .. 0
1498 * so we simply mask and or in imm.
1500 word = *loc & ~0x3fffc00;
1501 word |= (v & 0xffff) << 10;
1508 case R_SH_IMM_MEDLOW16_PCREL:
1509 case R_SH_IMM_LOW16_PCREL:
1513 word = *loc & ~0x3fffc00;
1517 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16_PCREL)
1520 word |= (v & 0xffff) << 10;
1526 # endif /* __SH5__ */
1528 #elif defined(__v850e__)
1534 /* We write two shorts instead of a long because even
1535 32-bit insns only need half-word alignment, but
1536 32-bit data needs to be long-word aligned. */
1537 v += ((unsigned short *)loc)[0];
1538 v += ((unsigned short *)loc)[1] << 16;
1539 ((unsigned short *)loc)[0] = v & 0xffff;
1540 ((unsigned short *)loc)[1] = (v >> 16) & 0xffff;
1543 case R_V850_22_PCREL:
1546 #elif defined(__x86_64__)
1556 *(unsigned int *) loc += v;
1559 ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */
1560 /* error("Possibly is module compiled without -mcmodel=kernel!"); */
1565 *(signed int *) loc += v;
1569 *(unsigned short *) loc += v;
1573 *(unsigned char *) loc += v;
1577 *(unsigned int *) loc += v - dot;
1581 *(unsigned short *) loc += v - dot;
1585 *(unsigned char *) loc += v - dot;
1588 case R_X86_64_GLOB_DAT:
1589 case R_X86_64_JUMP_SLOT:
1593 case R_X86_64_RELATIVE:
1594 *loc += f->baseaddr;
1597 case R_X86_64_GOT32:
1598 case R_X86_64_GOTPCREL:
1601 if (!isym->gotent.reloc_done)
1603 isym->gotent.reloc_done = 1;
1604 *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
1606 /* XXX are these really correct? */
1607 if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL)
1608 *(unsigned int *) loc += v + isym->gotent.offset;
1610 *loc += isym->gotent.offset;
1615 # warning "no idea how to handle relocations on your arch"
1619 printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info));
1620 ret = obj_reloc_unhandled;
1623 #if defined(USE_PLT_ENTRIES)
1627 /* find the plt entry and initialize it if necessary */
1629 #if defined(USE_PLT_LIST)
1630 for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend;)
1637 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1639 /* generate some machine code */
1641 #if defined(__arm__)
1642 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1643 ip[1] = v; /* sym@ */
1645 #if defined(__powerpc__)
1646 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1647 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1648 ip[2] = 0x7d6903a6; /* mtctr r11 */
1649 ip[3] = 0x4e800420; /* bctr */
1651 #if defined(__v850e__)
1652 /* We have to trash a register, so we assume that any control
1653 transfer more than 21-bits away must be a function call
1654 (so we can use a call-clobbered register). */
1655 ip[0] = 0x0621 + ((v & 0xffff) << 16); /* mov sym, r1 ... */
1656 ip[1] = ((v >> 16) & 0xffff) + 0x610000; /* ...; jmp r1 */
1661 /* relative distance to target */
1663 /* if the target is too far away.... */
1664 #if defined(__arm__) || defined(__powerpc__)
1665 if ((int)v < -0x02000000 || (int)v >= 0x02000000)
1666 #elif defined(__v850e__)
1667 if ((ElfW(Sword))v > 0x1fffff || (ElfW(Sword))v < (ElfW(Sword))-0x200000)
1669 /* go via the plt */
1670 v = plt + pe->offset - dot;
1672 #if defined(__v850e__)
1677 ret = obj_reloc_dangerous;
1679 /* merge the offset into the instruction. */
1680 #if defined(__arm__)
1681 /* Convert to words. */
1684 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1686 #if defined(__powerpc__)
1687 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1689 #if defined(__v850e__)
1690 /* We write two shorts instead of a long because even 32-bit insns
1691 only need half-word alignment, but the 32-bit data write needs
1692 to be long-word aligned. */
1693 ((unsigned short *)loc)[0] =
1694 (*(unsigned short *)loc & 0xffc0) /* opcode + reg */
1695 | ((v >> 16) & 0x3f); /* offs high part */
1696 ((unsigned short *)loc)[1] =
1697 (v & 0xffff); /* offs low part */
1700 #endif /* USE_PLT_ENTRIES */
1702 #if defined(USE_GOT_ENTRIES)
1705 /* needs an entry in the .got: set it, once */
1706 if (!isym->gotent.inited) {
1707 isym->gotent.inited = 1;
1708 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1710 /* make the reloc with_respect_to_.got */
1712 *loc += isym->gotent.offset + rel->r_addend;
1713 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1714 *loc += isym->gotent.offset;
1718 #endif /* USE_GOT_ENTRIES */
1725 #if defined(USE_LIST)
1727 static int arch_list_add(ElfW(RelM) *rel, struct arch_list_entry **list,
1728 int offset, int size)
1730 struct arch_list_entry *pe;
1732 for (pe = *list; pe != NULL; pe = pe->next) {
1733 if (pe->addend == rel->r_addend) {
1739 pe = xmalloc(sizeof(struct arch_list_entry));
1741 pe->addend = rel->r_addend;
1742 pe->offset = offset;
1752 #if defined(USE_SINGLE)
1754 static int arch_single_init(ElfW(RelM) *rel, struct arch_single_entry *single,
1755 int offset, int size)
1757 if (single->allocated == 0) {
1758 single->allocated = 1;
1759 single->offset = offset;
1768 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
1770 static struct obj_section *arch_xsect_init(struct obj_file *f, const char *name,
1771 int offset, int size)
1773 struct obj_section *myrelsec = obj_find_section(f, name);
1780 obj_extend_section(myrelsec, offset);
1782 myrelsec = obj_create_alloced_section(f, name,
1791 static void arch_create_got(struct obj_file *f)
1793 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
1794 struct arch_file *ifile = (struct arch_file *) f;
1796 #if defined(USE_GOT_ENTRIES)
1797 int got_offset = 0, got_needed = 0, got_allocate;
1799 #if defined(USE_PLT_ENTRIES)
1800 int plt_offset = 0, plt_needed = 0, plt_allocate;
1802 struct obj_section *relsec, *symsec, *strsec;
1803 ElfW(RelM) *rel, *relend;
1804 ElfW(Sym) *symtab, *extsym;
1805 const char *strtab, *name;
1806 struct arch_symbol *intsym;
1808 for (i = 0; i < f->header.e_shnum; ++i) {
1809 relsec = f->sections[i];
1810 if (relsec->header.sh_type != SHT_RELM)
1813 symsec = f->sections[relsec->header.sh_link];
1814 strsec = f->sections[symsec->header.sh_link];
1816 rel = (ElfW(RelM) *) relsec->contents;
1817 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1818 symtab = (ElfW(Sym) *) symsec->contents;
1819 strtab = (const char *) strsec->contents;
1821 for (; rel < relend; ++rel) {
1822 extsym = &symtab[ELF_R_SYM(rel->r_info)];
1824 #if defined(USE_GOT_ENTRIES)
1827 #if defined(USE_PLT_ENTRIES)
1831 switch (ELF_R_TYPE(rel->r_info)) {
1832 #if defined(__arm__)
1847 #elif defined(__i386__)
1857 #elif defined(__powerpc__)
1862 #elif defined(__mc68000__)
1873 #elif defined(__sh__)
1883 #elif defined(__v850e__)
1884 case R_V850_22_PCREL:
1893 if (extsym->st_name != 0) {
1894 name = strtab + extsym->st_name;
1896 name = f->sections[extsym->st_shndx]->name;
1898 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1899 #if defined(USE_GOT_ENTRIES)
1901 got_offset += arch_single_init(
1902 rel, &intsym->gotent,
1903 got_offset, GOT_ENTRY_SIZE);
1908 #if defined(USE_PLT_ENTRIES)
1910 #if defined(USE_PLT_LIST)
1911 plt_offset += arch_list_add(
1912 rel, &intsym->pltent,
1913 plt_offset, PLT_ENTRY_SIZE);
1915 plt_offset += arch_single_init(
1916 rel, &intsym->pltent,
1917 plt_offset, PLT_ENTRY_SIZE);
1925 #if defined(USE_GOT_ENTRIES)
1927 ifile->got = arch_xsect_init(f, ".got", got_offset,
1932 #if defined(USE_PLT_ENTRIES)
1934 ifile->plt = arch_xsect_init(f, ".plt", plt_offset,
1939 #endif /* defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES) */
1942 /*======================================================================*/
1944 /* Standard ELF hash function. */
1945 static unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1947 unsigned long h = 0;
1954 g = (h & 0xf0000000);
1964 static unsigned long obj_elf_hash(const char *name)
1966 return obj_elf_hash_n(name, strlen(name));
1969 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
1970 /* String comparison for non-co-versioned kernel and module. */
1972 static int ncv_strcmp(const char *a, const char *b)
1974 size_t alen = strlen(a), blen = strlen(b);
1976 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
1977 return strncmp(a, b, alen);
1978 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
1979 return strncmp(a, b, blen);
1981 return strcmp(a, b);
1984 /* String hashing for non-co-versioned kernel and module. Here
1985 we are simply forced to drop the crc from the hash. */
1987 static unsigned long ncv_symbol_hash(const char *str)
1989 size_t len = strlen(str);
1990 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
1992 return obj_elf_hash_n(str, len);
1996 obj_set_symbol_compare(struct obj_file *f,
1997 int (*cmp) (const char *, const char *),
1998 unsigned long (*hash) (const char *))
2001 f->symbol_cmp = cmp;
2003 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
2006 f->symbol_hash = hash;
2008 memcpy(tmptab, f->symtab, sizeof(tmptab));
2009 memset(f->symtab, 0, sizeof(f->symtab));
2011 for (i = 0; i < HASH_BUCKETS; ++i)
2012 for (sym = tmptab[i]; sym; sym = next) {
2013 unsigned long h = hash(sym->name) % HASH_BUCKETS;
2015 sym->next = f->symtab[h];
2021 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
2023 static struct obj_symbol *
2024 obj_add_symbol(struct obj_file *f, const char *name,
2025 unsigned long symidx, int info,
2026 int secidx, ElfW(Addr) value,
2029 struct obj_symbol *sym;
2030 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2031 int n_type = ELF_ST_TYPE(info);
2032 int n_binding = ELF_ST_BIND(info);
2034 for (sym = f->symtab[hash]; sym; sym = sym->next)
2035 if (f->symbol_cmp(sym->name, name) == 0) {
2036 int o_secidx = sym->secidx;
2037 int o_info = sym->info;
2038 int o_type = ELF_ST_TYPE(o_info);
2039 int o_binding = ELF_ST_BIND(o_info);
2041 /* A redefinition! Is it legal? */
2043 if (secidx == SHN_UNDEF)
2045 else if (o_secidx == SHN_UNDEF)
2047 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
2048 /* Cope with local and global symbols of the same name
2049 in the same object file, as might have been created
2050 by ld -r. The only reason locals are now seen at this
2051 level at all is so that we can do semi-sensible things
2054 struct obj_symbol *nsym, **p;
2056 nsym = arch_new_symbol();
2057 nsym->next = sym->next;
2060 /* Excise the old (local) symbol from the hash chain. */
2061 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
2065 } else if (n_binding == STB_LOCAL) {
2066 /* Another symbol of the same name has already been defined.
2067 Just add this to the local table. */
2068 sym = arch_new_symbol();
2071 f->local_symtab[symidx] = sym;
2073 } else if (n_binding == STB_WEAK)
2075 else if (o_binding == STB_WEAK)
2077 /* Don't unify COMMON symbols with object types the programmer
2079 else if (secidx == SHN_COMMON
2080 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
2082 else if (o_secidx == SHN_COMMON
2083 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
2086 /* Don't report an error if the symbol is coming from
2087 the kernel or some external module. */
2088 if (secidx <= SHN_HIRESERVE)
2089 bb_error_msg("%s multiply defined", name);
2094 /* Completely new symbol. */
2095 sym = arch_new_symbol();
2096 sym->next = f->symtab[hash];
2097 f->symtab[hash] = sym;
2100 if (ELF_ST_BIND(info) == STB_LOCAL && symidx != -1) {
2101 if (symidx >= f->local_symtab_size)
2102 bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
2103 name, (long) symidx, (long) f->local_symtab_size);
2105 f->local_symtab[symidx] = sym;
2112 sym->secidx = secidx;
2118 static struct obj_symbol *
2119 obj_find_symbol(struct obj_file *f, const char *name)
2121 struct obj_symbol *sym;
2122 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2124 for (sym = f->symtab[hash]; sym; sym = sym->next)
2125 if (f->symbol_cmp(sym->name, name) == 0)
2131 static ElfW(Addr) obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2134 if (sym->secidx >= SHN_LORESERVE)
2137 return sym->value + f->sections[sym->secidx]->header.sh_addr;
2139 /* As a special case, a NULL sym has value zero. */
2144 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
2146 int i, n = f->header.e_shnum;
2148 for (i = 0; i < n; ++i)
2149 if (strcmp(f->sections[i]->name, name) == 0)
2150 return f->sections[i];
2155 static int obj_load_order_prio(struct obj_section *a)
2157 unsigned long af, ac;
2159 af = a->header.sh_flags;
2162 if (a->name[0] != '.' || strlen(a->name) != 10 ||
2163 strcmp(a->name + 5, ".init"))
2167 if (!(af & SHF_WRITE))
2169 if (af & SHF_EXECINSTR)
2171 if (a->header.sh_type != SHT_NOBITS)
2178 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
2180 struct obj_section **p;
2181 int prio = obj_load_order_prio(sec);
2182 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
2183 if (obj_load_order_prio(*p) < prio)
2185 sec->load_next = *p;
2189 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2191 unsigned long align,
2194 int newidx = f->header.e_shnum++;
2195 struct obj_section *sec;
2197 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2198 f->sections[newidx] = sec = arch_new_section();
2200 sec->header.sh_type = SHT_PROGBITS;
2201 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2202 sec->header.sh_size = size;
2203 sec->header.sh_addralign = align;
2207 sec->contents = xmalloc(size);
2209 obj_insert_section_load_order(f, sec);
2214 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
2216 unsigned long align,
2219 int newidx = f->header.e_shnum++;
2220 struct obj_section *sec;
2222 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2223 f->sections[newidx] = sec = arch_new_section();
2225 sec->header.sh_type = SHT_PROGBITS;
2226 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2227 sec->header.sh_size = size;
2228 sec->header.sh_addralign = align;
2232 sec->contents = xmalloc(size);
2234 sec->load_next = f->load_order;
2235 f->load_order = sec;
2236 if (f->load_order_search_start == &f->load_order)
2237 f->load_order_search_start = &sec->load_next;
2242 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
2244 unsigned long oldsize = sec->header.sh_size;
2246 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
2248 return sec->contents + oldsize;
2252 /* Conditionally add the symbols from the given symbol set to the
2256 add_symbols_from( struct obj_file *f,
2257 int idx, struct new_module_symbol *syms, size_t nsyms)
2259 struct new_module_symbol *s;
2262 #ifdef SYMBOL_PREFIX
2264 size_t name_alloced_size = 0;
2266 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
2269 gpl = obj_gpl_license(f, NULL) == 0;
2271 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
2272 /* Only add symbols that are already marked external.
2273 If we override locals we may cause problems for
2274 argument initialization. We will also create a false
2275 dependency on the module. */
2276 struct obj_symbol *sym;
2279 /* GPL licensed modules can use symbols exported with
2280 * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the
2281 * exported names. Non-GPL modules never see any GPLONLY_
2282 * symbols so they cannot fudge it by adding the prefix on
2285 if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) {
2286 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
2293 name = (char *)s->name;
2295 #ifdef SYMBOL_PREFIX
2296 /* Prepend SYMBOL_PREFIX to the symbol's name (the
2297 kernel exports `C names', but module object files
2298 reference `linker names'). */
2299 size_t extra = sizeof SYMBOL_PREFIX;
2300 size_t name_size = strlen(name) + extra;
2301 if (name_size > name_alloced_size) {
2302 name_alloced_size = name_size * 2;
2303 name_buf = alloca(name_alloced_size);
2305 strcpy(name_buf, SYMBOL_PREFIX);
2306 strcpy(name_buf + extra - 1, name);
2308 #endif /* SYMBOL_PREFIX */
2310 sym = obj_find_symbol(f, name);
2311 if (sym && !(ELF_ST_BIND(sym->info) == STB_LOCAL)) {
2312 #ifdef SYMBOL_PREFIX
2313 /* Put NAME_BUF into more permanent storage. */
2314 name = xmalloc(name_size);
2315 strcpy(name, name_buf);
2317 sym = obj_add_symbol(f, name, -1,
2318 ELF_ST_INFO(STB_GLOBAL,
2321 /* Did our symbol just get installed? If so, mark the
2322 module as "used". */
2323 if (sym->secidx == idx)
2331 static void add_kernel_symbols(struct obj_file *f)
2333 struct external_module *m;
2336 /* Add module symbols first. */
2338 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m) {
2340 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms)
2347 n_ext_modules_used = nused;
2349 /* And finally the symbols from the kernel proper. */
2352 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
2355 static char *get_modinfo_value(struct obj_file *f, const char *key)
2357 struct obj_section *sec;
2358 char *p, *v, *n, *ep;
2359 size_t klen = strlen(key);
2361 sec = obj_find_section(f, ".modinfo");
2365 ep = p + sec->header.sh_size;
2368 n = strchr(p, '\0');
2370 if (p + klen == v && strncmp(p, key, klen) == 0)
2373 if (p + klen == n && strcmp(p, key) == 0)
2383 /*======================================================================*/
2384 /* Functions relating to module loading after 2.1.18. */
2387 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2390 char *p, *q, *key, *sym_name;
2391 struct obj_symbol *sym;
2392 char *contents, *loc;
2402 key = alloca(q - p + 6);
2403 memcpy(key, "parm_", 5);
2404 memcpy(key + 5, p, q - p);
2407 p = get_modinfo_value(f, key);
2410 bb_error_msg_and_die("invalid parameter %s", key);
2413 #ifdef SYMBOL_PREFIX
2414 sym_name = alloca(strlen(key) + sizeof SYMBOL_PREFIX);
2415 strcpy(sym_name, SYMBOL_PREFIX);
2416 strcat(sym_name, key);
2420 sym = obj_find_symbol(f, sym_name);
2422 /* Also check that the parameter was not resolved from the kernel. */
2423 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2424 bb_error_msg_and_die("symbol for parameter %s not found", key);
2428 min = strtoul(p, &p, 10);
2430 max = strtoul(p + 1, &p, 10);
2436 contents = f->sections[sym->secidx]->contents;
2437 loc = contents + sym->value;
2441 if ((*p == 's') || (*p == 'c')) {
2444 /* Do C quoting if we begin with a ", else slurp the lot. */
2448 str = alloca(strlen(q));
2449 for (r = str, q++; *q != '"'; ++q, ++r) {
2451 bb_error_msg_and_die("improperly terminated string argument for %s",
2487 if (q[1] >= '0' && q[1] <= '7') {
2488 c = (c * 8) + *++q - '0';
2489 if (q[1] >= '0' && q[1] <= '7')
2490 c = (c * 8) + *++q - '0';
2508 /* In this case, the string is not quoted. We will break
2509 it using the coma (like for ints). If the user wants to
2510 include comas in a string, he just has to quote it */
2512 /* Search the next coma */
2516 if (r != (char *) NULL) {
2517 /* Recopy the current field */
2518 str = alloca(r - q + 1);
2519 memcpy(str, q, r - q);
2521 /* I don't know if it is useful, as the previous case
2522 doesn't nul terminate the string ??? */
2525 /* Keep next fields */
2536 obj_string_patch(f, sym->secidx, loc - contents, str);
2537 loc += tgt_sizeof_char_p;
2539 /* Array of chars (in fact, matrix!) */
2540 unsigned long charssize; /* size of each member */
2542 /* Get the size of each member */
2543 /* Probably we should do that outside the loop ? */
2544 if (!isdigit(*(p + 1))) {
2545 bb_error_msg_and_die("parameter type 'c' for %s must be followed by"
2546 " the maximum size", key);
2548 charssize = strtoul(p + 1, (char **) NULL, 10);
2551 if (strlen(str) >= charssize) {
2552 bb_error_msg_and_die("string too long for %s (max %ld)", key,
2556 /* Copy to location */
2557 strcpy((char *) loc, str);
2561 long v = strtoul(q, &q, 0);
2568 loc += tgt_sizeof_short;
2572 loc += tgt_sizeof_int;
2576 loc += tgt_sizeof_long;
2580 bb_error_msg_and_die("unknown parameter type '%c' for %s", *p, key);
2593 goto retry_end_of_value;
2597 bb_error_msg_and_die("too many values for %s (max %d)", key, max);
2603 bb_error_msg_and_die("invalid argument syntax for %s", key);
2608 bb_error_msg_and_die("too few values for %s (min %d)", key, min);
2616 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
2617 static int new_is_module_checksummed(struct obj_file *f)
2619 const char *p = get_modinfo_value(f, "using_checksums");
2625 /* Get the module's kernel version in the canonical integer form. */
2628 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2633 p = get_modinfo_value(f, "kernel_version");
2636 safe_strncpy(str, p, STRVERSIONLEN);
2638 a = strtoul(p, &p, 10);
2641 b = strtoul(p + 1, &p, 10);
2644 c = strtoul(p + 1, &q, 10);
2648 return a << 16 | b << 8 | c;
2651 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
2654 /* Fetch the loaded modules, and all currently exported symbols. */
2656 static void new_get_kernel_symbols(void)
2658 char *module_names, *mn;
2659 struct external_module *modules, *m;
2660 struct new_module_symbol *syms, *s;
2661 size_t ret, bufsize, nmod, nsyms, i, j;
2663 /* Collect the loaded modules. */
2666 module_names = xmalloc(bufsize);
2669 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2670 if (errno == ENOSPC && bufsize < ret) {
2672 module_names = xrealloc(module_names, bufsize);
2673 goto retry_modules_load;
2675 bb_perror_msg_and_die("QM_MODULES");
2678 n_ext_modules = nmod = ret;
2680 /* Collect the modules' symbols. */
2683 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2684 memset(modules, 0, nmod * sizeof(*modules));
2685 for (i = 0, mn = module_names, m = modules;
2686 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2687 struct new_module_info info;
2689 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2690 if (errno == ENOENT) {
2691 /* The module was removed out from underneath us. */
2694 bb_perror_msg_and_die("query_module: QM_INFO: %s", mn);
2698 syms = xmalloc(bufsize);
2700 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2704 syms = xrealloc(syms, bufsize);
2705 goto retry_mod_sym_load;
2707 /* The module was removed out from underneath us. */
2710 bb_perror_msg_and_die("query_module: QM_SYMBOLS: %s", mn);
2716 m->addr = info.addr;
2720 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2721 s->name += (unsigned long) syms;
2726 /* Collect the kernel's symbols. */
2728 syms = xmalloc(bufsize = 16 * 1024);
2729 retry_kern_sym_load:
2730 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2731 if (errno == ENOSPC && bufsize < ret) {
2732 syms = xrealloc(syms, bufsize = ret);
2733 goto retry_kern_sym_load;
2735 bb_perror_msg_and_die("kernel: QM_SYMBOLS");
2737 nksyms = nsyms = ret;
2740 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2741 s->name += (unsigned long) syms;
2746 /* Return the kernel symbol checksum version, or zero if not used. */
2748 static int new_is_kernel_checksummed(void)
2750 struct new_module_symbol *s;
2753 /* Using_Versions is not the first symbol, but it should be in there. */
2755 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2756 if (strcmp((char *) s->name, "Using_Versions") == 0)
2763 static void new_create_this_module(struct obj_file *f, const char *m_name)
2765 struct obj_section *sec;
2767 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2768 sizeof(struct new_module));
2769 memset(sec->contents, 0, sizeof(struct new_module));
2771 obj_add_symbol(f, SPFX "__this_module", -1,
2772 ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0,
2773 sizeof(struct new_module));
2775 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2779 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
2780 /* add an entry to the __ksymtab section, creating it if necessary */
2781 static void new_add_ksymtab(struct obj_file *f, struct obj_symbol *sym)
2783 struct obj_section *sec;
2786 /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section.
2787 * If __ksymtab is defined but not marked alloc, x out the first character
2788 * (no obj_delete routine) and create a new __ksymtab with the correct
2791 sec = obj_find_section(f, "__ksymtab");
2792 if (sec && !(sec->header.sh_flags & SHF_ALLOC)) {
2793 *((char *)(sec->name)) = 'x'; /* override const */
2797 sec = obj_create_alloced_section(f, "__ksymtab",
2798 tgt_sizeof_void_p, 0);
2801 sec->header.sh_flags |= SHF_ALLOC;
2802 /* Empty section might be byte-aligned */
2803 sec->header.sh_addralign = tgt_sizeof_void_p;
2804 ofs = sec->header.sh_size;
2805 obj_symbol_patch(f, sec->idx, ofs, sym);
2806 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name);
2807 obj_extend_section(sec, 2 * tgt_sizeof_char_p);
2809 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
2811 static int new_create_module_ksymtab(struct obj_file *f)
2813 struct obj_section *sec;
2816 /* We must always add the module references. */
2818 if (n_ext_modules_used) {
2819 struct new_module_ref *dep;
2820 struct obj_symbol *tm;
2822 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2823 (sizeof(struct new_module_ref)
2824 * n_ext_modules_used));
2828 tm = obj_find_symbol(f, SPFX "__this_module");
2829 dep = (struct new_module_ref *) sec->contents;
2830 for (i = 0; i < n_ext_modules; ++i)
2831 if (ext_modules[i].used) {
2832 dep->dep = ext_modules[i].addr;
2833 obj_symbol_patch(f, sec->idx,
2834 (char *) &dep->ref - sec->contents, tm);
2840 if (!flag_noexport && !obj_find_section(f, "__ksymtab")) {
2844 sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0);
2846 /* We don't want to export symbols residing in sections that
2847 aren't loaded. There are a number of these created so that
2848 we make sure certain module options don't appear twice. */
2850 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2852 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2854 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2855 struct obj_symbol *sym;
2856 for (sym = f->symtab[i]; sym; sym = sym->next)
2857 if (ELF_ST_BIND(sym->info) != STB_LOCAL
2858 && sym->secidx <= SHN_HIRESERVE
2859 && (sym->secidx >= SHN_LORESERVE
2860 || loaded[sym->secidx])) {
2861 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2863 obj_symbol_patch(f, sec->idx, ofs, sym);
2864 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2871 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2879 new_init_module(const char *m_name, struct obj_file *f, unsigned long m_size)
2881 struct new_module *module;
2882 struct obj_section *sec;
2887 sec = obj_find_section(f, ".this");
2888 if (!sec || !sec->contents) {
2889 bb_perror_msg_and_die("corrupt module %s?",m_name);
2891 module = (struct new_module *) sec->contents;
2892 m_addr = sec->header.sh_addr;
2894 module->size_of_struct = sizeof(*module);
2895 module->size = m_size;
2896 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2898 sec = obj_find_section(f, "__ksymtab");
2899 if (sec && sec->header.sh_size) {
2900 module->syms = sec->header.sh_addr;
2901 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2904 if (n_ext_modules_used) {
2905 sec = obj_find_section(f, ".kmodtab");
2906 module->deps = sec->header.sh_addr;
2907 module->ndeps = n_ext_modules_used;
2911 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "init_module"));
2913 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "cleanup_module"));
2915 sec = obj_find_section(f, "__ex_table");
2917 module->ex_table_start = sec->header.sh_addr;
2918 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2921 sec = obj_find_section(f, ".text.init");
2923 module->runsize = sec->header.sh_addr - m_addr;
2925 sec = obj_find_section(f, ".data.init");
2927 if (!module->runsize ||
2928 module->runsize > sec->header.sh_addr - m_addr)
2929 module->runsize = sec->header.sh_addr - m_addr;
2931 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2932 if (sec && sec->header.sh_size) {
2933 module->archdata_start = (void*)sec->header.sh_addr;
2934 module->archdata_end = module->archdata_start + sec->header.sh_size;
2936 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2937 if (sec && sec->header.sh_size) {
2938 module->kallsyms_start = (void*)sec->header.sh_addr;
2939 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2942 /* Whew! All of the initialization is complete. Collect the final
2943 module image and give it to the kernel. */
2945 image = xmalloc(m_size);
2946 obj_create_image(f, image);
2948 ret = init_module(m_name, (struct new_module *) image);
2950 bb_perror_msg("init_module: %s", m_name);
2958 /*======================================================================*/
2961 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2964 struct obj_string_patch *p;
2965 struct obj_section *strsec;
2966 size_t len = strlen(string) + 1;
2969 p = xmalloc(sizeof(*p));
2970 p->next = f->string_patches;
2971 p->reloc_secidx = secidx;
2972 p->reloc_offset = offset;
2973 f->string_patches = p;
2975 strsec = obj_find_section(f, ".kstrtab");
2976 if (strsec == NULL) {
2977 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
2978 p->string_offset = 0;
2979 loc = strsec->contents;
2981 p->string_offset = strsec->header.sh_size;
2982 loc = obj_extend_section(strsec, len);
2984 memcpy(loc, string, len);
2988 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2989 struct obj_symbol *sym)
2991 struct obj_symbol_patch *p;
2993 p = xmalloc(sizeof(*p));
2994 p->next = f->symbol_patches;
2995 p->reloc_secidx = secidx;
2996 p->reloc_offset = offset;
2998 f->symbol_patches = p;
3001 static void obj_check_undefineds(struct obj_file *f)
3005 for (i = 0; i < HASH_BUCKETS; ++i) {
3006 struct obj_symbol *sym;
3007 for (sym = f->symtab[i]; sym; sym = sym->next)
3008 if (sym->secidx == SHN_UNDEF) {
3009 if (ELF_ST_BIND(sym->info) == STB_WEAK) {
3010 sym->secidx = SHN_ABS;
3014 bb_error_msg_and_die("unresolved symbol %s", sym->name);
3020 static void obj_allocate_commons(struct obj_file *f)
3022 struct common_entry {
3023 struct common_entry *next;
3024 struct obj_symbol *sym;
3025 } *common_head = NULL;
3029 for (i = 0; i < HASH_BUCKETS; ++i) {
3030 struct obj_symbol *sym;
3031 for (sym = f->symtab[i]; sym; sym = sym->next)
3032 if (sym->secidx == SHN_COMMON) {
3033 /* Collect all COMMON symbols and sort them by size so as to
3034 minimize space wasted by alignment requirements. */
3036 struct common_entry **p, *n;
3037 for (p = &common_head; *p; p = &(*p)->next)
3038 if (sym->size <= (*p)->sym->size)
3041 n = alloca(sizeof(*n));
3049 for (i = 1; i < f->local_symtab_size; ++i) {
3050 struct obj_symbol *sym = f->local_symtab[i];
3051 if (sym && sym->secidx == SHN_COMMON) {
3052 struct common_entry **p, *n;
3053 for (p = &common_head; *p; p = &(*p)->next)
3054 if (sym == (*p)->sym)
3056 else if (sym->size < (*p)->sym->size) {
3057 n = alloca(sizeof(*n));
3067 /* Find the bss section. */
3068 for (i = 0; i < f->header.e_shnum; ++i)
3069 if (f->sections[i]->header.sh_type == SHT_NOBITS)
3072 /* If for some reason there hadn't been one, create one. */
3073 if (i == f->header.e_shnum) {
3074 struct obj_section *sec;
3076 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
3077 f->sections[i] = sec = arch_new_section();
3078 f->header.e_shnum = i + 1;
3080 sec->header.sh_type = SHT_PROGBITS;
3081 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
3086 /* Allocate the COMMONS. */
3088 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
3089 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
3090 struct common_entry *c;
3092 for (c = common_head; c; c = c->next) {
3093 ElfW(Addr) align = c->sym->value;
3095 if (align > max_align)
3097 if (bss_size & (align - 1))
3098 bss_size = (bss_size | (align - 1)) + 1;
3101 c->sym->value = bss_size;
3103 bss_size += c->sym->size;
3106 f->sections[i]->header.sh_size = bss_size;
3107 f->sections[i]->header.sh_addralign = max_align;
3111 /* For the sake of patch relocation and parameter initialization,
3112 allocate zeroed data for NOBITS sections now. Note that after
3113 this we cannot assume NOBITS are really empty. */
3114 for (i = 0; i < f->header.e_shnum; ++i) {
3115 struct obj_section *s = f->sections[i];
3116 if (s->header.sh_type == SHT_NOBITS) {
3117 if (s->header.sh_size != 0)
3118 s->contents = memset(xmalloc(s->header.sh_size),
3119 0, s->header.sh_size);
3123 s->header.sh_type = SHT_PROGBITS;
3128 static unsigned long obj_load_size(struct obj_file *f)
3130 unsigned long dot = 0;
3131 struct obj_section *sec;
3133 /* Finalize the positions of the sections relative to one another. */
3135 for (sec = f->load_order; sec; sec = sec->load_next) {
3138 align = sec->header.sh_addralign;
3139 if (align && (dot & (align - 1)))
3140 dot = (dot | (align - 1)) + 1;
3142 sec->header.sh_addr = dot;
3143 dot += sec->header.sh_size;
3149 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
3151 int i, n = f->header.e_shnum;
3154 /* Finalize the addresses of the sections. */
3157 for (i = 0; i < n; ++i)
3158 f->sections[i]->header.sh_addr += base;
3160 /* And iterate over all of the relocations. */
3162 for (i = 0; i < n; ++i) {
3163 struct obj_section *relsec, *symsec, *targsec, *strsec;
3164 ElfW(RelM) * rel, *relend;
3168 relsec = f->sections[i];
3169 if (relsec->header.sh_type != SHT_RELM)
3172 symsec = f->sections[relsec->header.sh_link];
3173 targsec = f->sections[relsec->header.sh_info];
3174 strsec = f->sections[symsec->header.sh_link];
3176 rel = (ElfW(RelM) *) relsec->contents;
3177 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
3178 symtab = (ElfW(Sym) *) symsec->contents;
3179 strtab = (const char *) strsec->contents;
3181 for (; rel < relend; ++rel) {
3182 ElfW(Addr) value = 0;
3183 struct obj_symbol *intsym = NULL;
3184 unsigned long symndx;
3185 ElfW(Sym) * extsym = 0;
3188 /* Attempt to find a value to use for this relocation. */
3190 symndx = ELF_R_SYM(rel->r_info);
3192 /* Note we've already checked for undefined symbols. */
3194 extsym = &symtab[symndx];
3195 if (ELF_ST_BIND(extsym->st_info) == STB_LOCAL) {
3196 /* Local symbols we look up in the local table to be sure
3197 we get the one that is really intended. */
3198 intsym = f->local_symtab[symndx];
3200 /* Others we look up in the hash table. */
3202 if (extsym->st_name)
3203 name = strtab + extsym->st_name;
3205 name = f->sections[extsym->st_shndx]->name;
3206 intsym = obj_find_symbol(f, name);
3209 value = obj_symbol_final_value(f, intsym);
3210 intsym->referenced = 1;
3212 #if SHT_RELM == SHT_RELA
3213 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
3214 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
3215 if (!extsym || !extsym->st_name ||
3216 ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
3218 value += rel->r_addend;
3222 switch (arch_apply_relocation
3223 (f, targsec, symsec, intsym, rel, value)
3228 case obj_reloc_overflow:
3229 errmsg = "Relocation overflow";
3231 case obj_reloc_dangerous:
3232 errmsg = "Dangerous relocation";
3234 case obj_reloc_unhandled:
3235 errmsg = "Unhandled relocation";
3238 bb_error_msg("%s of type %ld for %s", errmsg,
3239 (long) ELF_R_TYPE(rel->r_info),
3240 strtab + extsym->st_name);
3242 bb_error_msg("%s of type %ld", errmsg,
3243 (long) ELF_R_TYPE(rel->r_info));
3251 /* Finally, take care of the patches. */
3253 if (f->string_patches) {
3254 struct obj_string_patch *p;
3255 struct obj_section *strsec;
3256 ElfW(Addr) strsec_base;
3257 strsec = obj_find_section(f, ".kstrtab");
3258 strsec_base = strsec->header.sh_addr;
3260 for (p = f->string_patches; p; p = p->next) {
3261 struct obj_section *targsec = f->sections[p->reloc_secidx];
3262 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3263 = strsec_base + p->string_offset;
3267 if (f->symbol_patches) {
3268 struct obj_symbol_patch *p;
3270 for (p = f->symbol_patches; p; p = p->next) {
3271 struct obj_section *targsec = f->sections[p->reloc_secidx];
3272 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3273 = obj_symbol_final_value(f, p->sym);
3280 static int obj_create_image(struct obj_file *f, char *image)
3282 struct obj_section *sec;
3283 ElfW(Addr) base = f->baseaddr;
3285 for (sec = f->load_order; sec; sec = sec->load_next) {
3288 if (sec->contents == 0 || sec->header.sh_size == 0)
3291 secimg = image + (sec->header.sh_addr - base);
3293 /* Note that we allocated data for NOBITS sections earlier. */
3294 memcpy(secimg, sec->contents, sec->header.sh_size);
3300 /*======================================================================*/
3302 static struct obj_file *obj_load(FILE * fp, int loadprogbits)
3305 ElfW(Shdr) * section_headers;
3309 /* Read the file header. */
3311 f = arch_new_file();
3312 f->symbol_cmp = strcmp;
3313 f->symbol_hash = obj_elf_hash;
3314 f->load_order_search_start = &f->load_order;
3316 fseek(fp, 0, SEEK_SET);
3317 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
3318 bb_perror_msg_and_die("error reading ELF header");
3321 if (f->header.e_ident[EI_MAG0] != ELFMAG0
3322 || f->header.e_ident[EI_MAG1] != ELFMAG1
3323 || f->header.e_ident[EI_MAG2] != ELFMAG2
3324 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
3325 bb_error_msg_and_die("not an ELF file");
3327 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3328 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN
3329 ? ELFDATA2MSB : ELFDATA2LSB)
3330 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3331 || !MATCH_MACHINE(f->header.e_machine)) {
3332 bb_error_msg_and_die("ELF file not for this architecture");
3334 if (f->header.e_type != ET_REL) {
3335 bb_error_msg_and_die("ELF file not a relocatable object");
3338 /* Read the section headers. */
3340 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3341 bb_error_msg_and_die("section header size mismatch: %lu != %lu",
3342 (unsigned long) f->header.e_shentsize,
3343 (unsigned long) sizeof(ElfW(Shdr)));
3346 shnum = f->header.e_shnum;
3347 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3348 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3350 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3351 fseek(fp, f->header.e_shoff, SEEK_SET);
3352 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3353 bb_perror_msg_and_die("error reading ELF section headers");
3356 /* Read the section data. */
3358 for (i = 0; i < shnum; ++i) {
3359 struct obj_section *sec;
3361 f->sections[i] = sec = arch_new_section();
3363 sec->header = section_headers[i];
3366 if (sec->header.sh_size) {
3367 switch (sec->header.sh_type) {
3376 if (!loadprogbits) {
3377 sec->contents = NULL;
3384 if (sec->header.sh_size > 0) {
3385 sec->contents = xmalloc(sec->header.sh_size);
3386 fseek(fp, sec->header.sh_offset, SEEK_SET);
3387 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3388 bb_perror_msg_and_die("error reading ELF section data");
3391 sec->contents = NULL;
3395 #if SHT_RELM == SHT_REL
3397 bb_error_msg_and_die("RELA relocations not supported on this architecture");
3400 bb_error_msg_and_die("REL relocations not supported on this architecture");
3403 if (sec->header.sh_type >= SHT_LOPROC) {
3404 /* Assume processor specific section types are debug
3405 info and can safely be ignored. If this is ever not
3406 the case (Hello MIPS?), don't put ifdefs here but
3407 create an arch_load_proc_section(). */
3411 bb_error_msg_and_die("can't handle sections of type %ld",
3412 (long) sec->header.sh_type);
3417 /* Do what sort of interpretation as needed by each section. */
3419 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3421 for (i = 0; i < shnum; ++i) {
3422 struct obj_section *sec = f->sections[i];
3423 sec->name = shstrtab + sec->header.sh_name;
3426 for (i = 0; i < shnum; ++i) {
3427 struct obj_section *sec = f->sections[i];
3429 /* .modinfo should be contents only but gcc has no attribute for that.
3430 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3432 if (strcmp(sec->name, ".modinfo") == 0)
3433 sec->header.sh_flags &= ~SHF_ALLOC;
3435 if (sec->header.sh_flags & SHF_ALLOC)
3436 obj_insert_section_load_order(f, sec);
3438 switch (sec->header.sh_type) {
3441 unsigned long nsym, j;
3445 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3446 bb_error_msg_and_die("symbol size mismatch: %lu != %lu",
3447 (unsigned long) sec->header.sh_entsize,
3448 (unsigned long) sizeof(ElfW(Sym)));
3451 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3452 strtab = f->sections[sec->header.sh_link]->contents;
3453 sym = (ElfW(Sym) *) sec->contents;
3455 /* Allocate space for a table of local symbols. */
3456 j = f->local_symtab_size = sec->header.sh_info;
3457 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3459 /* Insert all symbols into the hash table. */
3460 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3461 ElfW(Addr) val = sym->st_value;
3464 name = strtab + sym->st_name;
3465 else if (sym->st_shndx < shnum)
3466 name = f->sections[sym->st_shndx]->name;
3469 #if defined(__SH5__)
3471 * For sh64 it is possible that the target of a branch
3472 * requires a mode switch (32 to 16 and back again).
3474 * This is implied by the lsb being set in the target
3475 * address for SHmedia mode and clear for SHcompact.
3477 val |= sym->st_other & 4;
3479 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3486 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3487 bb_error_msg_and_die("relocation entry size mismatch: %lu != %lu",
3488 (unsigned long) sec->header.sh_entsize,
3489 (unsigned long) sizeof(ElfW(RelM)));
3492 /* XXX Relocation code from modutils-2.3.19 is not here.
3493 * Why? That's about 20 lines of code from obj/obj_load.c,
3494 * which gets done in a second pass through the sections.
3495 * This BusyBox insmod does similar work in obj_relocate(). */
3502 #if ENABLE_FEATURE_INSMOD_LOADINKMEM
3504 * load the unloaded sections directly into the memory allocated by
3505 * kernel for the module
3508 static int obj_load_progbits(FILE * fp, struct obj_file* f, char* imagebase)
3510 ElfW(Addr) base = f->baseaddr;
3511 struct obj_section* sec;
3513 for (sec = f->load_order; sec; sec = sec->load_next) {
3515 /* section already loaded? */
3516 if (sec->contents != NULL)
3519 if (sec->header.sh_size == 0)
3522 sec->contents = imagebase + (sec->header.sh_addr - base);
3523 fseek(fp, sec->header.sh_offset, SEEK_SET);
3524 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3525 bb_perror_msg("error reading ELF section data");
3534 static void hide_special_symbols(struct obj_file *f)
3536 static const char *const specials[] = {
3537 SPFX "cleanup_module",
3539 SPFX "kernel_version",
3543 struct obj_symbol *sym;
3544 const char *const *p;
3546 for (p = specials; *p; ++p) {
3547 sym = obj_find_symbol(f, *p);
3549 sym->info = ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info));
3554 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
3555 static int obj_gpl_license(struct obj_file *f, const char **license)
3557 struct obj_section *sec;
3558 /* This list must match *exactly* the list of allowable licenses in
3559 * linux/include/linux/module.h. Checking for leading "GPL" will not
3560 * work, somebody will use "GPL sucks, this is proprietary".
3562 static const char *const gpl_licenses[] = {
3565 "GPL and additional rights",
3570 sec = obj_find_section(f, ".modinfo");
3572 const char *value, *ptr, *endptr;
3573 ptr = sec->contents;
3574 endptr = ptr + sec->header.sh_size;
3575 while (ptr < endptr) {
3576 value = strchr(ptr, '=');
3577 if (value && strncmp(ptr, "license", value-ptr) == 0) {
3581 for (i = 0; i < ARRAY_SIZE(gpl_licenses); ++i) {
3582 if (strcmp(value+1, gpl_licenses[i]) == 0)
3587 ptr = strchr(ptr, '\0');
3597 #define TAINT_FILENAME "/proc/sys/kernel/tainted"
3598 #define TAINT_PROPRIETORY_MODULE (1 << 0)
3599 #define TAINT_FORCED_MODULE (1 << 1)
3600 #define TAINT_UNSAFE_SMP (1 << 2)
3601 #define TAINT_URL "http://www.tux.org/lkml/#export-tainted"
3603 static void set_tainted(int fd, char *m_name,
3604 int kernel_has_tainted, int taint, const char *text1, const char *text2)
3606 static smallint printed_info;
3611 if (fd < 0 && !kernel_has_tainted)
3612 return; /* New modutils on old kernel */
3613 printf("Warning: loading %s will taint the kernel: %s%s\n",
3614 m_name, text1, text2);
3615 if (!printed_info) {
3616 printf(" See %s for information about tainted modules\n", TAINT_URL);
3620 read(fd, buf, sizeof(buf)-1);
3621 buf[sizeof(buf)-1] = '\0';
3622 oldval = strtoul(buf, NULL, 10);
3623 sprintf(buf, "%d\n", oldval | taint);
3624 write(fd, buf, strlen(buf));
3628 /* Check if loading this module will taint the kernel. */
3629 static void check_tainted_module(struct obj_file *f, char *m_name)
3631 static const char tainted_file[] ALIGN1 = TAINT_FILENAME;
3633 int fd, kernel_has_tainted;
3636 kernel_has_tainted = 1;
3637 fd = open(tainted_file, O_RDWR);
3639 if (errno == ENOENT)
3640 kernel_has_tainted = 0;
3641 else if (errno == EACCES)
3642 kernel_has_tainted = 1;
3644 perror(tainted_file);
3645 kernel_has_tainted = 0;
3649 switch (obj_gpl_license(f, &ptr)) {
3653 set_tainted(fd, m_name, kernel_has_tainted, TAINT_PROPRIETORY_MODULE, "no license", "");
3656 /* The module has a non-GPL license so we pretend that the
3657 * kernel always has a taint flag to get a warning even on
3658 * kernels without the proc flag.
3660 set_tainted(fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr);
3663 set_tainted(fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", "");
3667 if (flag_force_load)
3668 set_tainted(fd, m_name, 1, TAINT_FORCED_MODULE, "forced load", "");
3673 #else /* FEATURE_CHECK_TAINTED_MODULE */
3674 #define check_tainted_module(x, y) do { } while (0);
3675 #endif /* FEATURE_CHECK_TAINTED_MODULE */
3677 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
3678 /* add module source, timestamp, kernel version and a symbol for the
3679 * start of some sections. this info is used by ksymoops to do better
3683 get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
3685 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3686 return new_get_module_version(f, str);
3687 #else /* FEATURE_INSMOD_VERSION_CHECKING */
3688 strncpy(str, "???", sizeof(str));
3690 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
3693 /* add module source, timestamp, kernel version and a symbol for the
3694 * start of some sections. this info is used by ksymoops to do better
3698 add_ksymoops_symbols(struct obj_file *f, const char *filename,
3701 static const char symprefix[] ALIGN1 = "__insmod_";
3702 static const char section_names[][8] = {
3710 struct obj_section *sec;
3711 struct obj_symbol *sym;
3712 char *name, *absolute_filename;
3713 char str[STRVERSIONLEN];
3714 int i, l, lm_name, lfilename, use_ksymtab, version;
3715 struct stat statbuf;
3717 /* WARNING: was using realpath, but replaced by readlink to stop using
3718 * lots of stack. But here it seems to be able to cause problems? */
3719 absolute_filename = xmalloc_readlink(filename);
3720 if (!absolute_filename)
3721 absolute_filename = xstrdup(filename);
3723 lm_name = strlen(m_name);
3724 lfilename = strlen(absolute_filename);
3726 /* add to ksymtab if it already exists or there is no ksymtab and other symbols
3727 * are not to be exported. otherwise leave ksymtab alone for now, the
3728 * "export all symbols" compatibility code will export these symbols later.
3730 use_ksymtab = obj_find_section(f, "__ksymtab") || flag_noexport;
3732 sec = obj_find_section(f, ".this");
3734 /* tag the module header with the object name, last modified
3735 * timestamp and module version. worst case for module version
3736 * is 0xffffff, decimal 16777215. putting all three fields in
3737 * one symbol is less readable but saves kernel space.
3739 l = sizeof(symprefix) + /* "__insmod_" */
3740 lm_name + /* module name */
3742 lfilename + /* object filename */
3744 2 * sizeof(statbuf.st_mtime) + /* mtime in hex */
3746 8 + /* version in dec */
3749 if (stat(absolute_filename, &statbuf) != 0)
3750 statbuf.st_mtime = 0;
3751 version = get_module_version(f, str); /* -1 if not found */
3752 snprintf(name, l, "%s%s_O%s_M%0*lX_V%d",
3753 symprefix, m_name, absolute_filename,
3754 (int)(2 * sizeof(statbuf.st_mtime)), statbuf.st_mtime,
3756 sym = obj_add_symbol(f, name, -1,
3757 ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3758 sec->idx, sec->header.sh_addr, 0);
3760 new_add_ksymtab(f, sym);
3762 free(absolute_filename);
3763 #ifdef _NOT_SUPPORTED_
3764 /* record where the persistent data is going, same address as previous symbol */
3767 l = sizeof(symprefix) + /* "__insmod_" */
3768 lm_name + /* module name */
3770 strlen(f->persist) + /* data store */
3773 snprintf(name, l, "%s%s_P%s",
3774 symprefix, m_name, f->persist);
3775 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3776 sec->idx, sec->header.sh_addr, 0);
3778 new_add_ksymtab(f, sym);
3780 #endif /* _NOT_SUPPORTED_ */
3781 /* tag the desired sections if size is non-zero */
3783 for (i = 0; i < ARRAY_SIZE(section_names); ++i) {
3784 sec = obj_find_section(f, section_names[i]);
3785 if (sec && sec->header.sh_size) {
3786 l = sizeof(symprefix) + /* "__insmod_" */
3787 lm_name + /* module name */
3789 strlen(sec->name) + /* section name */
3791 8 + /* length in dec */
3794 snprintf(name, l, "%s%s_S%s_L%ld",
3795 symprefix, m_name, sec->name,
3796 (long)sec->header.sh_size);
3797 sym = obj_add_symbol(f, name, -1, ELF_ST_INFO(STB_GLOBAL, STT_NOTYPE),
3798 sec->idx, sec->header.sh_addr, 0);
3800 new_add_ksymtab(f, sym);
3804 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
3806 #if ENABLE_FEATURE_INSMOD_LOAD_MAP
3807 static void print_load_map(struct obj_file *f)
3809 struct obj_section *sec;
3810 #if ENABLE_FEATURE_INSMOD_LOAD_MAP_FULL
3811 struct obj_symbol **all, **p;
3812 int i, nsyms, *loaded;
3813 struct obj_symbol *sym;
3815 /* Report on the section layout. */
3817 printf("Sections: Size %-*s Align\n",
3818 (int) (2 * sizeof(void *)), "Address");
3820 for (sec = f->load_order; sec; sec = sec->load_next) {
3824 for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a)
3829 printf("%-15s %08lx %0*lx 2**%d\n",
3831 (long)sec->header.sh_size,
3832 (int) (2 * sizeof(void *)),
3833 (long)sec->header.sh_addr,
3836 #if ENABLE_FEATURE_INSMOD_LOAD_MAP_FULL
3837 /* Quick reference which section indicies are loaded. */
3839 i = f->header.e_shnum;
3840 loaded = alloca(sizeof(int) * i);
3842 loaded[i] = ((f->sections[i]->header.sh_flags & SHF_ALLOC) != 0);
3844 /* Collect the symbols we'll be listing. */
3846 for (nsyms = i = 0; i < HASH_BUCKETS; ++i)
3847 for (sym = f->symtab[i]; sym; sym = sym->next)
3848 if (sym->secidx <= SHN_HIRESERVE
3849 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3852 all = alloca(nsyms * sizeof(struct obj_symbol *));
3854 for (i = 0, p = all; i < HASH_BUCKETS; ++i)
3855 for (sym = f->symtab[i]; sym; sym = sym->next)
3856 if (sym->secidx <= SHN_HIRESERVE
3857 && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx]))
3860 /* And list them. */
3861 printf("\nSymbols:\n");
3862 for (p = all; p < all + nsyms; ++p) {
3864 unsigned long value;
3867 if (sym->secidx == SHN_ABS) {
3870 } else if (sym->secidx == SHN_UNDEF) {
3874 sec = f->sections[sym->secidx];
3876 if (sec->header.sh_type == SHT_NOBITS)
3878 else if (sec->header.sh_flags & SHF_ALLOC) {
3879 if (sec->header.sh_flags & SHF_EXECINSTR)
3881 else if (sec->header.sh_flags & SHF_WRITE)
3886 value = sym->value + sec->header.sh_addr;
3889 if (ELF_ST_BIND(sym->info) == STB_LOCAL)
3890 type = tolower(type);
3892 printf("%0*lx %c %s\n", (int) (2 * sizeof(void *)), value,
3897 #else /* !FEATURE_INSMOD_LOAD_MAP */
3898 void print_load_map(struct obj_file *f);
3901 int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
3902 int insmod_main(int argc, char **argv)
3908 unsigned long m_size;
3912 char *m_name = NULL;
3913 int exit_status = EXIT_FAILURE;
3915 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3916 struct utsname uts_info;
3917 char m_strversion[STRVERSIONLEN];
3918 int m_version, m_crcs;
3920 #if ENABLE_FEATURE_CLEAN_UP
3926 struct utsname myuname;
3928 /* Parse any options */
3929 getopt32(argv, OPTION_STR, &opt_o);
3930 arg1 = argv[optind];
3931 if (option_mask32 & OPT_o) { // -o /* name the output module */
3933 m_name = xstrdup(opt_o);
3940 /* Grab the module name */
3941 tmp1 = xstrdup(arg1);
3942 tmp = basename(tmp1);
3945 if (uname(&myuname) == 0) {
3946 if (myuname.release[0] == '2') {
3947 k_version = myuname.release[2] - '0';
3951 #if ENABLE_FEATURE_2_6_MODULES
3952 if (k_version > 4 && len > 3 && tmp[len - 3] == '.'
3953 && tmp[len - 2] == 'k' && tmp[len - 1] == 'o'
3959 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') {
3965 #if ENABLE_FEATURE_2_6_MODULES
3967 m_fullName = xasprintf("%s.ko", tmp);
3970 m_fullName = xasprintf("%s.o", tmp);
3976 tmp1 = NULL; /* flag for free(m_name) before exit() */
3979 /* Get a filedesc for the module. Check that we have a complete path */
3980 if (stat(arg1, &st) < 0 || !S_ISREG(st.st_mode)
3981 || (fp = fopen(arg1, "r")) == NULL
3983 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
3984 * but do not error out yet if we fail to find it... */
3985 if (k_version) { /* uname succeedd */
3989 tmdn = concat_path_file(_PATH_MODULES, myuname.release);
3990 /* Jump through hoops in case /lib/modules/`uname -r`
3991 * is a symlink. We do not want recursive_action to
3992 * follow symlinks, but we do want to follow the
3993 * /lib/modules/`uname -r` dir, So resolve it ourselves
3994 * if it is a link... */
3995 module_dir = xmalloc_readlink(tmdn);
3997 module_dir = xstrdup(tmdn);
3998 recursive_action(module_dir, ACTION_RECURSE,
3999 check_module_name_match, NULL, m_fullName, 0);
4004 /* Check if we have found anything yet */
4005 if (!m_filename || ((fp = fopen(m_filename, "r")) == NULL)) {
4011 module_dir = xmalloc_readlink(_PATH_MODULES);
4013 module_dir = xstrdup(_PATH_MODULES);
4014 /* No module found under /lib/modules/`uname -r`, this
4015 * time cast the net a bit wider. Search /lib/modules/ */
4016 r = recursive_action(module_dir, ACTION_RECURSE,
4017 check_module_name_match, NULL, m_fullName, 0);
4019 bb_error_msg_and_die("%s: module not found", m_fullName);
4021 if (m_filename == NULL
4022 || ((fp = fopen(m_filename, "r")) == NULL)
4024 bb_error_msg_and_die("%s: module not found", m_fullName);
4028 m_filename = xstrdup(arg1);
4031 printf("Using %s\n", m_filename);
4033 #if ENABLE_FEATURE_2_6_MODULES
4034 if (k_version > 4) {
4035 argv[optind] = m_filename;
4037 return insmod_ng_main(argc - optind, argv + optind);
4041 f = obj_load(fp, LOADBITS);
4043 if (get_modinfo_value(f, "kernel_version") == NULL)
4048 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
4049 /* Version correspondence? */
4051 if (uname(&uts_info) < 0)
4052 uts_info.release[0] = '\0';
4053 if (m_has_modinfo) {
4054 m_version = new_get_module_version(f, m_strversion);
4055 if (m_version == -1) {
4056 bb_error_msg_and_die("cannot find the kernel version the module was "
4061 if (strncmp(uts_info.release, m_strversion, STRVERSIONLEN) != 0) {
4062 bb_error_msg("%skernel-module version mismatch\n"
4063 "\t%s was compiled for kernel version %s\n"
4064 "\twhile this kernel is version %s",
4065 flag_force_load ? "warning: " : "",
4066 m_filename, m_strversion, uts_info.release);
4067 if (!flag_force_load)
4072 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
4074 if (query_module(NULL, 0, NULL, 0, NULL))
4075 bb_error_msg_and_die("not configured to support old kernels");
4076 new_get_kernel_symbols();
4077 k_crcs = new_is_kernel_checksummed();
4079 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
4082 m_crcs = new_is_module_checksummed(f);
4084 if (m_crcs != k_crcs)
4085 obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
4086 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
4088 /* Let the module know about the kernel symbols. */
4089 add_kernel_symbols(f);
4091 /* Allocate common symbols, symbol tables, and string tables. */
4093 new_create_this_module(f, m_name);
4094 obj_check_undefineds(f);
4095 obj_allocate_commons(f);
4096 check_tainted_module(f, m_name);
4098 /* done with the module name, on to the optional var=value arguments */
4100 if (optind < argc) {
4101 new_process_module_arguments(f, argc - optind, argv + optind);
4105 hide_special_symbols(f);
4107 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
4108 add_ksymoops_symbols(f, m_filename, m_name);
4109 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
4111 new_create_module_ksymtab(f);
4113 /* Find current size of the module */
4114 m_size = obj_load_size(f);
4116 m_addr = create_module(m_name, m_size);
4117 if (m_addr == -1) switch (errno) {
4119 bb_error_msg_and_die("a module named %s already exists", m_name);
4121 bb_error_msg_and_die("can't allocate kernel memory for module; needed %lu bytes",
4124 bb_perror_msg_and_die("create_module: %s", m_name);
4129 * the PROGBITS section was not loaded by the obj_load
4130 * now we can load them directly into the kernel memory
4132 if (!obj_load_progbits(fp, f, (char*)m_addr)) {
4133 delete_module(m_name);
4138 if (!obj_relocate(f, m_addr)) {
4139 delete_module(m_name);
4143 if (!new_init_module(m_name, f, m_size)) {
4144 delete_module(m_name);
4148 if (flag_print_load_map)
4151 exit_status = EXIT_SUCCESS;
4154 #if ENABLE_FEATURE_CLEAN_UP
4165 #endif /* ENABLE_FEATURE_2_4_MODULES */
4167 * End of big piece of 2.4-specific code
4171 #if ENABLE_FEATURE_2_6_MODULES
4173 #include <sys/mman.h>
4174 #include <asm/unistd.h>
4175 #include <sys/syscall.h>
4177 /* We use error numbers in a loose translation... */
4178 static const char *moderror(int err)
4182 return "invalid module format";
4184 return "unknown symbol in module";
4186 return "module has wrong symbol version";
4188 return "invalid parameters";
4190 return strerror(err);
4194 #if !ENABLE_FEATURE_2_4_MODULES
4195 int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
4196 int insmod_main(int argc, char **argv)
4198 static int insmod_ng_main(int argc, char **argv)
4205 char *filename, *options;
4211 /* Rest is options */
4212 options = xzalloc(1);
4215 options = xrealloc(options, optlen + 2 + strlen(*argv) + 2);
4216 /* Spaces handled by "" pairs, but no way of escaping quotes */
4217 optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
4221 /* Any special reason why mmap? It isn't performace critical... */
4225 fd = xopen(filename, O_RDONLY);
4228 map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
4229 if (map == MAP_FAILED) {
4230 bb_perror_msg_and_die("cannot mmap '%s'", filename);
4233 /* map == NULL on Blackfin, probably on other MMU-less systems too. Workaround. */
4236 xread(fd, map, len);
4239 len = MAXINT(ssize_t);
4240 map = xmalloc_open_read_close(filename, &len);
4243 ret = syscall(__NR_init_module, map, len, options);
4245 bb_error_msg_and_die("cannot insert '%s': %s",
4246 filename, moderror(errno));