1 /* vi: set sw=4 ts=4: */
3 * Mini insmod implementation for busybox
5 * This version of insmod supports x86, ARM, SH3/4, powerpc, m68k,
9 * Copyright (C) 1999,2000,2001 by Lineo, inc.
10 * Written by Erik Andersen <andersen@lineo.com>
11 * and Ron Alder <alder@lineo.com>
13 * Modified by Bryan Rittmeyer <bryan@ixiacom.com> to support SH4
14 * and (theoretically) SH3. I have only tested SH4 in little endian mode.
16 * Modified by Alcove, Julien Gaulmin <julien.gaulmin@alcove.fr> and
17 * Nicolas Ferre <nicolas.ferre@alcove.fr> to support ARM7TDMI. Only
18 * very minor changes required to also work with StrongArm and presumably
19 * all ARM based systems.
21 * Magnus Damm <damm@opensource.se> added PowerPC support 20-Feb-2001.
22 * PowerPC specific code stolen from modutils-2.3.16,
23 * written by Paul Mackerras, Copyright 1996, 1997 Linux International.
24 * I've only tested the code on mpc8xx platforms in big-endian mode.
25 * Did some cleanup and added BB_USE_xxx_ENTRIES...
27 * Quinn Jensen <jensenq@lineo.com> added MIPS support 23-Feb-2001.
28 * based on modutils-2.4.2
29 * MIPS specific support for Elf loading and relocation.
30 * Copyright 1996, 1997 Linux International.
31 * Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>
33 * Based almost entirely on the Linux modutils-2.3.11 implementation.
34 * Copyright 1996, 1997 Linux International.
35 * New implementation contributed by Richard Henderson <rth@tamu.edu>
36 * Based on original work by Bjorn Ekwall <bj0rn@blox.se>
37 * Restructured (and partly rewritten) by:
38 * Björn Ekwall <bj0rn@blox.se> February 1999
40 * This program is free software; you can redistribute it and/or modify
41 * it under the terms of the GNU General Public License as published by
42 * the Free Software Foundation; either version 2 of the License, or
43 * (at your option) any later version.
45 * This program is distributed in the hope that it will be useful,
46 * but WITHOUT ANY WARRANTY; without even the implied warranty of
47 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
48 * General Public License for more details.
50 * You should have received a copy of the GNU General Public License
51 * along with this program; if not, write to the Free Software
52 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
66 #include <sys/utsname.h>
69 #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
70 # define new_sys_init_module init_module
72 # define old_sys_init_module init_module
75 #ifdef BB_FEATURE_INSMOD_LOADINKMEM
81 #if defined(__powerpc__)
82 #define BB_USE_PLT_ENTRIES
83 #define BB_PLT_ENTRY_SIZE 16
87 #define BB_USE_PLT_ENTRIES
88 #define BB_PLT_ENTRY_SIZE 8
89 #define BB_USE_GOT_ENTRIES
90 #define BB_GOT_ENTRY_SIZE 8
94 #define BB_USE_GOT_ENTRIES
95 #define BB_GOT_ENTRY_SIZE 4
99 #define BB_USE_GOT_ENTRIES
100 #define BB_GOT_ENTRY_SIZE 4
103 #if defined(__mips__)
107 //----------------------------------------------------------------------------
108 //--------modutils module.h, lines 45-242
109 //----------------------------------------------------------------------------
111 /* Definitions for the Linux module syscall interface.
112 Copyright 1996, 1997 Linux International.
114 Contributed by Richard Henderson <rth@tamu.edu>
116 This file is part of the Linux modutils.
118 This program is free software; you can redistribute it and/or modify it
119 under the terms of the GNU General Public License as published by the
120 Free Software Foundation; either version 2 of the License, or (at your
121 option) any later version.
123 This program is distributed in the hope that it will be useful, but
124 WITHOUT ANY WARRANTY; without even the implied warranty of
125 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
126 General Public License for more details.
128 You should have received a copy of the GNU General Public License
129 along with this program; if not, write to the Free Software Foundation,
130 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
133 #ifndef MODUTILS_MODULE_H
134 static const int MODUTILS_MODULE_H = 1;
136 #ident "$Id: insmod.c,v 1.70 2001/07/31 22:51:49 andersen Exp $"
138 /* This file contains the structures used by the 2.0 and 2.1 kernels.
139 We do not use the kernel headers directly because we do not wish
140 to be dependant on a particular kernel version to compile insmod. */
143 /*======================================================================*/
144 /* The structures used by Linux 2.0. */
146 /* The symbol format used by get_kernel_syms(2). */
147 struct old_kernel_sym
153 struct old_module_ref
155 unsigned long module; /* kernel addresses */
159 struct old_module_symbol
165 struct old_symbol_table
167 int size; /* total, including string table!!! */
170 struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */
171 struct old_module_ref ref[0]; /* actual size defined by n_refs */
174 struct old_mod_routines
177 unsigned long cleanup;
183 unsigned long ref; /* the list of modules that refer to me */
184 unsigned long symtab;
186 int size; /* size of module in pages */
187 unsigned long addr; /* address of module */
189 unsigned long cleanup; /* cleanup routine */
192 /* Sent to init_module(2) or'ed into the code size parameter. */
193 static const int OLD_MOD_AUTOCLEAN = 0x40000000; /* big enough, but no sign problems... */
195 int get_kernel_syms(struct old_kernel_sym *);
196 int old_sys_init_module(const char *name, char *code, unsigned codesize,
197 struct old_mod_routines *, struct old_symbol_table *);
199 /*======================================================================*/
200 /* For sizeof() which are related to the module platform and not to the
201 environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */
203 #define tgt_sizeof_char sizeof(char)
204 #define tgt_sizeof_short sizeof(short)
205 #define tgt_sizeof_int sizeof(int)
206 #define tgt_sizeof_long sizeof(long)
207 #define tgt_sizeof_char_p sizeof(char *)
208 #define tgt_sizeof_void_p sizeof(void *)
209 #define tgt_long long
211 #if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64)
212 #undef tgt_sizeof_long
213 #undef tgt_sizeof_char_p
214 #undef tgt_sizeof_void_p
216 static const int tgt_sizeof_long = 8;
217 static const int tgt_sizeof_char_p = 8;
218 static const int tgt_sizeof_void_p = 8;
219 #define tgt_long long long
222 /*======================================================================*/
223 /* The structures used in Linux 2.1. */
225 /* Note: new_module_symbol does not use tgt_long intentionally */
226 struct new_module_symbol
232 struct new_module_persist;
234 struct new_module_ref
236 unsigned tgt_long dep; /* kernel addresses */
237 unsigned tgt_long ref;
238 unsigned tgt_long next_ref;
243 unsigned tgt_long size_of_struct; /* == sizeof(module) */
244 unsigned tgt_long next;
245 unsigned tgt_long name;
246 unsigned tgt_long size;
249 unsigned tgt_long flags; /* AUTOCLEAN et al */
254 unsigned tgt_long syms;
255 unsigned tgt_long deps;
256 unsigned tgt_long refs;
257 unsigned tgt_long init;
258 unsigned tgt_long cleanup;
259 unsigned tgt_long ex_table_start;
260 unsigned tgt_long ex_table_end;
262 unsigned tgt_long gp;
264 /* Everything after here is extension. */
265 unsigned tgt_long persist_start;
266 unsigned tgt_long persist_end;
267 unsigned tgt_long can_unload;
268 unsigned tgt_long runsize;
269 #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
270 const char *kallsyms_start; /* All symbols for kernel debugging */
271 const char *kallsyms_end;
272 const char *archdata_start; /* arch specific data for module */
273 const char *archdata_end;
274 const char *kernel_data; /* Reserved for kernel internal use */
278 #define ARCHDATA_SEC_NAME "__archdata"
279 #define KALLSYMS_SEC_NAME "__kallsyms"
282 struct new_module_info
290 /* Bits of module.flags. */
291 static const int NEW_MOD_RUNNING = 1;
292 static const int NEW_MOD_DELETED = 2;
293 static const int NEW_MOD_AUTOCLEAN = 4;
294 static const int NEW_MOD_VISITED = 8;
295 static const int NEW_MOD_USED_ONCE = 16;
297 int new_sys_init_module(const char *name, const struct new_module *);
298 int query_module(const char *name, int which, void *buf, size_t bufsize,
301 /* Values for query_module's which. */
303 static const int QM_MODULES = 1;
304 static const int QM_DEPS = 2;
305 static const int QM_REFS = 3;
306 static const int QM_SYMBOLS = 4;
307 static const int QM_INFO = 5;
309 /*======================================================================*/
310 /* The system calls unchanged between 2.0 and 2.1. */
312 unsigned long create_module(const char *, size_t);
313 int delete_module(const char *);
316 #endif /* module.h */
318 //----------------------------------------------------------------------------
319 //--------end of modutils module.h
320 //----------------------------------------------------------------------------
324 //----------------------------------------------------------------------------
325 //--------modutils obj.h, lines 253-462
326 //----------------------------------------------------------------------------
328 /* Elf object file loading and relocation routines.
329 Copyright 1996, 1997 Linux International.
331 Contributed by Richard Henderson <rth@tamu.edu>
333 This file is part of the Linux modutils.
335 This program is free software; you can redistribute it and/or modify it
336 under the terms of the GNU General Public License as published by the
337 Free Software Foundation; either version 2 of the License, or (at your
338 option) any later version.
340 This program is distributed in the hope that it will be useful, but
341 WITHOUT ANY WARRANTY; without even the implied warranty of
342 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
343 General Public License for more details.
345 You should have received a copy of the GNU General Public License
346 along with this program; if not, write to the Free Software Foundation,
347 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
350 #ifndef MODUTILS_OBJ_H
351 static const int MODUTILS_OBJ_H = 1;
353 #ident "$Id: insmod.c,v 1.70 2001/07/31 22:51:49 andersen Exp $"
355 /* The relocatable object is manipulated using elfin types. */
361 /* Machine-specific elf macros for i386 et al. */
363 /* the SH changes have only been tested on the SH4 in =little endian= mode */
364 /* I'm not sure about big endian, so let's warn: */
366 #if (defined(__SH4__) || defined(__SH3__)) && defined(__BIG_ENDIAN__)
367 #error insmod.c may require changes for use on big endian SH4/SH3
370 /* it may or may not work on the SH1/SH2... So let's error on those
372 #if (defined(__sh__) && (!(defined(__SH3__) || defined(__SH4__))))
373 #error insmod.c may require changes for non-SH3/SH4 use
376 #define ELFCLASSM ELFCLASS32
378 #if (defined(__mc68000__))
379 #define ELFDATAM ELFDATA2MSB
386 #define MATCH_MACHINE(x) (x == EM_SH)
387 #define SHT_RELM SHT_RELA
388 #define Elf32_RelM Elf32_Rela
389 #define ELFDATAM ELFDATA2LSB
391 #elif defined(__arm__)
393 #define MATCH_MACHINE(x) (x == EM_ARM)
394 #define SHT_RELM SHT_REL
395 #define Elf32_RelM Elf32_Rel
396 #define ELFDATAM ELFDATA2LSB
398 #elif defined(__powerpc__)
400 #define MATCH_MACHINE(x) (x == EM_PPC)
401 #define SHT_RELM SHT_RELA
402 #define Elf32_RelM Elf32_Rela
403 #define ELFDATAM ELFDATA2MSB
405 #elif defined(__mips__)
407 /* Account for ELF spec changes. */
408 #ifndef EM_MIPS_RS3_LE
409 #ifdef EM_MIPS_RS4_BE
410 #define EM_MIPS_RS3_LE EM_MIPS_RS4_BE
412 #define EM_MIPS_RS3_LE 10
414 #endif /* !EM_MIPS_RS3_LE */
416 #define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE)
417 #define SHT_RELM SHT_REL
418 #define Elf32_RelM Elf32_Rel
420 #define ELFDATAM ELFDATA2MSB
423 #define ELFDATAM ELFDATA2LSB
426 #elif defined(__i386__)
428 /* presumably we can use these for anything but the SH and ARM*/
429 /* this is the previous behavior, but it does result in
430 insmod.c being broken on anything except i386 */
432 #define MATCH_MACHINE(x) (x == EM_386)
434 #define MATCH_MACHINE(x) (x == EM_386 || x == EM_486)
437 #define SHT_RELM SHT_REL
438 #define Elf32_RelM Elf32_Rel
439 #define ELFDATAM ELFDATA2LSB
441 #elif defined(__mc68000__)
443 #define MATCH_MACHINE(x) (x == EM_68K)
444 #define SHT_RELM SHT_RELA
445 #define Elf32_RelM Elf32_Rela
448 #error Sorry, but insmod.c does not yet support this architecture...
452 # if ELFCLASSM == ELFCLASS32
453 # define ElfW(x) Elf32_ ## x
454 # define ELFW(x) ELF32_ ## x
456 # define ElfW(x) Elf64_ ## x
457 # define ELFW(x) ELF64_ ## x
461 /* For some reason this is missing from libc5. */
462 #ifndef ELF32_ST_INFO
463 # define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
466 #ifndef ELF64_ST_INFO
467 # define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
470 struct obj_string_patch;
471 struct obj_symbol_patch;
478 struct obj_section *load_next;
484 struct obj_symbol *next; /* hash table link */
488 int secidx; /* the defining section index/module */
490 int ksymidx; /* for export to the kernel symtab */
491 int referenced; /* actually used in the link */
494 /* Hardcode the hash table size. We shouldn't be needing so many
495 symbols that we begin to degrade performance, and we get a big win
496 by giving the compiler a constant divisor. */
498 #define HASH_BUCKETS 521
504 struct obj_section **sections;
505 struct obj_section *load_order;
506 struct obj_section **load_order_search_start;
507 struct obj_string_patch *string_patches;
508 struct obj_symbol_patch *symbol_patches;
509 int (*symbol_cmp)(const char *, const char *);
510 unsigned long (*symbol_hash)(const char *);
511 unsigned long local_symtab_size;
512 struct obj_symbol **local_symtab;
513 struct obj_symbol *symtab[HASH_BUCKETS];
524 struct obj_string_patch
526 struct obj_string_patch *next;
528 ElfW(Addr) reloc_offset;
529 ElfW(Addr) string_offset;
532 struct obj_symbol_patch
534 struct obj_symbol_patch *next;
536 ElfW(Addr) reloc_offset;
537 struct obj_symbol *sym;
541 /* Generic object manipulation routines. */
543 static unsigned long obj_elf_hash(const char *);
545 static unsigned long obj_elf_hash_n(const char *, unsigned long len);
547 static struct obj_symbol *obj_find_symbol (struct obj_file *f,
550 static ElfW(Addr) obj_symbol_final_value(struct obj_file *f,
551 struct obj_symbol *sym);
553 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
554 static void obj_set_symbol_compare(struct obj_file *f,
555 int (*cmp)(const char *, const char *),
556 unsigned long (*hash)(const char *));
559 static struct obj_section *obj_find_section (struct obj_file *f,
562 static void obj_insert_section_load_order (struct obj_file *f,
563 struct obj_section *sec);
565 static struct obj_section *obj_create_alloced_section (struct obj_file *f,
570 static struct obj_section *obj_create_alloced_section_first (struct obj_file *f,
575 static void *obj_extend_section (struct obj_section *sec, unsigned long more);
577 static int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
580 static int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
581 struct obj_symbol *sym);
583 static int obj_check_undefineds(struct obj_file *f);
585 static void obj_allocate_commons(struct obj_file *f);
587 static unsigned long obj_load_size (struct obj_file *f);
589 static int obj_relocate (struct obj_file *f, ElfW(Addr) base);
591 static struct obj_file *obj_load(FILE *f, int loadprogbits);
593 static int obj_create_image (struct obj_file *f, char *image);
595 /* Architecture specific manipulation routines. */
597 static struct obj_file *arch_new_file (void);
599 static struct obj_section *arch_new_section (void);
601 static struct obj_symbol *arch_new_symbol (void);
603 static enum obj_reloc arch_apply_relocation (struct obj_file *f,
604 struct obj_section *targsec,
605 struct obj_section *symsec,
606 struct obj_symbol *sym,
607 ElfW(RelM) *rel, ElfW(Addr) value);
609 static int arch_create_got (struct obj_file *f);
611 static int arch_init_module (struct obj_file *f, struct new_module *);
614 //----------------------------------------------------------------------------
615 //--------end of modutils obj.h
616 //----------------------------------------------------------------------------
622 #define _PATH_MODULES "/lib/modules"
623 static const int STRVERSIONLEN = 32;
625 /*======================================================================*/
627 static int flag_force_load = 0;
628 static int flag_autoclean = 0;
629 static int flag_verbose = 0;
630 static int flag_export = 1;
633 /*======================================================================*/
635 /* previously, these were named i386_* but since we could be
636 compiling for the sh, I've renamed them to the more general
637 arch_* These structures are the same between the x86 and SH,
638 and we can't support anything else right now anyway. In the
639 future maybe they should be #if defined'd */
645 #if defined(BB_USE_PLT_ENTRIES)
646 struct arch_plt_entry
650 int inited:1; /* has been set up */
654 #if defined(BB_USE_GOT_ENTRIES)
655 struct arch_got_entry {
657 unsigned offset_done:1;
658 unsigned reloc_done:1;
662 #if defined(__mips__)
665 struct mips_hi16 *next;
672 struct obj_file root;
673 #if defined(BB_USE_PLT_ENTRIES)
674 struct obj_section *plt;
676 #if defined(BB_USE_GOT_ENTRIES)
677 struct obj_section *got;
679 #if defined(__mips__)
680 struct mips_hi16 *mips_hi16_list;
685 struct obj_symbol root;
686 #if defined(BB_USE_PLT_ENTRIES)
687 struct arch_plt_entry pltent;
689 #if defined(BB_USE_GOT_ENTRIES)
690 struct arch_got_entry gotent;
695 struct external_module {
700 struct new_module_symbol *syms;
703 static struct new_module_symbol *ksyms;
704 static size_t nksyms;
706 static struct external_module *ext_modules;
707 static int n_ext_modules;
708 static int n_ext_modules_used;
709 extern int delete_module(const char *);
711 static char m_filename[FILENAME_MAX + 1];
712 static char m_fullName[FILENAME_MAX + 1];
716 /*======================================================================*/
719 static int check_module_name_match(const char *filename, struct stat *statbuf,
722 char *fullname = (char *) userdata;
724 if (fullname[0] == '\0')
727 char *tmp, *tmp1 = strdup(filename);
728 tmp = get_last_path_component(tmp1);
729 if (strcmp(tmp, fullname) == 0) {
731 /* Stop searching if we find a match */
732 safe_strncpy(m_filename, filename, sizeof(m_filename));
741 /*======================================================================*/
743 static struct obj_file *arch_new_file(void)
746 f = xmalloc(sizeof(*f));
748 #if defined(BB_USE_PLT_ENTRIES)
751 #if defined(BB_USE_GOT_ENTRIES)
754 #if defined(__mips__)
755 f->mips_hi16_list = NULL;
761 static struct obj_section *arch_new_section(void)
763 return xmalloc(sizeof(struct obj_section));
766 static struct obj_symbol *arch_new_symbol(void)
768 struct arch_symbol *sym;
769 sym = xmalloc(sizeof(*sym));
771 #if defined(BB_USE_PLT_ENTRIES)
772 memset(&sym->pltent, 0, sizeof(sym->pltent));
774 #if defined(BB_USE_GOT_ENTRIES)
775 memset(&sym->gotent, 0, sizeof(sym->gotent));
781 static enum obj_reloc
782 arch_apply_relocation(struct obj_file *f,
783 struct obj_section *targsec,
784 struct obj_section *symsec,
785 struct obj_symbol *sym,
786 ElfW(RelM) *rel, ElfW(Addr) v)
788 struct arch_file *ifile = (struct arch_file *) f;
789 #if !(defined(__mips__))
790 struct arch_symbol *isym = (struct arch_symbol *) sym;
793 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
794 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
795 #if defined(BB_USE_GOT_ENTRIES)
796 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
798 #if defined(BB_USE_PLT_ENTRIES)
799 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
800 struct arch_plt_entry *pe;
803 enum obj_reloc ret = obj_reloc_ok;
805 switch (ELF32_R_TYPE(rel->r_info)) {
807 /* even though these constants seem to be the same for
808 the i386 and the sh, we "#if define" them for clarity
809 and in case that ever changes */
812 #elif defined(__arm__)
814 #elif defined(__i386__)
816 #elif defined(__mc68000__)
818 #elif defined(__powerpc__)
820 #elif defined(__mips__)
827 #elif defined(__arm__)
829 #elif defined(__i386__)
831 #elif defined(__mc68000__)
833 #elif defined(__powerpc__)
835 #elif defined(__mips__)
840 #if defined(__mc68000__)
843 ret = obj_reloc_overflow;
848 ret = obj_reloc_overflow;
851 #endif /* __mc68000__ */
853 #if defined(__powerpc__)
854 case R_PPC_ADDR16_HA:
855 *(unsigned short *)loc = (v + 0x8000) >> 16;
858 case R_PPC_ADDR16_HI:
859 *(unsigned short *)loc = v >> 16;
862 case R_PPC_ADDR16_LO:
863 *(unsigned short *)loc = v;
867 #if defined(__mips__)
870 ret = obj_reloc_dangerous;
871 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
872 ret = obj_reloc_overflow;
874 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
882 /* We cannot relocate this one now because we don't know the value
883 of the carry we need to add. Save the information, and let LO16
884 do the actual relocation. */
885 n = (struct mips_hi16 *) xmalloc(sizeof *n);
888 n->next = ifile->mips_hi16_list;
889 ifile->mips_hi16_list = n;
895 unsigned long insnlo = *loc;
896 Elf32_Addr val, vallo;
898 /* Sign extend the addend we extract from the lo insn. */
899 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
901 if (ifile->mips_hi16_list != NULL) {
904 l = ifile->mips_hi16_list;
906 struct mips_hi16 *next;
909 /* The value for the HI16 had best be the same. */
910 assert(v == l->value);
912 /* Do the HI16 relocation. Note that we actually don't
913 need to know anything about the LO16 itself, except where
914 to find the low 16 bits of the addend needed by the LO16. */
917 ((insn & 0xffff) << 16) +
921 /* Account for the sign extension that will happen in the
928 insn = (insn & ~0xffff) | val;
936 ifile->mips_hi16_list = NULL;
939 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
941 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
948 #elif defined(__sh__)
952 #elif defined(__i386__)
957 #elif defined(__mc68000__)
960 if ((Elf32_Sword)v > 0x7f || (Elf32_Sword)v < -(Elf32_Sword)0x80)
961 ret = obj_reloc_overflow;
966 if ((Elf32_Sword)v > 0x7fff || (Elf32_Sword)v < -(Elf32_Sword)0x8000)
967 ret = obj_reloc_overflow;
971 *(int *)loc = v - dot;
973 #elif defined(__powerpc__)
983 #elif defined(__i386__)
986 #if defined(BB_USE_PLT_ENTRIES)
992 #if defined(__powerpc__)
995 /* find the plt entry and initialize it if necessary */
996 assert(isym != NULL);
998 pe = (struct arch_plt_entry*) &isym->pltent;
1001 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1003 /* generate some machine code */
1005 #if defined(__arm__)
1006 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1007 ip[1] = v; /* sym@ */
1009 #if defined(__powerpc__)
1010 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1011 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1012 ip[2] = 0x7d6903a6; /* mtctr r11 */
1013 ip[3] = 0x4e800420; /* bctr */
1018 /* relative distance to target */
1020 /* if the target is too far away.... */
1021 if ((int)v < -0x02000000 || (int)v >= 0x02000000) {
1022 /* go via the plt */
1023 v = plt + pe->offset - dot;
1026 ret = obj_reloc_dangerous;
1028 /* merge the offset into the instruction. */
1029 #if defined(__arm__)
1030 /* Convert to words. */
1033 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1035 #if defined(__powerpc__)
1036 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1039 #endif /* BB_USE_PLT_ENTRIES */
1041 #if defined(__arm__)
1042 #elif defined(__sh__)
1047 #elif defined(__i386__)
1048 case R_386_GLOB_DAT:
1049 case R_386_JMP_SLOT:
1052 #elif defined(__mc68000__)
1053 case R_68K_GLOB_DAT:
1054 case R_68K_JMP_SLOT:
1059 #if defined(__arm__)
1060 #elif defined(__sh__)
1062 *loc += f->baseaddr + rel->r_addend;
1064 #elif defined(__i386__)
1065 case R_386_RELATIVE:
1066 *loc += f->baseaddr;
1068 #elif defined(__mc68000__)
1069 case R_68K_RELATIVE:
1070 *(int *)loc += f->baseaddr;
1074 #if defined(BB_USE_GOT_ENTRIES)
1076 #if !defined(__68k__)
1079 #elif defined(__arm__)
1081 #elif defined(__i386__)
1086 *loc += got - dot + rel->r_addend;;
1087 #elif defined(__i386__) || defined(__arm__) || defined(__m68k_)
1095 #elif defined(__arm__)
1097 #elif defined(__i386__)
1099 #elif defined(__mc68000__)
1102 assert(isym != NULL);
1103 /* needs an entry in the .got: set it, once */
1104 if (!isym->gotent.reloc_done) {
1105 isym->gotent.reloc_done = 1;
1106 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1108 /* make the reloc with_respect_to_.got */
1110 *loc += isym->gotent.offset + rel->r_addend;
1111 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1112 *loc += isym->gotent.offset;
1116 /* address relative to the got */
1117 #if !defined(__mc68000__)
1120 #elif defined(__arm__)
1122 #elif defined(__i386__)
1124 #elif defined(__mc68000__)
1130 #endif // __mc68000__
1132 #endif /* BB_USE_GOT_ENTRIES */
1135 printf("Warning: unhandled reloc %d\n",(int)ELF32_R_TYPE(rel->r_info));
1136 ret = obj_reloc_unhandled;
1143 static int arch_create_got(struct obj_file *f)
1145 #if defined(BB_USE_GOT_ENTRIES) || defined(BB_USE_PLT_ENTRIES)
1146 struct arch_file *ifile = (struct arch_file *) f;
1148 #if defined(BB_USE_GOT_ENTRIES)
1149 int got_offset = 0, gotneeded = 0;
1151 #if defined(BB_USE_PLT_ENTRIES)
1152 int plt_offset = 0, pltneeded = 0;
1154 struct obj_section *relsec, *symsec, *strsec;
1155 ElfW(RelM) *rel, *relend;
1156 ElfW(Sym) *symtab, *extsym;
1157 const char *strtab, *name;
1158 struct arch_symbol *intsym;
1160 for (i = 0; i < f->header.e_shnum; ++i) {
1161 relsec = f->sections[i];
1162 if (relsec->header.sh_type != SHT_RELM)
1165 symsec = f->sections[relsec->header.sh_link];
1166 strsec = f->sections[symsec->header.sh_link];
1168 rel = (ElfW(RelM) *) relsec->contents;
1169 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1170 symtab = (ElfW(Sym) *) symsec->contents;
1171 strtab = (const char *) strsec->contents;
1173 for (; rel < relend; ++rel) {
1174 extsym = &symtab[ELF32_R_SYM(rel->r_info)];
1176 switch (ELF32_R_TYPE(rel->r_info)) {
1177 #if defined(__arm__)
1180 #elif defined(__sh__)
1183 #elif defined(__i386__)
1186 #elif defined(__mc68000__)
1191 #if defined(__powerpc__)
1197 #if defined(__arm__)
1206 if (got_offset == 0)
1208 #elif defined(__sh__)
1212 #elif defined(__i386__)
1222 if (extsym->st_name != 0) {
1223 name = strtab + extsym->st_name;
1225 name = f->sections[extsym->st_shndx]->name;
1227 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1228 #if defined(BB_USE_GOT_ENTRIES)
1229 if (!intsym->gotent.offset_done) {
1230 intsym->gotent.offset_done = 1;
1231 intsym->gotent.offset = got_offset;
1232 got_offset += BB_GOT_ENTRY_SIZE;
1235 #if defined(BB_USE_PLT_ENTRIES)
1236 if (pltneeded && intsym->pltent.allocated == 0) {
1237 intsym->pltent.allocated = 1;
1238 intsym->pltent.offset = plt_offset;
1239 plt_offset += BB_PLT_ENTRY_SIZE;
1240 intsym->pltent.inited = 0;
1247 #if defined(BB_USE_GOT_ENTRIES)
1249 struct obj_section* myrelsec = obj_find_section(f, ".got");
1252 obj_extend_section(myrelsec, got_offset);
1254 myrelsec = obj_create_alloced_section(f, ".got",
1260 ifile->got = myrelsec;
1264 #if defined(BB_USE_PLT_ENTRIES)
1266 ifile->plt = obj_create_alloced_section(f, ".plt",
1274 static int arch_init_module(struct obj_file *f, struct new_module *mod)
1280 /*======================================================================*/
1282 /* Standard ELF hash function. */
1283 static inline unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1285 unsigned long h = 0;
1292 if ((g = (h & 0xf0000000)) != 0) {
1301 static unsigned long obj_elf_hash(const char *name)
1303 return obj_elf_hash_n(name, strlen(name));
1306 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
1307 /* Get the kernel version in the canonical integer form. */
1309 static int get_kernel_version(char str[STRVERSIONLEN])
1311 struct utsname uts_info;
1314 if (uname(&uts_info) < 0)
1316 strncpy(str, uts_info.release, STRVERSIONLEN);
1318 kv = get_kernel_revision();
1323 /* String comparison for non-co-versioned kernel and module. */
1325 static int ncv_strcmp(const char *a, const char *b)
1327 size_t alen = strlen(a), blen = strlen(b);
1329 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
1330 return strncmp(a, b, alen);
1331 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
1332 return strncmp(a, b, blen);
1334 return strcmp(a, b);
1337 /* String hashing for non-co-versioned kernel and module. Here
1338 we are simply forced to drop the crc from the hash. */
1340 static unsigned long ncv_symbol_hash(const char *str)
1342 size_t len = strlen(str);
1343 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
1345 return obj_elf_hash_n(str, len);
1349 obj_set_symbol_compare(struct obj_file *f,
1350 int (*cmp) (const char *, const char *),
1351 unsigned long (*hash) (const char *))
1354 f->symbol_cmp = cmp;
1356 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
1359 f->symbol_hash = hash;
1361 memcpy(tmptab, f->symtab, sizeof(tmptab));
1362 memset(f->symtab, 0, sizeof(f->symtab));
1364 for (i = 0; i < HASH_BUCKETS; ++i)
1365 for (sym = tmptab[i]; sym; sym = next) {
1366 unsigned long h = hash(sym->name) % HASH_BUCKETS;
1368 sym->next = f->symtab[h];
1374 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
1376 static struct obj_symbol *
1377 obj_add_symbol(struct obj_file *f, const char *name,
1378 unsigned long symidx, int info,
1379 int secidx, ElfW(Addr) value,
1382 struct obj_symbol *sym;
1383 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
1384 int n_type = ELFW(ST_TYPE) (info);
1385 int n_binding = ELFW(ST_BIND) (info);
1387 for (sym = f->symtab[hash]; sym; sym = sym->next)
1388 if (f->symbol_cmp(sym->name, name) == 0) {
1389 int o_secidx = sym->secidx;
1390 int o_info = sym->info;
1391 int o_type = ELFW(ST_TYPE) (o_info);
1392 int o_binding = ELFW(ST_BIND) (o_info);
1394 /* A redefinition! Is it legal? */
1396 if (secidx == SHN_UNDEF)
1398 else if (o_secidx == SHN_UNDEF)
1400 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
1401 /* Cope with local and global symbols of the same name
1402 in the same object file, as might have been created
1403 by ld -r. The only reason locals are now seen at this
1404 level at all is so that we can do semi-sensible things
1407 struct obj_symbol *nsym, **p;
1409 nsym = arch_new_symbol();
1410 nsym->next = sym->next;
1413 /* Excise the old (local) symbol from the hash chain. */
1414 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
1418 } else if (n_binding == STB_LOCAL) {
1419 /* Another symbol of the same name has already been defined.
1420 Just add this to the local table. */
1421 sym = arch_new_symbol();
1424 f->local_symtab[symidx] = sym;
1426 } else if (n_binding == STB_WEAK)
1428 else if (o_binding == STB_WEAK)
1430 /* Don't unify COMMON symbols with object types the programmer
1432 else if (secidx == SHN_COMMON
1433 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
1435 else if (o_secidx == SHN_COMMON
1436 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
1439 /* Don't report an error if the symbol is coming from
1440 the kernel or some external module. */
1441 if (secidx <= SHN_HIRESERVE)
1442 error_msg("%s multiply defined", name);
1447 /* Completely new symbol. */
1448 sym = arch_new_symbol();
1449 sym->next = f->symtab[hash];
1450 f->symtab[hash] = sym;
1453 if (ELFW(ST_BIND)(info) == STB_LOCAL && symidx != -1) {
1454 if (symidx >= f->local_symtab_size)
1455 error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
1456 name, (long) symidx, (long) f->local_symtab_size);
1458 f->local_symtab[symidx] = sym;
1465 sym->secidx = secidx;
1471 static struct obj_symbol *
1472 obj_find_symbol(struct obj_file *f, const char *name)
1474 struct obj_symbol *sym;
1475 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
1477 for (sym = f->symtab[hash]; sym; sym = sym->next)
1478 if (f->symbol_cmp(sym->name, name) == 0)
1485 obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
1488 if (sym->secidx >= SHN_LORESERVE)
1491 return sym->value + f->sections[sym->secidx]->header.sh_addr;
1493 /* As a special case, a NULL sym has value zero. */
1498 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
1500 int i, n = f->header.e_shnum;
1502 for (i = 0; i < n; ++i)
1503 if (strcmp(f->sections[i]->name, name) == 0)
1504 return f->sections[i];
1509 static int obj_load_order_prio(struct obj_section *a)
1511 unsigned long af, ac;
1513 af = a->header.sh_flags;
1516 if (a->name[0] != '.' || strlen(a->name) != 10 ||
1517 strcmp(a->name + 5, ".init"))
1521 if (!(af & SHF_WRITE))
1523 if (af & SHF_EXECINSTR)
1525 if (a->header.sh_type != SHT_NOBITS)
1532 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
1534 struct obj_section **p;
1535 int prio = obj_load_order_prio(sec);
1536 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
1537 if (obj_load_order_prio(*p) < prio)
1539 sec->load_next = *p;
1543 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
1545 unsigned long align,
1548 int newidx = f->header.e_shnum++;
1549 struct obj_section *sec;
1551 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
1552 f->sections[newidx] = sec = arch_new_section();
1554 memset(sec, 0, sizeof(*sec));
1555 sec->header.sh_type = SHT_PROGBITS;
1556 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
1557 sec->header.sh_size = size;
1558 sec->header.sh_addralign = align;
1562 sec->contents = xmalloc(size);
1564 obj_insert_section_load_order(f, sec);
1569 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
1571 unsigned long align,
1574 int newidx = f->header.e_shnum++;
1575 struct obj_section *sec;
1577 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
1578 f->sections[newidx] = sec = arch_new_section();
1580 memset(sec, 0, sizeof(*sec));
1581 sec->header.sh_type = SHT_PROGBITS;
1582 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
1583 sec->header.sh_size = size;
1584 sec->header.sh_addralign = align;
1588 sec->contents = xmalloc(size);
1590 sec->load_next = f->load_order;
1591 f->load_order = sec;
1592 if (f->load_order_search_start == &f->load_order)
1593 f->load_order_search_start = &sec->load_next;
1598 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
1600 unsigned long oldsize = sec->header.sh_size;
1602 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
1604 return sec->contents + oldsize;
1608 /* Conditionally add the symbols from the given symbol set to the
1614 int idx, struct new_module_symbol *syms, size_t nsyms)
1616 struct new_module_symbol *s;
1620 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
1622 /* Only add symbols that are already marked external. If we
1623 override locals we may cause problems for argument initialization.
1624 We will also create a false dependency on the module. */
1625 struct obj_symbol *sym;
1627 sym = obj_find_symbol(f, (char *) s->name);
1628 if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) {
1629 sym = obj_add_symbol(f, (char *) s->name, -1,
1630 ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
1632 /* Did our symbol just get installed? If so, mark the
1633 module as "used". */
1634 if (sym->secidx == idx)
1642 static void add_kernel_symbols(struct obj_file *f)
1644 struct external_module *m;
1647 /* Add module symbols first. */
1649 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m)
1651 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms,
1652 m->nsyms)) m->used = 1, ++nused;
1654 n_ext_modules_used = nused;
1656 /* And finally the symbols from the kernel proper. */
1659 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
1662 static char *get_modinfo_value(struct obj_file *f, const char *key)
1664 struct obj_section *sec;
1665 char *p, *v, *n, *ep;
1666 size_t klen = strlen(key);
1668 sec = obj_find_section(f, ".modinfo");
1672 ep = p + sec->header.sh_size;
1675 n = strchr(p, '\0');
1677 if (p + klen == v && strncmp(p, key, klen) == 0)
1680 if (p + klen == n && strcmp(p, key) == 0)
1690 /*======================================================================*/
1691 /* Functions relating to module loading in pre 2.1 kernels. */
1694 old_process_module_arguments(struct obj_file *f, int argc, char **argv)
1698 struct obj_symbol *sym;
1702 if ((q = strchr(p, '=')) == NULL) {
1708 sym = obj_find_symbol(f, p);
1710 /* Also check that the parameter was not resolved from the kernel. */
1711 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
1712 error_msg("symbol for parameter %s not found", p);
1716 loc = (int *) (f->sections[sym->secidx]->contents + sym->value);
1718 /* Do C quoting if we begin with a ". */
1722 str = alloca(strlen(q));
1723 for (r = str, q++; *q != '"'; ++q, ++r) {
1725 error_msg("improperly terminated string argument for %s", p);
1727 } else if (*q == '\\')
1761 if (q[1] >= '0' && q[1] <= '7') {
1762 c = (c * 8) + *++q - '0';
1763 if (q[1] >= '0' && q[1] <= '7')
1764 c = (c * 8) + *++q - '0';
1777 obj_string_patch(f, sym->secidx, sym->value, str);
1778 } else if (*q >= '0' && *q <= '9') {
1780 *loc++ = strtoul(q, &q, 0);
1781 while (*q++ == ',');
1783 char *contents = f->sections[sym->secidx]->contents;
1784 char *myloc = contents + sym->value;
1785 char *r; /* To search for commas */
1787 /* Break the string with comas */
1788 while ((r = strchr(q, ',')) != (char *) NULL) {
1790 obj_string_patch(f, sym->secidx, myloc - contents, q);
1791 myloc += sizeof(char *);
1796 obj_string_patch(f, sym->secidx, myloc - contents, q);
1805 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
1806 static int old_is_module_checksummed(struct obj_file *f)
1808 return obj_find_symbol(f, "Using_Versions") != NULL;
1810 /* Get the module's kernel version in the canonical integer form. */
1813 old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
1815 struct obj_symbol *sym;
1819 sym = obj_find_symbol(f, "kernel_version");
1823 p = f->sections[sym->secidx]->contents + sym->value;
1824 strncpy(str, p, STRVERSIONLEN);
1826 a = strtoul(p, &p, 10);
1829 b = strtoul(p + 1, &p, 10);
1832 c = strtoul(p + 1, &q, 10);
1836 return a << 16 | b << 8 | c;
1839 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
1841 #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
1843 /* Fetch all the symbols and divvy them up as appropriate for the modules. */
1845 static int old_get_kernel_symbols(const char *m_name)
1847 struct old_kernel_sym *ks, *k;
1848 struct new_module_symbol *s;
1849 struct external_module *mod;
1850 int nks, nms, nmod, i;
1852 nks = get_kernel_syms(NULL);
1855 perror_msg("get_kernel_syms: %s", m_name);
1857 error_msg("No kernel symbols");
1861 ks = k = xmalloc(nks * sizeof(*ks));
1863 if (get_kernel_syms(ks) != nks) {
1864 perror("inconsistency with get_kernel_syms -- is someone else "
1865 "playing with modules?");
1870 /* Collect the module information. */
1875 while (k->name[0] == '#' && k->name[1]) {
1876 struct old_kernel_sym *k2;
1878 /* Find out how many symbols this module has. */
1879 for (k2 = k + 1; k2->name[0] != '#'; ++k2)
1883 mod = xrealloc(mod, (++nmod + 1) * sizeof(*mod));
1884 mod[nmod].name = k->name + 1;
1885 mod[nmod].addr = k->value;
1887 mod[nmod].nsyms = nms;
1888 mod[nmod].syms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL);
1890 for (i = 0, ++k; i < nms; ++i, ++s, ++k) {
1891 s->name = (unsigned long) k->name;
1892 s->value = k->value;
1899 n_ext_modules = nmod + 1;
1901 /* Now collect the symbols for the kernel proper. */
1903 if (k->name[0] == '#')
1906 nksyms = nms = nks - (k - ks);
1907 ksyms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL);
1909 for (i = 0; i < nms; ++i, ++s, ++k) {
1910 s->name = (unsigned long) k->name;
1911 s->value = k->value;
1917 /* Return the kernel symbol checksum version, or zero if not used. */
1919 static int old_is_kernel_checksummed(void)
1921 /* Using_Versions is the first symbol. */
1923 && strcmp((char *) ksyms[0].name,
1924 "Using_Versions") == 0) return ksyms[0].value;
1930 static int old_create_mod_use_count(struct obj_file *f)
1932 struct obj_section *sec;
1934 sec = obj_create_alloced_section_first(f, ".moduse", sizeof(long),
1937 obj_add_symbol(f, "mod_use_count_", -1,
1938 ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0,
1945 old_init_module(const char *m_name, struct obj_file *f,
1946 unsigned long m_size)
1949 struct old_mod_routines routines;
1950 struct old_symbol_table *symtab;
1953 /* Create the symbol table */
1955 int nsyms = 0, strsize = 0, total;
1957 /* Size things first... */
1960 for (i = 0; i < HASH_BUCKETS; ++i) {
1961 struct obj_symbol *sym;
1962 for (sym = f->symtab[i]; sym; sym = sym->next)
1963 if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
1964 && sym->secidx <= SHN_HIRESERVE)
1966 sym->ksymidx = nsyms++;
1967 strsize += strlen(sym->name) + 1;
1972 total = (sizeof(struct old_symbol_table)
1973 + nsyms * sizeof(struct old_module_symbol)
1974 + n_ext_modules_used * sizeof(struct old_module_ref)
1976 symtab = xmalloc(total);
1977 symtab->size = total;
1978 symtab->n_symbols = nsyms;
1979 symtab->n_refs = n_ext_modules_used;
1981 if (flag_export && nsyms) {
1982 struct old_module_symbol *ksym;
1986 ksym = symtab->symbol;
1987 str = ((char *) ksym + nsyms * sizeof(struct old_module_symbol)
1988 + n_ext_modules_used * sizeof(struct old_module_ref));
1990 for (i = 0; i < HASH_BUCKETS; ++i) {
1991 struct obj_symbol *sym;
1992 for (sym = f->symtab[i]; sym; sym = sym->next)
1993 if (sym->ksymidx >= 0) {
1994 ksym->addr = obj_symbol_final_value(f, sym);
1996 (unsigned long) str - (unsigned long) symtab;
1998 strcpy(str, sym->name);
1999 str += strlen(sym->name) + 1;
2005 if (n_ext_modules_used) {
2006 struct old_module_ref *ref;
2009 ref = (struct old_module_ref *)
2010 ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol));
2012 for (i = 0; i < n_ext_modules; ++i)
2013 if (ext_modules[i].used)
2014 ref++->module = ext_modules[i].addr;
2018 /* Fill in routines. */
2021 obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
2023 obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module"));
2025 /* Whew! All of the initialization is complete. Collect the final
2026 module image and give it to the kernel. */
2028 image = xmalloc(m_size);
2029 obj_create_image(f, image);
2031 /* image holds the complete relocated module, accounting correctly for
2032 mod_use_count. However the old module kernel support assume that
2033 it is receiving something which does not contain mod_use_count. */
2034 ret = old_sys_init_module(m_name, image + sizeof(long),
2035 m_size | (flag_autoclean ? OLD_MOD_AUTOCLEAN
2036 : 0), &routines, symtab);
2038 perror_msg("init_module: %s", m_name);
2048 #define old_create_mod_use_count(x) TRUE
2049 #define old_init_module(x, y, z) TRUE
2051 #endif /* BB_FEATURE_OLD_MODULE_INTERFACE */
2055 /*======================================================================*/
2056 /* Functions relating to module loading after 2.1.18. */
2059 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2063 struct obj_symbol *sym;
2064 char *contents, *loc;
2068 if ((q = strchr(p, '=')) == NULL) {
2073 key = alloca(q - p + 6);
2074 memcpy(key, "parm_", 5);
2075 memcpy(key + 5, p, q - p);
2078 p = get_modinfo_value(f, key);
2081 error_msg("invalid parameter %s", key);
2085 sym = obj_find_symbol(f, key);
2087 /* Also check that the parameter was not resolved from the kernel. */
2088 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2089 error_msg("symbol for parameter %s not found", key);
2094 min = strtoul(p, &p, 10);
2096 max = strtoul(p + 1, &p, 10);
2102 contents = f->sections[sym->secidx]->contents;
2103 loc = contents + sym->value;
2107 if ((*p == 's') || (*p == 'c')) {
2110 /* Do C quoting if we begin with a ", else slurp the lot. */
2114 str = alloca(strlen(q));
2115 for (r = str, q++; *q != '"'; ++q, ++r) {
2117 error_msg("improperly terminated string argument for %s",
2120 } else if (*q == '\\')
2154 if (q[1] >= '0' && q[1] <= '7') {
2155 c = (c * 8) + *++q - '0';
2156 if (q[1] >= '0' && q[1] <= '7')
2157 c = (c * 8) + *++q - '0';
2174 /* In this case, the string is not quoted. We will break
2175 it using the coma (like for ints). If the user wants to
2176 include comas in a string, he just has to quote it */
2178 /* Search the next coma */
2182 if (r != (char *) NULL) {
2183 /* Recopy the current field */
2184 str = alloca(r - q + 1);
2185 memcpy(str, q, r - q);
2187 /* I don't know if it is usefull, as the previous case
2188 doesn't null terminate the string ??? */
2191 /* Keep next fields */
2202 obj_string_patch(f, sym->secidx, loc - contents, str);
2203 loc += tgt_sizeof_char_p;
2205 /* Array of chars (in fact, matrix !) */
2206 unsigned long charssize; /* size of each member */
2208 /* Get the size of each member */
2209 /* Probably we should do that outside the loop ? */
2210 if (!isdigit(*(p + 1))) {
2211 error_msg("parameter type 'c' for %s must be followed by"
2212 " the maximum size", key);
2215 charssize = strtoul(p + 1, (char **) NULL, 10);
2218 if (strlen(str) >= charssize) {
2219 error_msg("string too long for %s (max %ld)", key,
2224 /* Copy to location */
2225 strcpy((char *) loc, str);
2229 long v = strtoul(q, &q, 0);
2236 loc += tgt_sizeof_short;
2240 loc += tgt_sizeof_int;
2244 loc += tgt_sizeof_long;
2248 error_msg("unknown parameter type '%c' for %s", *p, key);
2263 goto retry_end_of_value;
2267 error_msg("too many values for %s (max %d)", key, max);
2274 error_msg("invalid argument syntax for %s", key);
2281 error_msg("too few values for %s (min %d)", key, min);
2291 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
2292 static int new_is_module_checksummed(struct obj_file *f)
2294 const char *p = get_modinfo_value(f, "using_checksums");
2301 /* Get the module's kernel version in the canonical integer form. */
2304 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2309 p = get_modinfo_value(f, "kernel_version");
2312 strncpy(str, p, STRVERSIONLEN);
2314 a = strtoul(p, &p, 10);
2317 b = strtoul(p + 1, &p, 10);
2320 c = strtoul(p + 1, &q, 10);
2324 return a << 16 | b << 8 | c;
2327 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
2330 #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
2332 /* Fetch the loaded modules, and all currently exported symbols. */
2334 static int new_get_kernel_symbols(void)
2336 char *module_names, *mn;
2337 struct external_module *modules, *m;
2338 struct new_module_symbol *syms, *s;
2339 size_t ret, bufsize, nmod, nsyms, i, j;
2341 /* Collect the loaded modules. */
2343 module_names = xmalloc(bufsize = 256);
2345 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2346 if (errno == ENOSPC && bufsize < ret) {
2347 module_names = xrealloc(module_names, bufsize = ret);
2348 goto retry_modules_load;
2350 perror_msg("QM_MODULES");
2354 n_ext_modules = nmod = ret;
2356 /* Collect the modules' symbols. */
2359 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2360 memset(modules, 0, nmod * sizeof(*modules));
2361 for (i = 0, mn = module_names, m = modules;
2362 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2363 struct new_module_info info;
2365 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2366 if (errno == ENOENT) {
2367 /* The module was removed out from underneath us. */
2370 perror_msg("query_module: QM_INFO: %s", mn);
2374 syms = xmalloc(bufsize = 1024);
2376 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2379 syms = xrealloc(syms, bufsize = ret);
2380 goto retry_mod_sym_load;
2382 /* The module was removed out from underneath us. */
2385 perror_msg("query_module: QM_SYMBOLS: %s", mn);
2392 m->addr = info.addr;
2396 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2397 s->name += (unsigned long) syms;
2402 /* Collect the kernel's symbols. */
2404 syms = xmalloc(bufsize = 16 * 1024);
2405 retry_kern_sym_load:
2406 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2407 if (errno == ENOSPC && bufsize < ret) {
2408 syms = xrealloc(syms, bufsize = ret);
2409 goto retry_kern_sym_load;
2411 perror_msg("kernel: QM_SYMBOLS");
2414 nksyms = nsyms = ret;
2417 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2418 s->name += (unsigned long) syms;
2424 /* Return the kernel symbol checksum version, or zero if not used. */
2426 static int new_is_kernel_checksummed(void)
2428 struct new_module_symbol *s;
2431 /* Using_Versions is not the first symbol, but it should be in there. */
2433 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2434 if (strcmp((char *) s->name, "Using_Versions") == 0)
2441 static int new_create_this_module(struct obj_file *f, const char *m_name)
2443 struct obj_section *sec;
2445 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2446 sizeof(struct new_module));
2447 memset(sec->contents, 0, sizeof(struct new_module));
2449 obj_add_symbol(f, "__this_module", -1,
2450 ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0,
2451 sizeof(struct new_module));
2453 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2460 static int new_create_module_ksymtab(struct obj_file *f)
2462 struct obj_section *sec;
2465 /* We must always add the module references. */
2467 if (n_ext_modules_used) {
2468 struct new_module_ref *dep;
2469 struct obj_symbol *tm;
2471 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2472 (sizeof(struct new_module_ref)
2473 * n_ext_modules_used));
2477 tm = obj_find_symbol(f, "__this_module");
2478 dep = (struct new_module_ref *) sec->contents;
2479 for (i = 0; i < n_ext_modules; ++i)
2480 if (ext_modules[i].used) {
2481 dep->dep = ext_modules[i].addr;
2482 obj_symbol_patch(f, sec->idx,
2483 (char *) &dep->ref - sec->contents, tm);
2489 if (flag_export && !obj_find_section(f, "__ksymtab")) {
2494 obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p,
2497 /* We don't want to export symbols residing in sections that
2498 aren't loaded. There are a number of these created so that
2499 we make sure certain module options don't appear twice. */
2501 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2503 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2505 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2506 struct obj_symbol *sym;
2507 for (sym = f->symtab[i]; sym; sym = sym->next)
2508 if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
2509 && sym->secidx <= SHN_HIRESERVE
2510 && (sym->secidx >= SHN_LORESERVE
2511 || loaded[sym->secidx])) {
2512 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2514 obj_symbol_patch(f, sec->idx, ofs, sym);
2515 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2522 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2530 new_init_module(const char *m_name, struct obj_file *f,
2531 unsigned long m_size)
2533 struct new_module *module;
2534 struct obj_section *sec;
2539 sec = obj_find_section(f, ".this");
2540 if (!sec || !sec->contents) {
2541 perror_msg_and_die("corrupt module %s?",m_name);
2543 module = (struct new_module *) sec->contents;
2544 m_addr = sec->header.sh_addr;
2546 module->size_of_struct = sizeof(*module);
2547 module->size = m_size;
2548 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2550 sec = obj_find_section(f, "__ksymtab");
2551 if (sec && sec->header.sh_size) {
2552 module->syms = sec->header.sh_addr;
2553 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2556 if (n_ext_modules_used) {
2557 sec = obj_find_section(f, ".kmodtab");
2558 module->deps = sec->header.sh_addr;
2559 module->ndeps = n_ext_modules_used;
2563 obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
2565 obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module"));
2567 sec = obj_find_section(f, "__ex_table");
2569 module->ex_table_start = sec->header.sh_addr;
2570 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2573 sec = obj_find_section(f, ".text.init");
2575 module->runsize = sec->header.sh_addr - m_addr;
2577 sec = obj_find_section(f, ".data.init");
2579 if (!module->runsize ||
2580 module->runsize > sec->header.sh_addr - m_addr)
2581 module->runsize = sec->header.sh_addr - m_addr;
2583 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2584 if (sec && sec->header.sh_size) {
2585 module->archdata_start = (void*)sec->header.sh_addr;
2586 module->archdata_end = module->archdata_start + sec->header.sh_size;
2588 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2589 if (sec && sec->header.sh_size) {
2590 module->kallsyms_start = (void*)sec->header.sh_addr;
2591 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2594 if (!arch_init_module(f, module))
2597 /* Whew! All of the initialization is complete. Collect the final
2598 module image and give it to the kernel. */
2600 image = xmalloc(m_size);
2601 obj_create_image(f, image);
2603 ret = new_sys_init_module(m_name, (struct new_module *) image);
2605 perror_msg("init_module: %s", m_name);
2614 #define new_init_module(x, y, z) TRUE
2615 #define new_create_this_module(x, y) 0
2616 #define new_create_module_ksymtab(x)
2617 #define query_module(v, w, x, y, z) -1
2619 #endif /* BB_FEATURE_NEW_MODULE_INTERFACE */
2622 /*======================================================================*/
2625 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2628 struct obj_string_patch *p;
2629 struct obj_section *strsec;
2630 size_t len = strlen(string) + 1;
2633 p = xmalloc(sizeof(*p));
2634 p->next = f->string_patches;
2635 p->reloc_secidx = secidx;
2636 p->reloc_offset = offset;
2637 f->string_patches = p;
2639 strsec = obj_find_section(f, ".kstrtab");
2640 if (strsec == NULL) {
2641 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
2642 p->string_offset = 0;
2643 loc = strsec->contents;
2645 p->string_offset = strsec->header.sh_size;
2646 loc = obj_extend_section(strsec, len);
2648 memcpy(loc, string, len);
2654 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2655 struct obj_symbol *sym)
2657 struct obj_symbol_patch *p;
2659 p = xmalloc(sizeof(*p));
2660 p->next = f->symbol_patches;
2661 p->reloc_secidx = secidx;
2662 p->reloc_offset = offset;
2664 f->symbol_patches = p;
2669 static int obj_check_undefineds(struct obj_file *f)
2674 for (i = 0; i < HASH_BUCKETS; ++i) {
2675 struct obj_symbol *sym;
2676 for (sym = f->symtab[i]; sym; sym = sym->next)
2677 if (sym->secidx == SHN_UNDEF) {
2678 if (ELFW(ST_BIND) (sym->info) == STB_WEAK) {
2679 sym->secidx = SHN_ABS;
2682 error_msg("unresolved symbol %s", sym->name);
2691 static void obj_allocate_commons(struct obj_file *f)
2693 struct common_entry {
2694 struct common_entry *next;
2695 struct obj_symbol *sym;
2696 } *common_head = NULL;
2700 for (i = 0; i < HASH_BUCKETS; ++i) {
2701 struct obj_symbol *sym;
2702 for (sym = f->symtab[i]; sym; sym = sym->next)
2703 if (sym->secidx == SHN_COMMON) {
2704 /* Collect all COMMON symbols and sort them by size so as to
2705 minimize space wasted by alignment requirements. */
2707 struct common_entry **p, *n;
2708 for (p = &common_head; *p; p = &(*p)->next)
2709 if (sym->size <= (*p)->sym->size)
2712 n = alloca(sizeof(*n));
2720 for (i = 1; i < f->local_symtab_size; ++i) {
2721 struct obj_symbol *sym = f->local_symtab[i];
2722 if (sym && sym->secidx == SHN_COMMON) {
2723 struct common_entry **p, *n;
2724 for (p = &common_head; *p; p = &(*p)->next)
2725 if (sym == (*p)->sym)
2727 else if (sym->size < (*p)->sym->size) {
2728 n = alloca(sizeof(*n));
2738 /* Find the bss section. */
2739 for (i = 0; i < f->header.e_shnum; ++i)
2740 if (f->sections[i]->header.sh_type == SHT_NOBITS)
2743 /* If for some reason there hadn't been one, create one. */
2744 if (i == f->header.e_shnum) {
2745 struct obj_section *sec;
2747 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
2748 f->sections[i] = sec = arch_new_section();
2749 f->header.e_shnum = i + 1;
2751 memset(sec, 0, sizeof(*sec));
2752 sec->header.sh_type = SHT_PROGBITS;
2753 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2758 /* Allocate the COMMONS. */
2760 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
2761 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
2762 struct common_entry *c;
2764 for (c = common_head; c; c = c->next) {
2765 ElfW(Addr) align = c->sym->value;
2767 if (align > max_align)
2769 if (bss_size & (align - 1))
2770 bss_size = (bss_size | (align - 1)) + 1;
2773 c->sym->value = bss_size;
2775 bss_size += c->sym->size;
2778 f->sections[i]->header.sh_size = bss_size;
2779 f->sections[i]->header.sh_addralign = max_align;
2783 /* For the sake of patch relocation and parameter initialization,
2784 allocate zeroed data for NOBITS sections now. Note that after
2785 this we cannot assume NOBITS are really empty. */
2786 for (i = 0; i < f->header.e_shnum; ++i) {
2787 struct obj_section *s = f->sections[i];
2788 if (s->header.sh_type == SHT_NOBITS) {
2789 if (s->header.sh_size != 0)
2790 s->contents = memset(xmalloc(s->header.sh_size),
2791 0, s->header.sh_size);
2795 s->header.sh_type = SHT_PROGBITS;
2800 static unsigned long obj_load_size(struct obj_file *f)
2802 unsigned long dot = 0;
2803 struct obj_section *sec;
2805 /* Finalize the positions of the sections relative to one another. */
2807 for (sec = f->load_order; sec; sec = sec->load_next) {
2810 align = sec->header.sh_addralign;
2811 if (align && (dot & (align - 1)))
2812 dot = (dot | (align - 1)) + 1;
2814 sec->header.sh_addr = dot;
2815 dot += sec->header.sh_size;
2821 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
2823 int i, n = f->header.e_shnum;
2826 /* Finalize the addresses of the sections. */
2829 for (i = 0; i < n; ++i)
2830 f->sections[i]->header.sh_addr += base;
2832 /* And iterate over all of the relocations. */
2834 for (i = 0; i < n; ++i) {
2835 struct obj_section *relsec, *symsec, *targsec, *strsec;
2836 ElfW(RelM) * rel, *relend;
2840 relsec = f->sections[i];
2841 if (relsec->header.sh_type != SHT_RELM)
2844 symsec = f->sections[relsec->header.sh_link];
2845 targsec = f->sections[relsec->header.sh_info];
2846 strsec = f->sections[symsec->header.sh_link];
2848 rel = (ElfW(RelM) *) relsec->contents;
2849 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
2850 symtab = (ElfW(Sym) *) symsec->contents;
2851 strtab = (const char *) strsec->contents;
2853 for (; rel < relend; ++rel) {
2854 ElfW(Addr) value = 0;
2855 struct obj_symbol *intsym = NULL;
2856 unsigned long symndx;
2857 ElfW(Sym) * extsym = 0;
2860 /* Attempt to find a value to use for this relocation. */
2862 symndx = ELFW(R_SYM) (rel->r_info);
2864 /* Note we've already checked for undefined symbols. */
2866 extsym = &symtab[symndx];
2867 if (ELFW(ST_BIND) (extsym->st_info) == STB_LOCAL) {
2868 /* Local symbols we look up in the local table to be sure
2869 we get the one that is really intended. */
2870 intsym = f->local_symtab[symndx];
2872 /* Others we look up in the hash table. */
2874 if (extsym->st_name)
2875 name = strtab + extsym->st_name;
2877 name = f->sections[extsym->st_shndx]->name;
2878 intsym = obj_find_symbol(f, name);
2881 value = obj_symbol_final_value(f, intsym);
2882 intsym->referenced = 1;
2884 #if SHT_RELM == SHT_RELA
2885 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
2886 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
2887 if (!extsym || !extsym->st_name ||
2888 ELFW(ST_BIND) (extsym->st_info) != STB_LOCAL)
2890 value += rel->r_addend;
2894 switch (arch_apply_relocation
2895 (f, targsec, symsec, intsym, rel, value)) {
2899 case obj_reloc_overflow:
2900 errmsg = "Relocation overflow";
2902 case obj_reloc_dangerous:
2903 errmsg = "Dangerous relocation";
2905 case obj_reloc_unhandled:
2906 errmsg = "Unhandled relocation";
2909 error_msg("%s of type %ld for %s", errmsg,
2910 (long) ELFW(R_TYPE) (rel->r_info),
2911 strtab + extsym->st_name);
2913 error_msg("%s of type %ld", errmsg,
2914 (long) ELFW(R_TYPE) (rel->r_info));
2922 /* Finally, take care of the patches. */
2924 if (f->string_patches) {
2925 struct obj_string_patch *p;
2926 struct obj_section *strsec;
2927 ElfW(Addr) strsec_base;
2928 strsec = obj_find_section(f, ".kstrtab");
2929 strsec_base = strsec->header.sh_addr;
2931 for (p = f->string_patches; p; p = p->next) {
2932 struct obj_section *targsec = f->sections[p->reloc_secidx];
2933 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
2934 = strsec_base + p->string_offset;
2938 if (f->symbol_patches) {
2939 struct obj_symbol_patch *p;
2941 for (p = f->symbol_patches; p; p = p->next) {
2942 struct obj_section *targsec = f->sections[p->reloc_secidx];
2943 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
2944 = obj_symbol_final_value(f, p->sym);
2951 static int obj_create_image(struct obj_file *f, char *image)
2953 struct obj_section *sec;
2954 ElfW(Addr) base = f->baseaddr;
2956 for (sec = f->load_order; sec; sec = sec->load_next) {
2959 if (sec->contents == 0 || sec->header.sh_size == 0)
2962 secimg = image + (sec->header.sh_addr - base);
2964 /* Note that we allocated data for NOBITS sections earlier. */
2965 memcpy(secimg, sec->contents, sec->header.sh_size);
2971 /*======================================================================*/
2973 static struct obj_file *obj_load(FILE * fp, int loadprogbits)
2976 ElfW(Shdr) * section_headers;
2980 /* Read the file header. */
2982 f = arch_new_file();
2983 memset(f, 0, sizeof(*f));
2984 f->symbol_cmp = strcmp;
2985 f->symbol_hash = obj_elf_hash;
2986 f->load_order_search_start = &f->load_order;
2988 fseek(fp, 0, SEEK_SET);
2989 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
2990 perror_msg("error reading ELF header");
2994 if (f->header.e_ident[EI_MAG0] != ELFMAG0
2995 || f->header.e_ident[EI_MAG1] != ELFMAG1
2996 || f->header.e_ident[EI_MAG2] != ELFMAG2
2997 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
2998 error_msg("not an ELF file");
3001 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3002 || f->header.e_ident[EI_DATA] != ELFDATAM
3003 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3004 || !MATCH_MACHINE(f->header.e_machine)) {
3005 error_msg("ELF file not for this architecture");
3008 if (f->header.e_type != ET_REL) {
3009 error_msg("ELF file not a relocatable object");
3013 /* Read the section headers. */
3015 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3016 error_msg("section header size mismatch: %lu != %lu",
3017 (unsigned long) f->header.e_shentsize,
3018 (unsigned long) sizeof(ElfW(Shdr)));
3022 shnum = f->header.e_shnum;
3023 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3024 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3026 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3027 fseek(fp, f->header.e_shoff, SEEK_SET);
3028 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3029 perror_msg("error reading ELF section headers");
3033 /* Read the section data. */
3035 for (i = 0; i < shnum; ++i) {
3036 struct obj_section *sec;
3038 f->sections[i] = sec = arch_new_section();
3039 memset(sec, 0, sizeof(*sec));
3041 sec->header = section_headers[i];
3044 if(sec->header.sh_size) switch (sec->header.sh_type) {
3053 if (!loadprogbits) {
3054 sec->contents = NULL;
3061 if (sec->header.sh_size > 0) {
3062 sec->contents = xmalloc(sec->header.sh_size);
3063 fseek(fp, sec->header.sh_offset, SEEK_SET);
3064 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3065 perror_msg("error reading ELF section data");
3069 sec->contents = NULL;
3073 #if SHT_RELM == SHT_REL
3075 error_msg("RELA relocations not supported on this architecture");
3079 error_msg("REL relocations not supported on this architecture");
3084 if (sec->header.sh_type >= SHT_LOPROC) {
3085 /* Assume processor specific section types are debug
3086 info and can safely be ignored. If this is ever not
3087 the case (Hello MIPS?), don't put ifdefs here but
3088 create an arch_load_proc_section(). */
3092 error_msg("can't handle sections of type %ld",
3093 (long) sec->header.sh_type);
3098 /* Do what sort of interpretation as needed by each section. */
3100 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3102 for (i = 0; i < shnum; ++i) {
3103 struct obj_section *sec = f->sections[i];
3104 sec->name = shstrtab + sec->header.sh_name;
3107 for (i = 0; i < shnum; ++i) {
3108 struct obj_section *sec = f->sections[i];
3110 /* .modinfo should be contents only but gcc has no attribute for that.
3111 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3113 if (strcmp(sec->name, ".modinfo") == 0)
3114 sec->header.sh_flags &= ~SHF_ALLOC;
3116 if (sec->header.sh_flags & SHF_ALLOC)
3117 obj_insert_section_load_order(f, sec);
3119 switch (sec->header.sh_type) {
3122 unsigned long nsym, j;
3126 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3127 error_msg("symbol size mismatch: %lu != %lu",
3128 (unsigned long) sec->header.sh_entsize,
3129 (unsigned long) sizeof(ElfW(Sym)));
3133 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3134 strtab = f->sections[sec->header.sh_link]->contents;
3135 sym = (ElfW(Sym) *) sec->contents;
3137 /* Allocate space for a table of local symbols. */
3138 j = f->local_symtab_size = sec->header.sh_info;
3139 f->local_symtab = xcalloc(j, sizeof(struct obj_symbol *));
3141 /* Insert all symbols into the hash table. */
3142 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3145 name = strtab + sym->st_name;
3147 name = f->sections[sym->st_shndx]->name;
3149 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3150 sym->st_value, sym->st_size);
3156 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3157 error_msg("relocation entry size mismatch: %lu != %lu",
3158 (unsigned long) sec->header.sh_entsize,
3159 (unsigned long) sizeof(ElfW(RelM)));
3163 /* XXX Relocation code from modutils-2.3.19 is not here.
3164 * Why? That's about 20 lines of code from obj/obj_load.c,
3165 * which gets done in a second pass through the sections.
3166 * This BusyBox insmod does similar work in obj_relocate(). */
3173 #ifdef BB_FEATURE_INSMOD_LOADINKMEM
3175 * load the unloaded sections directly into the memory allocated by
3176 * kernel for the module
3179 static int obj_load_progbits(FILE * fp, struct obj_file* f)
3181 char* imagebase = (char*) f->imagebase;
3182 ElfW(Addr) base = f->baseaddr;
3183 struct obj_section* sec;
3185 for (sec = f->load_order; sec; sec = sec->load_next) {
3187 /* section already loaded? */
3188 if (sec->contents != NULL)
3191 if (sec->header.sh_size == 0)
3194 sec->contents = imagebase + (sec->header.sh_addr - base);
3195 fseek(fp, sec->header.sh_offset, SEEK_SET);
3196 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3197 errorMsg("error reading ELF section data: %s\n", strerror(errno));
3206 static void hide_special_symbols(struct obj_file *f)
3208 static const char *const specials[] = {
3215 struct obj_symbol *sym;
3216 const char *const *p;
3218 for (p = specials; *p; ++p)
3219 if ((sym = obj_find_symbol(f, *p)) != NULL)
3221 ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info));
3226 extern int insmod_main( int argc, char **argv)
3233 unsigned long m_size;
3238 char m_name[FILENAME_MAX + 1] = "\0";
3239 int exit_status = EXIT_FAILURE;
3241 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
3243 char k_strversion[STRVERSIONLEN];
3244 char m_strversion[STRVERSIONLEN];
3249 /* Parse any options */
3250 while ((opt = getopt(argc, argv, "fkvxLo:")) > 0) {
3252 case 'f': /* force loading */
3253 flag_force_load = 1;
3255 case 'k': /* module loaded by kerneld, auto-cleanable */
3258 case 'v': /* verbose output */
3261 case 'x': /* do not export externs */
3264 case 'o': /* name the output module */
3265 strncpy(m_name, optarg, FILENAME_MAX);
3267 case 'L': /* Stub warning */
3268 /* This is needed for compatibility with modprobe.
3269 * In theory, this does locking, but we don't do
3270 * that. So be careful and plan your life around not
3271 * loading the same module 50 times concurrently. */
3278 if (argv[optind] == NULL) {
3282 /* Grab the module name */
3283 if ((tmp = strrchr(argv[optind], '/')) != NULL) {
3290 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o')
3292 memcpy(m_fullName, tmp, len);
3293 m_fullName[len]='\0';
3294 if (*m_name == '\0') {
3295 strcpy(m_name, m_fullName);
3297 strcat(m_fullName, ".o");
3299 /* Get a filedesc for the module. Check we we have a complete path */
3300 if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) ||
3301 (fp = fopen(argv[optind], "r")) == NULL) {
3302 struct utsname myuname;
3304 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
3305 * but do not error out yet if we fail to find it... */
3306 if (uname(&myuname) == 0) {
3307 char module_dir[FILENAME_MAX];
3308 char real_module_dir[FILENAME_MAX];
3309 snprintf (module_dir, sizeof(module_dir), "%s/%s",
3310 _PATH_MODULES, myuname.release);
3311 /* Jump through hoops in case /lib/modules/`uname -r`
3312 * is a symlink. We do not want recursive_action to
3313 * follow symlinks, but we do want to follow the
3314 * /lib/modules/`uname -r` dir, So resolve it ourselves
3315 * if it is a link... */
3316 if (realpath (module_dir, real_module_dir) == NULL)
3317 strcpy(real_module_dir, module_dir);
3318 recursive_action(real_module_dir, TRUE, FALSE, FALSE,
3319 check_module_name_match, 0, m_fullName);
3322 /* Check if we have found anything yet */
3323 if (m_filename[0] == '\0' || ((fp = fopen(m_filename, "r")) == NULL))
3325 char module_dir[FILENAME_MAX];
3326 if (realpath (_PATH_MODULES, module_dir) == NULL)
3327 strcpy(module_dir, _PATH_MODULES);
3328 /* No module found under /lib/modules/`uname -r`, this
3329 * time cast the net a bit wider. Search /lib/modules/ */
3330 if (recursive_action(module_dir, TRUE, FALSE, FALSE,
3331 check_module_name_match, 0, m_fullName) == FALSE)
3333 if (m_filename[0] == '\0'
3334 || ((fp = fopen(m_filename, "r")) == NULL))
3336 error_msg("%s: no module by that name found", m_fullName);
3337 return EXIT_FAILURE;
3340 error_msg_and_die("%s: no module by that name found", m_fullName);
3343 safe_strncpy(m_filename, argv[optind], sizeof(m_filename));
3345 printf("Using %s\n", m_filename);
3347 if ((f = obj_load(fp, LOADBITS)) == NULL)
3348 perror_msg_and_die("Could not load the module");
3350 if (get_modinfo_value(f, "kernel_version") == NULL)
3355 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
3356 /* Version correspondence? */
3358 k_version = get_kernel_version(k_strversion);
3359 if (m_has_modinfo) {
3360 m_version = new_get_module_version(f, m_strversion);
3362 m_version = old_get_module_version(f, m_strversion);
3363 if (m_version == -1) {
3364 error_msg("couldn't find the kernel version the module was "
3370 if (strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) {
3371 if (flag_force_load) {
3372 error_msg("Warning: kernel-module version mismatch\n"
3373 "\t%s was compiled for kernel version %s\n"
3374 "\twhile this kernel is version %s",
3375 m_filename, m_strversion, k_strversion);
3377 error_msg("kernel-module version mismatch\n"
3378 "\t%s was compiled for kernel version %s\n"
3379 "\twhile this kernel is version %s.",
3380 m_filename, m_strversion, k_strversion);
3385 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
3387 k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
3389 if (k_new_syscalls) {
3390 #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
3391 if (!new_get_kernel_symbols())
3393 k_crcs = new_is_kernel_checksummed();
3395 error_msg("Not configured to support new kernels");
3399 #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
3400 if (!old_get_kernel_symbols(m_name))
3402 k_crcs = old_is_kernel_checksummed();
3404 error_msg("Not configured to support old kernels");
3409 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
3411 m_crcs = new_is_module_checksummed(f);
3413 m_crcs = old_is_module_checksummed(f);
3415 if (m_crcs != k_crcs)
3416 obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
3417 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
3419 /* Let the module know about the kernel symbols. */
3420 add_kernel_symbols(f);
3422 /* Allocate common symbols, symbol tables, and string tables. */
3425 ? !new_create_this_module(f, m_name)
3426 : !old_create_mod_use_count(f))
3431 if (!obj_check_undefineds(f)) {
3434 obj_allocate_commons(f);
3436 /* done with the module name, on to the optional var=value arguments */
3439 if (optind < argc) {
3441 ? !new_process_module_arguments(f, argc - optind, argv + optind)
3442 : !old_process_module_arguments(f, argc - optind, argv + optind))
3449 hide_special_symbols(f);
3452 new_create_module_ksymtab(f);
3454 /* Find current size of the module */
3455 m_size = obj_load_size(f);
3458 m_addr = create_module(m_name, m_size);
3459 if (m_addr==-1) switch (errno) {
3461 error_msg("A module named %s already exists", m_name);
3464 error_msg("Can't allocate kernel memory for module; needed %lu bytes",
3468 perror_msg("create_module: %s", m_name);
3474 * the PROGBITS section was not loaded by the obj_load
3475 * now we can load them directly into the kernel memory
3477 // f->imagebase = (char*) m_addr;
3478 f->imagebase = (ElfW(Addr)) m_addr;
3479 if (!obj_load_progbits(fp, f)) {
3480 delete_module(m_name);
3485 if (!obj_relocate(f, m_addr)) {
3486 delete_module(m_name);
3491 ? !new_init_module(m_name, f, m_size)
3492 : !old_init_module(m_name, f, m_size))
3494 delete_module(m_name);
3498 exit_status = EXIT_SUCCESS;
3502 return(exit_status);