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,
796 struct stat *statbuf ATTRIBUTE_UNUSED,
797 void *userdata, int depth ATTRIBUTE_UNUSED)
799 char *fullname = (char *) userdata;
802 if (fullname[0] == '\0')
805 tmp = bb_get_last_path_component_nostrip(filename);
806 if (strcmp(tmp, fullname) == 0) {
807 /* Stop searching if we find a match */
808 m_filename = xstrdup(filename);
815 /*======================================================================*/
817 static struct obj_file *arch_new_file(void)
820 f = xzalloc(sizeof(*f));
821 return &f->root; /* it's a first member */
824 static struct obj_section *arch_new_section(void)
826 return xzalloc(sizeof(struct obj_section));
829 static struct obj_symbol *arch_new_symbol(void)
831 struct arch_symbol *sym;
832 sym = xzalloc(sizeof(*sym));
836 static enum obj_reloc
837 arch_apply_relocation(struct obj_file *f,
838 struct obj_section *targsec,
839 /*struct obj_section *symsec,*/
840 struct obj_symbol *sym,
841 ElfW(RelM) *rel, ElfW(Addr) v)
843 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
844 || defined(__sh__) || defined(__s390__)
845 struct arch_file *ifile = (struct arch_file *) f;
847 enum obj_reloc ret = obj_reloc_ok;
848 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
849 #if defined(__arm__) || defined(__H8300H__) || defined(__H8300S__) \
850 || defined(__i386__) || defined(__mc68000__) || defined(__microblaze__) \
851 || defined(__mips__) || defined(__nios2__) || defined(__powerpc__) \
852 || defined(__s390__) || defined(__sh__) || defined(__x86_64__)
853 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
855 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
856 struct arch_symbol *isym = (struct arch_symbol *) sym;
858 #if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
859 || defined(__sh__) || defined(__s390__)
860 #if defined(USE_GOT_ENTRIES)
861 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
864 #if defined(USE_PLT_ENTRIES)
865 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
867 # if defined(USE_PLT_LIST)
868 struct arch_list_entry *pe;
870 struct arch_single_entry *pe;
874 switch (ELF_R_TYPE(rel->r_info)) {
889 /* relative reloc, always to _GLOBAL_OFFSET_TABLE_
890 * (which is .got) similar to branch,
891 * but is full 32 bits relative */
900 case R_ARM_GOTOFF: /* address relative to the got */
904 #elif defined(__cris__)
910 /* CRIS keeps the relocation value in the r_addend field and
911 * should not use whats in *loc at all
916 #elif defined(__H8300H__) || defined(__H8300S__)
919 loc = (ElfW(Addr) *)((ElfW(Addr))loc - 1);
920 *loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
931 if ((ElfW(Sword))v > 0x7fff ||
932 (ElfW(Sword))v < -(ElfW(Sword))0x8000)
933 ret = obj_reloc_overflow;
935 *(unsigned short *)loc = v;
939 if ((ElfW(Sword))v > 0x7f ||
940 (ElfW(Sword))v < -(ElfW(Sword))0x80)
941 ret = obj_reloc_overflow;
943 *(unsigned char *)loc = v;
946 #elif defined(__i386__)
980 #elif defined(__microblaze__)
981 case R_MICROBLAZE_NONE:
982 case R_MICROBLAZE_64_NONE:
983 case R_MICROBLAZE_32_SYM_OP_SYM:
984 case R_MICROBLAZE_32_PCREL:
987 case R_MICROBLAZE_64_PCREL: {
988 /* dot is the address of the current instruction.
989 * v is the target symbol address.
990 * So we need to extract the offset in the code,
991 * adding v, then subtrating the current address
992 * of this instruction.
993 * Ex: "IMM 0xFFFE bralid 0x0000" = "bralid 0xFFFE0000"
996 /* Get split offset stored in code */
997 unsigned int temp = (loc[0] & 0xFFFF) << 16 |
1000 /* Adjust relative offset. -4 adjustment required
1001 * because dot points to the IMM insn, but branch
1002 * is computed relative to the branch instruction itself.
1004 temp += v - dot - 4;
1006 /* Store back into code */
1007 loc[0] = (loc[0] & 0xFFFF0000) | temp >> 16;
1008 loc[1] = (loc[1] & 0xFFFF0000) | (temp & 0xFFFF);
1013 case R_MICROBLAZE_32:
1017 case R_MICROBLAZE_64: {
1018 /* Get split pointer stored in code */
1019 unsigned int temp1 = (loc[0] & 0xFFFF) << 16 |
1022 /* Add reloc offset */
1025 /* Store back into code */
1026 loc[0] = (loc[0] & 0xFFFF0000) | temp1 >> 16;
1027 loc[1] = (loc[1] & 0xFFFF0000) | (temp1 & 0xFFFF);
1032 case R_MICROBLAZE_32_PCREL_LO:
1033 case R_MICROBLAZE_32_LO:
1034 case R_MICROBLAZE_SRO32:
1035 case R_MICROBLAZE_SRW32:
1036 ret = obj_reloc_unhandled;
1039 #elif defined(__mc68000__)
1050 ret = obj_reloc_overflow;
1057 ret = obj_reloc_overflow;
1064 if ((ElfW(Sword))v > 0x7f ||
1065 (ElfW(Sword))v < -(ElfW(Sword))0x80) {
1066 ret = obj_reloc_overflow;
1073 if ((ElfW(Sword))v > 0x7fff ||
1074 (ElfW(Sword))v < -(ElfW(Sword))0x8000) {
1075 ret = obj_reloc_overflow;
1081 *(int *)loc = v - dot;
1084 case R_68K_GLOB_DAT:
1085 case R_68K_JMP_SLOT:
1089 case R_68K_RELATIVE:
1090 *(int *)loc += f->baseaddr;
1096 # ifdef R_68K_GOTOFF
1102 #elif defined(__mips__)
1113 ret = obj_reloc_dangerous;
1114 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
1115 ret = obj_reloc_overflow;
1117 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
1123 struct mips_hi16 *n;
1125 /* We cannot relocate this one now because we don't know the value
1126 of the carry we need to add. Save the information, and let LO16
1127 do the actual relocation. */
1128 n = xmalloc(sizeof *n);
1131 n->next = ifile->mips_hi16_list;
1132 ifile->mips_hi16_list = n;
1138 unsigned long insnlo = *loc;
1139 ElfW(Addr) val, vallo;
1141 /* Sign extend the addend we extract from the lo insn. */
1142 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
1144 if (ifile->mips_hi16_list != NULL) {
1145 struct mips_hi16 *l;
1147 l = ifile->mips_hi16_list;
1149 struct mips_hi16 *next;
1152 /* Do the HI16 relocation. Note that we actually don't
1153 need to know anything about the LO16 itself, except where
1154 to find the low 16 bits of the addend needed by the LO16. */
1157 ((insn & 0xffff) << 16) +
1161 /* Account for the sign extension that will happen in the
1168 insn = (insn & ~0xffff) | val;
1176 ifile->mips_hi16_list = NULL;
1179 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
1181 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
1186 #elif defined(__nios2__)
1191 case R_NIOS2_BFD_RELOC_32:
1195 case R_NIOS2_BFD_RELOC_16:
1197 ret = obj_reloc_overflow;
1202 case R_NIOS2_BFD_RELOC_8:
1204 ret = obj_reloc_overflow;
1213 if ((Elf32_Sword)v > 0x7fff ||
1214 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1215 ret = obj_reloc_overflow;
1219 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1229 ret = obj_reloc_overflow;
1233 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1238 case R_NIOS2_PCREL16:
1243 if ((Elf32_Sword)v > 0x7fff ||
1244 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1245 ret = obj_reloc_overflow;
1249 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1255 Elf32_Addr word, gp;
1257 gp = obj_symbol_final_value(f, obj_find_symbol(f, SPFX "_gp"));
1259 if ((Elf32_Sword)v > 0x7fff ||
1260 (Elf32_Sword)v < -(Elf32_Sword)0x8000) {
1261 ret = obj_reloc_overflow;
1265 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) | (word & 0x3f);
1269 case R_NIOS2_CALL26:
1271 ret = obj_reloc_dangerous;
1272 if ((v >> 28) != (dot >> 28))
1273 ret = obj_reloc_overflow;
1274 *loc = (*loc & 0x3f) | ((v >> 2) << 6);
1282 ret = obj_reloc_overflow;
1285 word = *loc & ~0x7c0;
1286 *loc = word | ((v & 0x1f) << 6);
1295 ret = obj_reloc_overflow;
1298 word = *loc & ~0xfc0;
1299 *loc = word | ((v & 0x3f) << 6);
1308 ret = obj_reloc_overflow;
1311 word = *loc & ~0x3fc0;
1312 *loc = word | ((v & 0xff) << 6);
1321 *loc = ((((word >> 22) << 16) | ((v >>16) & 0xffff)) << 6) |
1331 *loc = ((((word >> 22) << 16) | (v & 0xffff)) << 6) |
1336 case R_NIOS2_HIADJ16:
1338 Elf32_Addr word1, word2;
1341 word2 = ((v >> 16) + ((v >> 15) & 1)) & 0xffff;
1342 *loc = ((((word1 >> 22) << 16) | word2) << 6) |
1347 #elif defined(__powerpc64__)
1348 /* PPC64 needs a 2.6 kernel, 2.4 module relocation irrelevant */
1350 #elif defined(__powerpc__)
1352 case R_PPC_ADDR16_HA:
1353 *(unsigned short *)loc = (v + 0x8000) >> 16;
1356 case R_PPC_ADDR16_HI:
1357 *(unsigned short *)loc = v >> 16;
1360 case R_PPC_ADDR16_LO:
1361 *(unsigned short *)loc = v;
1375 #elif defined(__s390__)
1378 *(unsigned int *) loc += v;
1381 *(unsigned short *) loc += v;
1384 *(unsigned char *) loc += v;
1388 *(unsigned int *) loc += v - dot;
1391 *(unsigned short *) loc += (v - dot) >> 1;
1394 *(unsigned short *) loc += v - dot;
1398 case R_390_PLT16DBL:
1399 /* find the plt entry and initialize it. */
1400 pe = (struct arch_single_entry *) &isym->pltent;
1401 if (pe->inited == 0) {
1402 ip = (unsigned long *)(ifile->plt->contents + pe->offset);
1403 ip[0] = 0x0d105810; /* basr 1,0; lg 1,10(1); br 1 */
1405 if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1412 /* Insert relative distance to target. */
1413 v = plt + pe->offset - dot;
1414 if (ELF_R_TYPE(rel->r_info) == R_390_PLT32)
1415 *(unsigned int *) loc = (unsigned int) v;
1416 else if (ELF_R_TYPE(rel->r_info) == R_390_PLT16DBL)
1417 *(unsigned short *) loc = (unsigned short) ((v + 2) >> 1);
1420 case R_390_GLOB_DAT:
1421 case R_390_JMP_SLOT:
1425 case R_390_RELATIVE:
1426 *loc += f->baseaddr;
1430 *(unsigned long *) loc += got - dot;
1436 if (!isym->gotent.inited)
1438 isym->gotent.inited = 1;
1439 *(ElfW(Addr) *)(ifile->got->contents + isym->gotent.offset) = v;
1441 if (ELF_R_TYPE(rel->r_info) == R_390_GOT12)
1442 *(unsigned short *) loc |= (*(unsigned short *) loc + isym->gotent.offset) & 0xfff;
1443 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT16)
1444 *(unsigned short *) loc += isym->gotent.offset;
1445 else if (ELF_R_TYPE(rel->r_info) == R_390_GOT32)
1446 *(unsigned int *) loc += isym->gotent.offset;
1449 # ifndef R_390_GOTOFF32
1450 # define R_390_GOTOFF32 R_390_GOTOFF
1452 case R_390_GOTOFF32:
1456 #elif defined(__sh__)
1479 *loc = f->baseaddr + rel->r_addend;
1483 *loc = got - dot + rel->r_addend;
1493 # if defined(__SH5__)
1494 case R_SH_IMM_MEDLOW16:
1495 case R_SH_IMM_LOW16:
1499 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16)
1503 * movi and shori have the format:
1505 * | op | imm | reg | reserved |
1506 * 31..26 25..10 9.. 4 3 .. 0
1508 * so we simply mask and or in imm.
1510 word = *loc & ~0x3fffc00;
1511 word |= (v & 0xffff) << 10;
1518 case R_SH_IMM_MEDLOW16_PCREL:
1519 case R_SH_IMM_LOW16_PCREL:
1523 word = *loc & ~0x3fffc00;
1527 if (ELF_R_TYPE(rel->r_info) == R_SH_IMM_MEDLOW16_PCREL)
1530 word |= (v & 0xffff) << 10;
1536 # endif /* __SH5__ */
1538 #elif defined(__v850e__)
1544 /* We write two shorts instead of a long because even
1545 32-bit insns only need half-word alignment, but
1546 32-bit data needs to be long-word aligned. */
1547 v += ((unsigned short *)loc)[0];
1548 v += ((unsigned short *)loc)[1] << 16;
1549 ((unsigned short *)loc)[0] = v & 0xffff;
1550 ((unsigned short *)loc)[1] = (v >> 16) & 0xffff;
1553 case R_V850_22_PCREL:
1556 #elif defined(__x86_64__)
1566 *(unsigned int *) loc += v;
1569 ret = obj_reloc_overflow; /* Kernel module compiled without -mcmodel=kernel. */
1570 /* error("Possibly is module compiled without -mcmodel=kernel!"); */
1575 *(signed int *) loc += v;
1579 *(unsigned short *) loc += v;
1583 *(unsigned char *) loc += v;
1587 *(unsigned int *) loc += v - dot;
1591 *(unsigned short *) loc += v - dot;
1595 *(unsigned char *) loc += v - dot;
1598 case R_X86_64_GLOB_DAT:
1599 case R_X86_64_JUMP_SLOT:
1603 case R_X86_64_RELATIVE:
1604 *loc += f->baseaddr;
1607 case R_X86_64_GOT32:
1608 case R_X86_64_GOTPCREL:
1611 if (!isym->gotent.reloc_done)
1613 isym->gotent.reloc_done = 1;
1614 *(Elf64_Addr *)(ifile->got->contents + isym->gotent.offset) = v;
1616 /* XXX are these really correct? */
1617 if (ELF64_R_TYPE(rel->r_info) == R_X86_64_GOTPCREL)
1618 *(unsigned int *) loc += v + isym->gotent.offset;
1620 *loc += isym->gotent.offset;
1625 # warning "no idea how to handle relocations on your arch"
1629 printf("Warning: unhandled reloc %d\n",(int)ELF_R_TYPE(rel->r_info));
1630 ret = obj_reloc_unhandled;
1633 #if defined(USE_PLT_ENTRIES)
1637 /* find the plt entry and initialize it if necessary */
1639 #if defined(USE_PLT_LIST)
1640 for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend;)
1647 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1649 /* generate some machine code */
1651 #if defined(__arm__)
1652 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1653 ip[1] = v; /* sym@ */
1655 #if defined(__powerpc__)
1656 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1657 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1658 ip[2] = 0x7d6903a6; /* mtctr r11 */
1659 ip[3] = 0x4e800420; /* bctr */
1661 #if defined(__v850e__)
1662 /* We have to trash a register, so we assume that any control
1663 transfer more than 21-bits away must be a function call
1664 (so we can use a call-clobbered register). */
1665 ip[0] = 0x0621 + ((v & 0xffff) << 16); /* mov sym, r1 ... */
1666 ip[1] = ((v >> 16) & 0xffff) + 0x610000; /* ...; jmp r1 */
1671 /* relative distance to target */
1673 /* if the target is too far away.... */
1674 #if defined(__arm__) || defined(__powerpc__)
1675 if ((int)v < -0x02000000 || (int)v >= 0x02000000)
1676 #elif defined(__v850e__)
1677 if ((ElfW(Sword))v > 0x1fffff || (ElfW(Sword))v < (ElfW(Sword))-0x200000)
1679 /* go via the plt */
1680 v = plt + pe->offset - dot;
1682 #if defined(__v850e__)
1687 ret = obj_reloc_dangerous;
1689 /* merge the offset into the instruction. */
1690 #if defined(__arm__)
1691 /* Convert to words. */
1694 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1696 #if defined(__powerpc__)
1697 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1699 #if defined(__v850e__)
1700 /* We write two shorts instead of a long because even 32-bit insns
1701 only need half-word alignment, but the 32-bit data write needs
1702 to be long-word aligned. */
1703 ((unsigned short *)loc)[0] =
1704 (*(unsigned short *)loc & 0xffc0) /* opcode + reg */
1705 | ((v >> 16) & 0x3f); /* offs high part */
1706 ((unsigned short *)loc)[1] =
1707 (v & 0xffff); /* offs low part */
1710 #endif /* USE_PLT_ENTRIES */
1712 #if defined(USE_GOT_ENTRIES)
1715 /* needs an entry in the .got: set it, once */
1716 if (!isym->gotent.inited) {
1717 isym->gotent.inited = 1;
1718 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1720 /* make the reloc with_respect_to_.got */
1722 *loc += isym->gotent.offset + rel->r_addend;
1723 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1724 *loc += isym->gotent.offset;
1728 #endif /* USE_GOT_ENTRIES */
1735 #if defined(USE_LIST)
1737 static int arch_list_add(ElfW(RelM) *rel, struct arch_list_entry **list,
1738 int offset, int size)
1740 struct arch_list_entry *pe;
1742 for (pe = *list; pe != NULL; pe = pe->next) {
1743 if (pe->addend == rel->r_addend) {
1749 pe = xmalloc(sizeof(struct arch_list_entry));
1751 pe->addend = rel->r_addend;
1752 pe->offset = offset;
1762 #if defined(USE_SINGLE)
1764 static int arch_single_init(/*ElfW(RelM) *rel,*/ struct arch_single_entry *single,
1765 int offset, int size)
1767 if (single->allocated == 0) {
1768 single->allocated = 1;
1769 single->offset = offset;
1778 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
1780 static struct obj_section *arch_xsect_init(struct obj_file *f, const char *name,
1781 int offset, int size)
1783 struct obj_section *myrelsec = obj_find_section(f, name);
1790 obj_extend_section(myrelsec, offset);
1792 myrelsec = obj_create_alloced_section(f, name,
1801 static void arch_create_got(struct obj_file *f)
1803 #if defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES)
1804 struct arch_file *ifile = (struct arch_file *) f;
1806 #if defined(USE_GOT_ENTRIES)
1807 int got_offset = 0, got_needed = 0, got_allocate;
1809 #if defined(USE_PLT_ENTRIES)
1810 int plt_offset = 0, plt_needed = 0, plt_allocate;
1812 struct obj_section *relsec, *symsec, *strsec;
1813 ElfW(RelM) *rel, *relend;
1814 ElfW(Sym) *symtab, *extsym;
1815 const char *strtab, *name;
1816 struct arch_symbol *intsym;
1818 for (i = 0; i < f->header.e_shnum; ++i) {
1819 relsec = f->sections[i];
1820 if (relsec->header.sh_type != SHT_RELM)
1823 symsec = f->sections[relsec->header.sh_link];
1824 strsec = f->sections[symsec->header.sh_link];
1826 rel = (ElfW(RelM) *) relsec->contents;
1827 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1828 symtab = (ElfW(Sym) *) symsec->contents;
1829 strtab = (const char *) strsec->contents;
1831 for (; rel < relend; ++rel) {
1832 extsym = &symtab[ELF_R_SYM(rel->r_info)];
1834 #if defined(USE_GOT_ENTRIES)
1837 #if defined(USE_PLT_ENTRIES)
1841 switch (ELF_R_TYPE(rel->r_info)) {
1842 #if defined(__arm__)
1857 #elif defined(__i386__)
1867 #elif defined(__powerpc__)
1872 #elif defined(__mc68000__)
1883 #elif defined(__sh__)
1893 #elif defined(__v850e__)
1894 case R_V850_22_PCREL:
1903 if (extsym->st_name != 0) {
1904 name = strtab + extsym->st_name;
1906 name = f->sections[extsym->st_shndx]->name;
1908 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1909 #if defined(USE_GOT_ENTRIES)
1911 got_offset += arch_single_init(
1912 /*rel,*/ &intsym->gotent,
1913 got_offset, GOT_ENTRY_SIZE);
1918 #if defined(USE_PLT_ENTRIES)
1920 #if defined(USE_PLT_LIST)
1921 plt_offset += arch_list_add(
1922 rel, &intsym->pltent,
1923 plt_offset, PLT_ENTRY_SIZE);
1925 plt_offset += arch_single_init(
1926 /*rel,*/ &intsym->pltent,
1927 plt_offset, PLT_ENTRY_SIZE);
1935 #if defined(USE_GOT_ENTRIES)
1937 ifile->got = arch_xsect_init(f, ".got", got_offset,
1942 #if defined(USE_PLT_ENTRIES)
1944 ifile->plt = arch_xsect_init(f, ".plt", plt_offset,
1949 #endif /* defined(USE_GOT_ENTRIES) || defined(USE_PLT_ENTRIES) */
1952 /*======================================================================*/
1954 /* Standard ELF hash function. */
1955 static unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1957 unsigned long h = 0;
1964 g = (h & 0xf0000000);
1974 static unsigned long obj_elf_hash(const char *name)
1976 return obj_elf_hash_n(name, strlen(name));
1979 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
1980 /* String comparison for non-co-versioned kernel and module. */
1982 static int ncv_strcmp(const char *a, const char *b)
1984 size_t alen = strlen(a), blen = strlen(b);
1986 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
1987 return strncmp(a, b, alen);
1988 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
1989 return strncmp(a, b, blen);
1991 return strcmp(a, b);
1994 /* String hashing for non-co-versioned kernel and module. Here
1995 we are simply forced to drop the crc from the hash. */
1997 static unsigned long ncv_symbol_hash(const char *str)
1999 size_t len = strlen(str);
2000 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
2002 return obj_elf_hash_n(str, len);
2006 obj_set_symbol_compare(struct obj_file *f,
2007 int (*cmp) (const char *, const char *),
2008 unsigned long (*hash) (const char *))
2011 f->symbol_cmp = cmp;
2013 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
2016 f->symbol_hash = hash;
2018 memcpy(tmptab, f->symtab, sizeof(tmptab));
2019 memset(f->symtab, 0, sizeof(f->symtab));
2021 for (i = 0; i < HASH_BUCKETS; ++i)
2022 for (sym = tmptab[i]; sym; sym = next) {
2023 unsigned long h = hash(sym->name) % HASH_BUCKETS;
2025 sym->next = f->symtab[h];
2031 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
2033 static struct obj_symbol *
2034 obj_add_symbol(struct obj_file *f, const char *name,
2035 unsigned long symidx, int info,
2036 int secidx, ElfW(Addr) value,
2039 struct obj_symbol *sym;
2040 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2041 int n_type = ELF_ST_TYPE(info);
2042 int n_binding = ELF_ST_BIND(info);
2044 for (sym = f->symtab[hash]; sym; sym = sym->next)
2045 if (f->symbol_cmp(sym->name, name) == 0) {
2046 int o_secidx = sym->secidx;
2047 int o_info = sym->info;
2048 int o_type = ELF_ST_TYPE(o_info);
2049 int o_binding = ELF_ST_BIND(o_info);
2051 /* A redefinition! Is it legal? */
2053 if (secidx == SHN_UNDEF)
2055 else if (o_secidx == SHN_UNDEF)
2057 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
2058 /* Cope with local and global symbols of the same name
2059 in the same object file, as might have been created
2060 by ld -r. The only reason locals are now seen at this
2061 level at all is so that we can do semi-sensible things
2064 struct obj_symbol *nsym, **p;
2066 nsym = arch_new_symbol();
2067 nsym->next = sym->next;
2070 /* Excise the old (local) symbol from the hash chain. */
2071 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
2075 } else if (n_binding == STB_LOCAL) {
2076 /* Another symbol of the same name has already been defined.
2077 Just add this to the local table. */
2078 sym = arch_new_symbol();
2081 f->local_symtab[symidx] = sym;
2083 } else if (n_binding == STB_WEAK)
2085 else if (o_binding == STB_WEAK)
2087 /* Don't unify COMMON symbols with object types the programmer
2089 else if (secidx == SHN_COMMON
2090 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
2092 else if (o_secidx == SHN_COMMON
2093 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
2096 /* Don't report an error if the symbol is coming from
2097 the kernel or some external module. */
2098 if (secidx <= SHN_HIRESERVE)
2099 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;
2110 if (ELF_ST_BIND(info) == STB_LOCAL && symidx != -1) {
2111 if (symidx >= f->local_symtab_size)
2112 bb_error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
2113 name, (long) symidx, (long) f->local_symtab_size);
2115 f->local_symtab[symidx] = sym;
2122 sym->secidx = secidx;
2128 static struct obj_symbol *
2129 obj_find_symbol(struct obj_file *f, const char *name)
2131 struct obj_symbol *sym;
2132 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
2134 for (sym = f->symtab[hash]; sym; sym = sym->next)
2135 if (f->symbol_cmp(sym->name, name) == 0)
2141 static ElfW(Addr) obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
2144 if (sym->secidx >= SHN_LORESERVE)
2147 return sym->value + f->sections[sym->secidx]->header.sh_addr;
2149 /* As a special case, a NULL sym has value zero. */
2154 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
2156 int i, n = f->header.e_shnum;
2158 for (i = 0; i < n; ++i)
2159 if (strcmp(f->sections[i]->name, name) == 0)
2160 return f->sections[i];
2165 static int obj_load_order_prio(struct obj_section *a)
2167 unsigned long af, ac;
2169 af = a->header.sh_flags;
2172 if (a->name[0] != '.' || strlen(a->name) != 10 ||
2173 strcmp(a->name + 5, ".init"))
2177 if (!(af & SHF_WRITE))
2179 if (af & SHF_EXECINSTR)
2181 if (a->header.sh_type != SHT_NOBITS)
2188 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
2190 struct obj_section **p;
2191 int prio = obj_load_order_prio(sec);
2192 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
2193 if (obj_load_order_prio(*p) < prio)
2195 sec->load_next = *p;
2199 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
2201 unsigned long align,
2204 int newidx = f->header.e_shnum++;
2205 struct obj_section *sec;
2207 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2208 f->sections[newidx] = sec = arch_new_section();
2210 sec->header.sh_type = SHT_PROGBITS;
2211 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2212 sec->header.sh_size = size;
2213 sec->header.sh_addralign = align;
2217 sec->contents = xmalloc(size);
2219 obj_insert_section_load_order(f, sec);
2224 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
2226 unsigned long align,
2229 int newidx = f->header.e_shnum++;
2230 struct obj_section *sec;
2232 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
2233 f->sections[newidx] = sec = arch_new_section();
2235 sec->header.sh_type = SHT_PROGBITS;
2236 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2237 sec->header.sh_size = size;
2238 sec->header.sh_addralign = align;
2242 sec->contents = xmalloc(size);
2244 sec->load_next = f->load_order;
2245 f->load_order = sec;
2246 if (f->load_order_search_start == &f->load_order)
2247 f->load_order_search_start = &sec->load_next;
2252 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
2254 unsigned long oldsize = sec->header.sh_size;
2256 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
2258 return sec->contents + oldsize;
2262 /* Conditionally add the symbols from the given symbol set to the
2266 add_symbols_from( struct obj_file *f,
2267 int idx, struct new_module_symbol *syms, size_t nsyms)
2269 struct new_module_symbol *s;
2272 #ifdef SYMBOL_PREFIX
2274 size_t name_alloced_size = 0;
2276 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
2279 gpl = obj_gpl_license(f, NULL) == 0;
2281 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
2282 /* Only add symbols that are already marked external.
2283 If we override locals we may cause problems for
2284 argument initialization. We will also create a false
2285 dependency on the module. */
2286 struct obj_symbol *sym;
2289 /* GPL licensed modules can use symbols exported with
2290 * EXPORT_SYMBOL_GPL, so ignore any GPLONLY_ prefix on the
2291 * exported names. Non-GPL modules never see any GPLONLY_
2292 * symbols so they cannot fudge it by adding the prefix on
2295 if (strncmp((char *)s->name, "GPLONLY_", 8) == 0) {
2296 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
2303 name = (char *)s->name;
2305 #ifdef SYMBOL_PREFIX
2306 /* Prepend SYMBOL_PREFIX to the symbol's name (the
2307 kernel exports `C names', but module object files
2308 reference `linker names'). */
2309 size_t extra = sizeof SYMBOL_PREFIX;
2310 size_t name_size = strlen(name) + extra;
2311 if (name_size > name_alloced_size) {
2312 name_alloced_size = name_size * 2;
2313 name_buf = alloca(name_alloced_size);
2315 strcpy(name_buf, SYMBOL_PREFIX);
2316 strcpy(name_buf + extra - 1, name);
2318 #endif /* SYMBOL_PREFIX */
2320 sym = obj_find_symbol(f, name);
2321 if (sym && !(ELF_ST_BIND(sym->info) == STB_LOCAL)) {
2322 #ifdef SYMBOL_PREFIX
2323 /* Put NAME_BUF into more permanent storage. */
2324 name = xmalloc(name_size);
2325 strcpy(name, name_buf);
2327 sym = obj_add_symbol(f, name, -1,
2328 ELF_ST_INFO(STB_GLOBAL,
2331 /* Did our symbol just get installed? If so, mark the
2332 module as "used". */
2333 if (sym->secidx == idx)
2341 static void add_kernel_symbols(struct obj_file *f)
2343 struct external_module *m;
2346 /* Add module symbols first. */
2348 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m) {
2350 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms)
2357 n_ext_modules_used = nused;
2359 /* And finally the symbols from the kernel proper. */
2362 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
2365 static char *get_modinfo_value(struct obj_file *f, const char *key)
2367 struct obj_section *sec;
2368 char *p, *v, *n, *ep;
2369 size_t klen = strlen(key);
2371 sec = obj_find_section(f, ".modinfo");
2375 ep = p + sec->header.sh_size;
2378 n = strchr(p, '\0');
2380 if (p + klen == v && strncmp(p, key, klen) == 0)
2383 if (p + klen == n && strcmp(p, key) == 0)
2393 /*======================================================================*/
2394 /* Functions relating to module loading after 2.1.18. */
2397 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2400 char *p, *q, *key, *sym_name;
2401 struct obj_symbol *sym;
2402 char *contents, *loc;
2412 key = alloca(q - p + 6);
2413 memcpy(key, "parm_", 5);
2414 memcpy(key + 5, p, q - p);
2417 p = get_modinfo_value(f, key);
2420 bb_error_msg_and_die("invalid parameter %s", key);
2423 #ifdef SYMBOL_PREFIX
2424 sym_name = alloca(strlen(key) + sizeof SYMBOL_PREFIX);
2425 strcpy(sym_name, SYMBOL_PREFIX);
2426 strcat(sym_name, key);
2430 sym = obj_find_symbol(f, sym_name);
2432 /* Also check that the parameter was not resolved from the kernel. */
2433 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2434 bb_error_msg_and_die("symbol for parameter %s not found", key);
2438 min = strtoul(p, &p, 10);
2440 max = strtoul(p + 1, &p, 10);
2446 contents = f->sections[sym->secidx]->contents;
2447 loc = contents + sym->value;
2451 if ((*p == 's') || (*p == 'c')) {
2454 /* Do C quoting if we begin with a ", else slurp the lot. */
2458 str = alloca(strlen(q));
2459 for (r = str, q++; *q != '"'; ++q, ++r) {
2461 bb_error_msg_and_die("improperly terminated string argument for %s",
2497 if (q[1] >= '0' && q[1] <= '7') {
2498 c = (c * 8) + *++q - '0';
2499 if (q[1] >= '0' && q[1] <= '7')
2500 c = (c * 8) + *++q - '0';
2518 /* In this case, the string is not quoted. We will break
2519 it using the coma (like for ints). If the user wants to
2520 include comas in a string, he just has to quote it */
2522 /* Search the next coma */
2526 if (r != (char *) NULL) {
2527 /* Recopy the current field */
2528 str = alloca(r - q + 1);
2529 memcpy(str, q, r - q);
2531 /* I don't know if it is useful, as the previous case
2532 doesn't nul terminate the string ??? */
2535 /* Keep next fields */
2546 obj_string_patch(f, sym->secidx, loc - contents, str);
2547 loc += tgt_sizeof_char_p;
2549 /* Array of chars (in fact, matrix!) */
2550 unsigned long charssize; /* size of each member */
2552 /* Get the size of each member */
2553 /* Probably we should do that outside the loop ? */
2554 if (!isdigit(*(p + 1))) {
2555 bb_error_msg_and_die("parameter type 'c' for %s must be followed by"
2556 " the maximum size", key);
2558 charssize = strtoul(p + 1, (char **) NULL, 10);
2561 if (strlen(str) >= charssize) {
2562 bb_error_msg_and_die("string too long for %s (max %ld)", key,
2566 /* Copy to location */
2567 strcpy((char *) loc, str);
2571 long v = strtoul(q, &q, 0);
2578 loc += tgt_sizeof_short;
2582 loc += tgt_sizeof_int;
2586 loc += tgt_sizeof_long;
2590 bb_error_msg_and_die("unknown parameter type '%c' for %s", *p, key);
2603 goto retry_end_of_value;
2607 bb_error_msg_and_die("too many values for %s (max %d)", key, max);
2613 bb_error_msg_and_die("invalid argument syntax for %s", key);
2618 bb_error_msg_and_die("too few values for %s (min %d)", key, min);
2626 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
2627 static int new_is_module_checksummed(struct obj_file *f)
2629 const char *p = get_modinfo_value(f, "using_checksums");
2635 /* Get the module's kernel version in the canonical integer form. */
2638 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2643 p = get_modinfo_value(f, "kernel_version");
2646 safe_strncpy(str, p, STRVERSIONLEN);
2648 a = strtoul(p, &p, 10);
2651 b = strtoul(p + 1, &p, 10);
2654 c = strtoul(p + 1, &q, 10);
2658 return a << 16 | b << 8 | c;
2661 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
2664 /* Fetch the loaded modules, and all currently exported symbols. */
2666 static void new_get_kernel_symbols(void)
2668 char *module_names, *mn;
2669 struct external_module *modules, *m;
2670 struct new_module_symbol *syms, *s;
2671 size_t ret, bufsize, nmod, nsyms, i, j;
2673 /* Collect the loaded modules. */
2676 module_names = xmalloc(bufsize);
2679 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2680 if (errno == ENOSPC && bufsize < ret) {
2682 module_names = xrealloc(module_names, bufsize);
2683 goto retry_modules_load;
2685 bb_perror_msg_and_die("QM_MODULES");
2688 n_ext_modules = nmod = ret;
2690 /* Collect the modules' symbols. */
2693 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2694 memset(modules, 0, nmod * sizeof(*modules));
2695 for (i = 0, mn = module_names, m = modules;
2696 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2697 struct new_module_info info;
2699 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2700 if (errno == ENOENT) {
2701 /* The module was removed out from underneath us. */
2704 bb_perror_msg_and_die("query_module: QM_INFO: %s", mn);
2708 syms = xmalloc(bufsize);
2710 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2714 syms = xrealloc(syms, bufsize);
2715 goto retry_mod_sym_load;
2717 /* The module was removed out from underneath us. */
2720 bb_perror_msg_and_die("query_module: QM_SYMBOLS: %s", mn);
2726 m->addr = info.addr;
2730 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2731 s->name += (unsigned long) syms;
2736 /* Collect the kernel's symbols. */
2738 syms = xmalloc(bufsize = 16 * 1024);
2739 retry_kern_sym_load:
2740 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2741 if (errno == ENOSPC && bufsize < ret) {
2742 syms = xrealloc(syms, bufsize = ret);
2743 goto retry_kern_sym_load;
2745 bb_perror_msg_and_die("kernel: QM_SYMBOLS");
2747 nksyms = nsyms = ret;
2750 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2751 s->name += (unsigned long) syms;
2756 /* Return the kernel symbol checksum version, or zero if not used. */
2758 static int new_is_kernel_checksummed(void)
2760 struct new_module_symbol *s;
2763 /* Using_Versions is not the first symbol, but it should be in there. */
2765 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2766 if (strcmp((char *) s->name, "Using_Versions") == 0)
2773 static void new_create_this_module(struct obj_file *f, const char *m_name)
2775 struct obj_section *sec;
2777 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2778 sizeof(struct new_module));
2779 memset(sec->contents, 0, sizeof(struct new_module));
2781 obj_add_symbol(f, SPFX "__this_module", -1,
2782 ELF_ST_INFO(STB_LOCAL, STT_OBJECT), sec->idx, 0,
2783 sizeof(struct new_module));
2785 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2789 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
2790 /* add an entry to the __ksymtab section, creating it if necessary */
2791 static void new_add_ksymtab(struct obj_file *f, struct obj_symbol *sym)
2793 struct obj_section *sec;
2796 /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section.
2797 * If __ksymtab is defined but not marked alloc, x out the first character
2798 * (no obj_delete routine) and create a new __ksymtab with the correct
2801 sec = obj_find_section(f, "__ksymtab");
2802 if (sec && !(sec->header.sh_flags & SHF_ALLOC)) {
2803 *((char *)(sec->name)) = 'x'; /* override const */
2807 sec = obj_create_alloced_section(f, "__ksymtab",
2808 tgt_sizeof_void_p, 0);
2811 sec->header.sh_flags |= SHF_ALLOC;
2812 /* Empty section might be byte-aligned */
2813 sec->header.sh_addralign = tgt_sizeof_void_p;
2814 ofs = sec->header.sh_size;
2815 obj_symbol_patch(f, sec->idx, ofs, sym);
2816 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name);
2817 obj_extend_section(sec, 2 * tgt_sizeof_char_p);
2819 #endif /* FEATURE_INSMOD_KSYMOOPS_SYMBOLS */
2821 static int new_create_module_ksymtab(struct obj_file *f)
2823 struct obj_section *sec;
2826 /* We must always add the module references. */
2828 if (n_ext_modules_used) {
2829 struct new_module_ref *dep;
2830 struct obj_symbol *tm;
2832 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2833 (sizeof(struct new_module_ref)
2834 * n_ext_modules_used));
2838 tm = obj_find_symbol(f, SPFX "__this_module");
2839 dep = (struct new_module_ref *) sec->contents;
2840 for (i = 0; i < n_ext_modules; ++i)
2841 if (ext_modules[i].used) {
2842 dep->dep = ext_modules[i].addr;
2843 obj_symbol_patch(f, sec->idx,
2844 (char *) &dep->ref - sec->contents, tm);
2850 if (!flag_noexport && !obj_find_section(f, "__ksymtab")) {
2854 sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0);
2856 /* We don't want to export symbols residing in sections that
2857 aren't loaded. There are a number of these created so that
2858 we make sure certain module options don't appear twice. */
2860 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2862 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2864 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2865 struct obj_symbol *sym;
2866 for (sym = f->symtab[i]; sym; sym = sym->next)
2867 if (ELF_ST_BIND(sym->info) != STB_LOCAL
2868 && sym->secidx <= SHN_HIRESERVE
2869 && (sym->secidx >= SHN_LORESERVE
2870 || loaded[sym->secidx])) {
2871 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2873 obj_symbol_patch(f, sec->idx, ofs, sym);
2874 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2881 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2889 new_init_module(const char *m_name, struct obj_file *f, unsigned long m_size)
2891 struct new_module *module;
2892 struct obj_section *sec;
2897 sec = obj_find_section(f, ".this");
2898 if (!sec || !sec->contents) {
2899 bb_perror_msg_and_die("corrupt module %s?",m_name);
2901 module = (struct new_module *) sec->contents;
2902 m_addr = sec->header.sh_addr;
2904 module->size_of_struct = sizeof(*module);
2905 module->size = m_size;
2906 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2908 sec = obj_find_section(f, "__ksymtab");
2909 if (sec && sec->header.sh_size) {
2910 module->syms = sec->header.sh_addr;
2911 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2914 if (n_ext_modules_used) {
2915 sec = obj_find_section(f, ".kmodtab");
2916 module->deps = sec->header.sh_addr;
2917 module->ndeps = n_ext_modules_used;
2921 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "init_module"));
2923 obj_symbol_final_value(f, obj_find_symbol(f, SPFX "cleanup_module"));
2925 sec = obj_find_section(f, "__ex_table");
2927 module->ex_table_start = sec->header.sh_addr;
2928 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2931 sec = obj_find_section(f, ".text.init");
2933 module->runsize = sec->header.sh_addr - m_addr;
2935 sec = obj_find_section(f, ".data.init");
2937 if (!module->runsize ||
2938 module->runsize > sec->header.sh_addr - m_addr)
2939 module->runsize = sec->header.sh_addr - m_addr;
2941 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2942 if (sec && sec->header.sh_size) {
2943 module->archdata_start = (void*)sec->header.sh_addr;
2944 module->archdata_end = module->archdata_start + sec->header.sh_size;
2946 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2947 if (sec && sec->header.sh_size) {
2948 module->kallsyms_start = (void*)sec->header.sh_addr;
2949 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2952 /* Whew! All of the initialization is complete. Collect the final
2953 module image and give it to the kernel. */
2955 image = xmalloc(m_size);
2956 obj_create_image(f, image);
2958 ret = init_module(m_name, (struct new_module *) image);
2960 bb_perror_msg("init_module: %s", m_name);
2968 /*======================================================================*/
2971 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2974 struct obj_string_patch *p;
2975 struct obj_section *strsec;
2976 size_t len = strlen(string) + 1;
2979 p = xmalloc(sizeof(*p));
2980 p->next = f->string_patches;
2981 p->reloc_secidx = secidx;
2982 p->reloc_offset = offset;
2983 f->string_patches = p;
2985 strsec = obj_find_section(f, ".kstrtab");
2986 if (strsec == NULL) {
2987 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
2988 p->string_offset = 0;
2989 loc = strsec->contents;
2991 p->string_offset = strsec->header.sh_size;
2992 loc = obj_extend_section(strsec, len);
2994 memcpy(loc, string, len);
2998 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2999 struct obj_symbol *sym)
3001 struct obj_symbol_patch *p;
3003 p = xmalloc(sizeof(*p));
3004 p->next = f->symbol_patches;
3005 p->reloc_secidx = secidx;
3006 p->reloc_offset = offset;
3008 f->symbol_patches = p;
3011 static void obj_check_undefineds(struct obj_file *f)
3015 for (i = 0; i < HASH_BUCKETS; ++i) {
3016 struct obj_symbol *sym;
3017 for (sym = f->symtab[i]; sym; sym = sym->next)
3018 if (sym->secidx == SHN_UNDEF) {
3019 if (ELF_ST_BIND(sym->info) == STB_WEAK) {
3020 sym->secidx = SHN_ABS;
3024 bb_error_msg_and_die("unresolved symbol %s", sym->name);
3030 static void obj_allocate_commons(struct obj_file *f)
3032 struct common_entry {
3033 struct common_entry *next;
3034 struct obj_symbol *sym;
3035 } *common_head = NULL;
3039 for (i = 0; i < HASH_BUCKETS; ++i) {
3040 struct obj_symbol *sym;
3041 for (sym = f->symtab[i]; sym; sym = sym->next)
3042 if (sym->secidx == SHN_COMMON) {
3043 /* Collect all COMMON symbols and sort them by size so as to
3044 minimize space wasted by alignment requirements. */
3046 struct common_entry **p, *n;
3047 for (p = &common_head; *p; p = &(*p)->next)
3048 if (sym->size <= (*p)->sym->size)
3051 n = alloca(sizeof(*n));
3059 for (i = 1; i < f->local_symtab_size; ++i) {
3060 struct obj_symbol *sym = f->local_symtab[i];
3061 if (sym && sym->secidx == SHN_COMMON) {
3062 struct common_entry **p, *n;
3063 for (p = &common_head; *p; p = &(*p)->next)
3064 if (sym == (*p)->sym)
3066 else if (sym->size < (*p)->sym->size) {
3067 n = alloca(sizeof(*n));
3077 /* Find the bss section. */
3078 for (i = 0; i < f->header.e_shnum; ++i)
3079 if (f->sections[i]->header.sh_type == SHT_NOBITS)
3082 /* If for some reason there hadn't been one, create one. */
3083 if (i == f->header.e_shnum) {
3084 struct obj_section *sec;
3086 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
3087 f->sections[i] = sec = arch_new_section();
3088 f->header.e_shnum = i + 1;
3090 sec->header.sh_type = SHT_PROGBITS;
3091 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
3096 /* Allocate the COMMONS. */
3098 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
3099 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
3100 struct common_entry *c;
3102 for (c = common_head; c; c = c->next) {
3103 ElfW(Addr) align = c->sym->value;
3105 if (align > max_align)
3107 if (bss_size & (align - 1))
3108 bss_size = (bss_size | (align - 1)) + 1;
3111 c->sym->value = bss_size;
3113 bss_size += c->sym->size;
3116 f->sections[i]->header.sh_size = bss_size;
3117 f->sections[i]->header.sh_addralign = max_align;
3121 /* For the sake of patch relocation and parameter initialization,
3122 allocate zeroed data for NOBITS sections now. Note that after
3123 this we cannot assume NOBITS are really empty. */
3124 for (i = 0; i < f->header.e_shnum; ++i) {
3125 struct obj_section *s = f->sections[i];
3126 if (s->header.sh_type == SHT_NOBITS) {
3127 if (s->header.sh_size != 0)
3128 s->contents = memset(xmalloc(s->header.sh_size),
3129 0, s->header.sh_size);
3133 s->header.sh_type = SHT_PROGBITS;
3138 static unsigned long obj_load_size(struct obj_file *f)
3140 unsigned long dot = 0;
3141 struct obj_section *sec;
3143 /* Finalize the positions of the sections relative to one another. */
3145 for (sec = f->load_order; sec; sec = sec->load_next) {
3148 align = sec->header.sh_addralign;
3149 if (align && (dot & (align - 1)))
3150 dot = (dot | (align - 1)) + 1;
3152 sec->header.sh_addr = dot;
3153 dot += sec->header.sh_size;
3159 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
3161 int i, n = f->header.e_shnum;
3164 /* Finalize the addresses of the sections. */
3167 for (i = 0; i < n; ++i)
3168 f->sections[i]->header.sh_addr += base;
3170 /* And iterate over all of the relocations. */
3172 for (i = 0; i < n; ++i) {
3173 struct obj_section *relsec, *symsec, *targsec, *strsec;
3174 ElfW(RelM) * rel, *relend;
3178 relsec = f->sections[i];
3179 if (relsec->header.sh_type != SHT_RELM)
3182 symsec = f->sections[relsec->header.sh_link];
3183 targsec = f->sections[relsec->header.sh_info];
3184 strsec = f->sections[symsec->header.sh_link];
3186 rel = (ElfW(RelM) *) relsec->contents;
3187 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
3188 symtab = (ElfW(Sym) *) symsec->contents;
3189 strtab = (const char *) strsec->contents;
3191 for (; rel < relend; ++rel) {
3192 ElfW(Addr) value = 0;
3193 struct obj_symbol *intsym = NULL;
3194 unsigned long symndx;
3195 ElfW(Sym) * extsym = 0;
3198 /* Attempt to find a value to use for this relocation. */
3200 symndx = ELF_R_SYM(rel->r_info);
3202 /* Note we've already checked for undefined symbols. */
3204 extsym = &symtab[symndx];
3205 if (ELF_ST_BIND(extsym->st_info) == STB_LOCAL) {
3206 /* Local symbols we look up in the local table to be sure
3207 we get the one that is really intended. */
3208 intsym = f->local_symtab[symndx];
3210 /* Others we look up in the hash table. */
3212 if (extsym->st_name)
3213 name = strtab + extsym->st_name;
3215 name = f->sections[extsym->st_shndx]->name;
3216 intsym = obj_find_symbol(f, name);
3219 value = obj_symbol_final_value(f, intsym);
3220 intsym->referenced = 1;
3222 #if SHT_RELM == SHT_RELA
3223 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
3224 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
3225 if (!extsym || !extsym->st_name ||
3226 ELF_ST_BIND(extsym->st_info) != STB_LOCAL)
3228 value += rel->r_addend;
3232 switch (arch_apply_relocation
3233 (f, targsec, /*symsec,*/ intsym, rel, value)
3238 case obj_reloc_overflow:
3239 errmsg = "Relocation overflow";
3241 case obj_reloc_dangerous:
3242 errmsg = "Dangerous relocation";
3244 case obj_reloc_unhandled:
3245 errmsg = "Unhandled relocation";
3248 bb_error_msg("%s of type %ld for %s", errmsg,
3249 (long) ELF_R_TYPE(rel->r_info),
3250 strtab + extsym->st_name);
3252 bb_error_msg("%s of type %ld", errmsg,
3253 (long) ELF_R_TYPE(rel->r_info));
3261 /* Finally, take care of the patches. */
3263 if (f->string_patches) {
3264 struct obj_string_patch *p;
3265 struct obj_section *strsec;
3266 ElfW(Addr) strsec_base;
3267 strsec = obj_find_section(f, ".kstrtab");
3268 strsec_base = strsec->header.sh_addr;
3270 for (p = f->string_patches; p; p = p->next) {
3271 struct obj_section *targsec = f->sections[p->reloc_secidx];
3272 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3273 = strsec_base + p->string_offset;
3277 if (f->symbol_patches) {
3278 struct obj_symbol_patch *p;
3280 for (p = f->symbol_patches; p; p = p->next) {
3281 struct obj_section *targsec = f->sections[p->reloc_secidx];
3282 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
3283 = obj_symbol_final_value(f, p->sym);
3290 static int obj_create_image(struct obj_file *f, char *image)
3292 struct obj_section *sec;
3293 ElfW(Addr) base = f->baseaddr;
3295 for (sec = f->load_order; sec; sec = sec->load_next) {
3298 if (sec->contents == 0 || sec->header.sh_size == 0)
3301 secimg = image + (sec->header.sh_addr - base);
3303 /* Note that we allocated data for NOBITS sections earlier. */
3304 memcpy(secimg, sec->contents, sec->header.sh_size);
3310 /*======================================================================*/
3312 static struct obj_file *obj_load(FILE * fp, int loadprogbits ATTRIBUTE_UNUSED)
3315 ElfW(Shdr) * section_headers;
3319 /* Read the file header. */
3321 f = arch_new_file();
3322 f->symbol_cmp = strcmp;
3323 f->symbol_hash = obj_elf_hash;
3324 f->load_order_search_start = &f->load_order;
3326 fseek(fp, 0, SEEK_SET);
3327 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
3328 bb_perror_msg_and_die("error reading ELF header");
3331 if (f->header.e_ident[EI_MAG0] != ELFMAG0
3332 || f->header.e_ident[EI_MAG1] != ELFMAG1
3333 || f->header.e_ident[EI_MAG2] != ELFMAG2
3334 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
3335 bb_error_msg_and_die("not an ELF file");
3337 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3338 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN
3339 ? ELFDATA2MSB : ELFDATA2LSB)
3340 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3341 || !MATCH_MACHINE(f->header.e_machine)) {
3342 bb_error_msg_and_die("ELF file not for this architecture");
3344 if (f->header.e_type != ET_REL) {
3345 bb_error_msg_and_die("ELF file not a relocatable object");
3348 /* Read the section headers. */
3350 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3351 bb_error_msg_and_die("section header size mismatch: %lu != %lu",
3352 (unsigned long) f->header.e_shentsize,
3353 (unsigned long) sizeof(ElfW(Shdr)));
3356 shnum = f->header.e_shnum;
3357 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3358 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3360 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3361 fseek(fp, f->header.e_shoff, SEEK_SET);
3362 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3363 bb_perror_msg_and_die("error reading ELF section headers");
3366 /* Read the section data. */
3368 for (i = 0; i < shnum; ++i) {
3369 struct obj_section *sec;
3371 f->sections[i] = sec = arch_new_section();
3373 sec->header = section_headers[i];
3376 if (sec->header.sh_size) {
3377 switch (sec->header.sh_type) {
3386 if (!loadprogbits) {
3387 sec->contents = NULL;
3394 if (sec->header.sh_size > 0) {
3395 sec->contents = xmalloc(sec->header.sh_size);
3396 fseek(fp, sec->header.sh_offset, SEEK_SET);
3397 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3398 bb_perror_msg_and_die("error reading ELF section data");
3401 sec->contents = NULL;
3405 #if SHT_RELM == SHT_REL
3407 bb_error_msg_and_die("RELA relocations not supported on this architecture");
3410 bb_error_msg_and_die("REL relocations not supported on this architecture");
3413 if (sec->header.sh_type >= SHT_LOPROC) {
3414 /* Assume processor specific section types are debug
3415 info and can safely be ignored. If this is ever not
3416 the case (Hello MIPS?), don't put ifdefs here but
3417 create an arch_load_proc_section(). */
3421 bb_error_msg_and_die("can't handle sections of type %ld",
3422 (long) sec->header.sh_type);
3427 /* Do what sort of interpretation as needed by each section. */
3429 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3431 for (i = 0; i < shnum; ++i) {
3432 struct obj_section *sec = f->sections[i];
3433 sec->name = shstrtab + sec->header.sh_name;
3436 for (i = 0; i < shnum; ++i) {
3437 struct obj_section *sec = f->sections[i];
3439 /* .modinfo should be contents only but gcc has no attribute for that.
3440 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3442 if (strcmp(sec->name, ".modinfo") == 0)
3443 sec->header.sh_flags &= ~SHF_ALLOC;
3445 if (sec->header.sh_flags & SHF_ALLOC)
3446 obj_insert_section_load_order(f, sec);
3448 switch (sec->header.sh_type) {
3451 unsigned long nsym, j;
3455 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3456 bb_error_msg_and_die("symbol size mismatch: %lu != %lu",
3457 (unsigned long) sec->header.sh_entsize,
3458 (unsigned long) sizeof(ElfW(Sym)));
3461 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3462 strtab = f->sections[sec->header.sh_link]->contents;
3463 sym = (ElfW(Sym) *) sec->contents;
3465 /* Allocate space for a table of local symbols. */
3466 j = f->local_symtab_size = sec->header.sh_info;
3467 f->local_symtab = xzalloc(j * sizeof(struct obj_symbol *));
3469 /* Insert all symbols into the hash table. */
3470 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3471 ElfW(Addr) val = sym->st_value;
3474 name = strtab + sym->st_name;
3475 else if (sym->st_shndx < shnum)
3476 name = f->sections[sym->st_shndx]->name;
3479 #if defined(__SH5__)
3481 * For sh64 it is possible that the target of a branch
3482 * requires a mode switch (32 to 16 and back again).
3484 * This is implied by the lsb being set in the target
3485 * address for SHmedia mode and clear for SHcompact.
3487 val |= sym->st_other & 4;
3489 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3496 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3497 bb_error_msg_and_die("relocation entry size mismatch: %lu != %lu",
3498 (unsigned long) sec->header.sh_entsize,
3499 (unsigned long) sizeof(ElfW(RelM)));
3502 /* XXX Relocation code from modutils-2.3.19 is not here.
3503 * Why? That's about 20 lines of code from obj/obj_load.c,
3504 * which gets done in a second pass through the sections.
3505 * This BusyBox insmod does similar work in obj_relocate(). */
3512 #if ENABLE_FEATURE_INSMOD_LOADINKMEM
3514 * load the unloaded sections directly into the memory allocated by
3515 * kernel for the module
3518 static int obj_load_progbits(FILE * fp, struct obj_file* f, char* imagebase)
3520 ElfW(Addr) base = f->baseaddr;
3521 struct obj_section* sec;
3523 for (sec = f->load_order; sec; sec = sec->load_next) {
3525 /* section already loaded? */
3526 if (sec->contents != NULL)
3529 if (sec->header.sh_size == 0)
3532 sec->contents = imagebase + (sec->header.sh_addr - base);
3533 fseek(fp, sec->header.sh_offset, SEEK_SET);
3534 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3535 bb_perror_msg("error reading ELF section data");
3544 static void hide_special_symbols(struct obj_file *f)
3546 static const char *const specials[] = {
3547 SPFX "cleanup_module",
3549 SPFX "kernel_version",
3553 struct obj_symbol *sym;
3554 const char *const *p;
3556 for (p = specials; *p; ++p) {
3557 sym = obj_find_symbol(f, *p);
3559 sym->info = ELF_ST_INFO(STB_LOCAL, ELF_ST_TYPE(sym->info));
3564 #if ENABLE_FEATURE_CHECK_TAINTED_MODULE
3565 static int obj_gpl_license(struct obj_file *f, const char **license)
3567 struct obj_section *sec;
3568 /* This list must match *exactly* the list of allowable licenses in
3569 * linux/include/linux/module.h. Checking for leading "GPL" will not
3570 * work, somebody will use "GPL sucks, this is proprietary".
3572 static const char *const gpl_licenses[] = {
3575 "GPL and additional rights",
3580 sec = obj_find_section(f, ".modinfo");
3582 const char *value, *ptr, *endptr;
3583 ptr = sec->contents;
3584 endptr = ptr + sec->header.sh_size;
3585 while (ptr < endptr) {
3586 value = strchr(ptr, '=');
3587 if (value && strncmp(ptr, "license", value-ptr) == 0) {
3591 for (i = 0; i < ARRAY_SIZE(gpl_licenses); ++i) {
3592 if (strcmp(value+1, gpl_licenses[i]) == 0)
3597 ptr = strchr(ptr, '\0');
3607 #define TAINT_FILENAME "/proc/sys/kernel/tainted"
3608 #define TAINT_PROPRIETORY_MODULE (1 << 0)
3609 #define TAINT_FORCED_MODULE (1 << 1)
3610 #define TAINT_UNSAFE_SMP (1 << 2)
3611 #define TAINT_URL "http://www.tux.org/lkml/#export-tainted"
3613 static void set_tainted(int fd, char *m_name,
3614 int kernel_has_tainted, int taint, const char *text1, const char *text2)
3616 static smallint printed_info;
3621 if (fd < 0 && !kernel_has_tainted)
3622 return; /* New modutils on old kernel */
3623 printf("Warning: loading %s will taint the kernel: %s%s\n",
3624 m_name, text1, text2);
3625 if (!printed_info) {
3626 printf(" See %s for information about tainted modules\n", TAINT_URL);
3630 read(fd, buf, sizeof(buf)-1);
3631 buf[sizeof(buf)-1] = '\0';
3632 oldval = strtoul(buf, NULL, 10);
3633 sprintf(buf, "%d\n", oldval | taint);
3634 write(fd, buf, strlen(buf));
3638 /* Check if loading this module will taint the kernel. */
3639 static void check_tainted_module(struct obj_file *f, char *m_name)
3641 static const char tainted_file[] ALIGN1 = TAINT_FILENAME;
3643 int fd, kernel_has_tainted;
3646 kernel_has_tainted = 1;
3647 fd = open(tainted_file, O_RDWR);
3649 if (errno == ENOENT)
3650 kernel_has_tainted = 0;
3651 else if (errno == EACCES)
3652 kernel_has_tainted = 1;
3654 perror(tainted_file);
3655 kernel_has_tainted = 0;
3659 switch (obj_gpl_license(f, &ptr)) {
3663 set_tainted(fd, m_name, kernel_has_tainted, TAINT_PROPRIETORY_MODULE, "no license", "");
3666 /* The module has a non-GPL license so we pretend that the
3667 * kernel always has a taint flag to get a warning even on
3668 * kernels without the proc flag.
3670 set_tainted(fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "non-GPL license - ", ptr);
3673 set_tainted(fd, m_name, 1, TAINT_PROPRIETORY_MODULE, "Unexpected return from obj_gpl_license", "");
3677 if (flag_force_load)
3678 set_tainted(fd, m_name, 1, TAINT_FORCED_MODULE, "forced load", "");
3683 #else /* FEATURE_CHECK_TAINTED_MODULE */
3684 #define check_tainted_module(x, y) do { } while (0);
3685 #endif /* FEATURE_CHECK_TAINTED_MODULE */
3687 #if ENABLE_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
3688 /* add module source, timestamp, kernel version and a symbol for the
3689 * start of some sections. this info is used by ksymoops to do better
3692 #if !ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3693 #define get_module_version(f, str) get_module_version(str)
3696 get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
3698 #if ENABLE_FEATURE_INSMOD_VERSION_CHECKING
3699 return new_get_module_version(f, str);
3700 #else /* FEATURE_INSMOD_VERSION_CHECKING */
3701 strncpy(str, "???", sizeof(str));
3703 #endif /* FEATURE_INSMOD_VERSION_CHECKING */
3706 /* add module source, timestamp, kernel version and a symbol for the
3707 * start of some sections. this info is used by ksymoops to do better
3711 add_ksymoops_symbols(struct obj_file *f, const char *filename,
3714 static const char symprefix[] ALIGN1 = "__insmod_";
3715 static const char section_names[][8] = {
3723 struct obj_section *sec;
3724 struct obj_symbol *sym;
3725 char *name, *absolute_filename;
3726 char str[STRVERSIONLEN];
3727 int i, 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 == -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>
4187 #include <asm/unistd.h>
4188 #include <sys/syscall.h>
4190 /* We use error numbers in a loose translation... */
4191 static const char *moderror(int err)
4195 return "invalid module format";
4197 return "unknown symbol in module";
4199 return "module has wrong symbol version";
4201 return "invalid parameters";
4203 return strerror(err);
4207 #if !ENABLE_FEATURE_2_4_MODULES
4208 int insmod_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
4209 int insmod_main(int argc ATTRIBUTE_UNUSED, char **argv)
4211 static int insmod_ng_main(int argc ATTRIBUTE_UNUSED, char **argv)
4218 char *filename, *options;
4224 /* Rest is options */
4225 options = xzalloc(1);
4228 options = xrealloc(options, optlen + 2 + strlen(*argv) + 2);
4229 /* Spaces handled by "" pairs, but no way of escaping quotes */
4230 optlen += sprintf(options + optlen, (strchr(*argv,' ') ? "\"%s\" " : "%s "), *argv);
4234 /* Any special reason why mmap? It isn't performace critical... */
4238 fd = xopen(filename, O_RDONLY);
4241 map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
4242 if (map == MAP_FAILED) {
4243 bb_perror_msg_and_die("cannot mmap '%s'", filename);
4246 /* map == NULL on Blackfin, probably on other MMU-less systems too. Workaround. */
4249 xread(fd, map, len);
4252 len = MAXINT(ssize_t);
4253 map = xmalloc_open_read_close(filename, &len);
4256 ret = syscall(__NR_init_module, map, len, options);
4258 bb_error_msg_and_die("cannot insert '%s': %s",
4259 filename, moderror(errno));