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.69 2001/07/25 16:58:58 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.69 2001/07/25 16:58:58 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 static void obj_set_symbol_compare(struct obj_file *f,
554 int (*cmp)(const char *, const char *),
555 unsigned long (*hash)(const char *));
557 static struct obj_section *obj_find_section (struct obj_file *f,
560 static void obj_insert_section_load_order (struct obj_file *f,
561 struct obj_section *sec);
563 static struct obj_section *obj_create_alloced_section (struct obj_file *f,
568 static struct obj_section *obj_create_alloced_section_first (struct obj_file *f,
573 static void *obj_extend_section (struct obj_section *sec, unsigned long more);
575 static int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
578 static int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
579 struct obj_symbol *sym);
581 static int obj_check_undefineds(struct obj_file *f);
583 static void obj_allocate_commons(struct obj_file *f);
585 static unsigned long obj_load_size (struct obj_file *f);
587 static int obj_relocate (struct obj_file *f, ElfW(Addr) base);
589 static struct obj_file *obj_load(FILE *f, int loadprogbits);
591 static int obj_create_image (struct obj_file *f, char *image);
593 /* Architecture specific manipulation routines. */
595 static struct obj_file *arch_new_file (void);
597 static struct obj_section *arch_new_section (void);
599 static struct obj_symbol *arch_new_symbol (void);
601 static enum obj_reloc arch_apply_relocation (struct obj_file *f,
602 struct obj_section *targsec,
603 struct obj_section *symsec,
604 struct obj_symbol *sym,
605 ElfW(RelM) *rel, ElfW(Addr) value);
607 static int arch_create_got (struct obj_file *f);
609 static int arch_init_module (struct obj_file *f, struct new_module *);
612 //----------------------------------------------------------------------------
613 //--------end of modutils obj.h
614 //----------------------------------------------------------------------------
620 #define _PATH_MODULES "/lib/modules"
621 static const int STRVERSIONLEN = 32;
623 /*======================================================================*/
625 static int flag_force_load = 0;
626 static int flag_autoclean = 0;
627 static int flag_verbose = 0;
628 static int flag_export = 1;
631 /*======================================================================*/
633 /* previously, these were named i386_* but since we could be
634 compiling for the sh, I've renamed them to the more general
635 arch_* These structures are the same between the x86 and SH,
636 and we can't support anything else right now anyway. In the
637 future maybe they should be #if defined'd */
643 #if defined(BB_USE_PLT_ENTRIES)
644 struct arch_plt_entry
648 int inited:1; /* has been set up */
652 #if defined(BB_USE_GOT_ENTRIES)
653 struct arch_got_entry {
655 unsigned offset_done:1;
656 unsigned reloc_done:1;
660 #if defined(__mips__)
663 struct mips_hi16 *next;
670 struct obj_file root;
671 #if defined(BB_USE_PLT_ENTRIES)
672 struct obj_section *plt;
674 #if defined(BB_USE_GOT_ENTRIES)
675 struct obj_section *got;
677 #if defined(__mips__)
678 struct mips_hi16 *mips_hi16_list;
683 struct obj_symbol root;
684 #if defined(BB_USE_PLT_ENTRIES)
685 struct arch_plt_entry pltent;
687 #if defined(BB_USE_GOT_ENTRIES)
688 struct arch_got_entry gotent;
693 struct external_module {
698 struct new_module_symbol *syms;
701 static struct new_module_symbol *ksyms;
702 static size_t nksyms;
704 static struct external_module *ext_modules;
705 static int n_ext_modules;
706 static int n_ext_modules_used;
707 extern int delete_module(const char *);
709 static char m_filename[FILENAME_MAX + 1];
710 static char m_fullName[FILENAME_MAX + 1];
714 /*======================================================================*/
717 static int check_module_name_match(const char *filename, struct stat *statbuf,
720 char *fullname = (char *) userdata;
722 if (fullname[0] == '\0')
725 char *tmp, *tmp1 = strdup(filename);
726 tmp = get_last_path_component(tmp1);
727 if (strcmp(tmp, fullname) == 0) {
729 /* Stop searching if we find a match */
730 safe_strncpy(m_filename, filename, sizeof(m_filename));
739 /*======================================================================*/
741 static struct obj_file *arch_new_file(void)
744 f = xmalloc(sizeof(*f));
746 #if defined(BB_USE_PLT_ENTRIES)
749 #if defined(BB_USE_GOT_ENTRIES)
752 #if defined(__mips__)
753 f->mips_hi16_list = NULL;
759 static struct obj_section *arch_new_section(void)
761 return xmalloc(sizeof(struct obj_section));
764 static struct obj_symbol *arch_new_symbol(void)
766 struct arch_symbol *sym;
767 sym = xmalloc(sizeof(*sym));
769 #if defined(BB_USE_PLT_ENTRIES)
770 memset(&sym->pltent, 0, sizeof(sym->pltent));
772 #if defined(BB_USE_GOT_ENTRIES)
773 memset(&sym->gotent, 0, sizeof(sym->gotent));
779 static enum obj_reloc
780 arch_apply_relocation(struct obj_file *f,
781 struct obj_section *targsec,
782 struct obj_section *symsec,
783 struct obj_symbol *sym,
784 ElfW(RelM) *rel, ElfW(Addr) v)
786 struct arch_file *ifile = (struct arch_file *) f;
787 #if !(defined(__mips__))
788 struct arch_symbol *isym = (struct arch_symbol *) sym;
791 ElfW(Addr) *loc = (ElfW(Addr) *) (targsec->contents + rel->r_offset);
792 ElfW(Addr) dot = targsec->header.sh_addr + rel->r_offset;
793 #if defined(BB_USE_GOT_ENTRIES)
794 ElfW(Addr) got = ifile->got ? ifile->got->header.sh_addr : 0;
796 #if defined(BB_USE_PLT_ENTRIES)
797 ElfW(Addr) plt = ifile->plt ? ifile->plt->header.sh_addr : 0;
798 struct arch_plt_entry *pe;
801 enum obj_reloc ret = obj_reloc_ok;
803 switch (ELF32_R_TYPE(rel->r_info)) {
805 /* even though these constants seem to be the same for
806 the i386 and the sh, we "#if define" them for clarity
807 and in case that ever changes */
810 #elif defined(__arm__)
812 #elif defined(__i386__)
814 #elif defined(__mc68000__)
816 #elif defined(__powerpc__)
818 #elif defined(__mips__)
825 #elif defined(__arm__)
827 #elif defined(__i386__)
829 #elif defined(__mc68000__)
831 #elif defined(__powerpc__)
833 #elif defined(__mips__)
838 #if defined(__mc68000__)
841 ret = obj_reloc_overflow;
846 ret = obj_reloc_overflow;
849 #endif /* __mc68000__ */
851 #if defined(__powerpc__)
852 case R_PPC_ADDR16_HA:
853 *(unsigned short *)loc = (v + 0x8000) >> 16;
856 case R_PPC_ADDR16_HI:
857 *(unsigned short *)loc = v >> 16;
860 case R_PPC_ADDR16_LO:
861 *(unsigned short *)loc = v;
865 #if defined(__mips__)
868 ret = obj_reloc_dangerous;
869 if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000))
870 ret = obj_reloc_overflow;
872 (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) &
880 /* We cannot relocate this one now because we don't know the value
881 of the carry we need to add. Save the information, and let LO16
882 do the actual relocation. */
883 n = (struct mips_hi16 *) xmalloc(sizeof *n);
886 n->next = ifile->mips_hi16_list;
887 ifile->mips_hi16_list = n;
893 unsigned long insnlo = *loc;
894 Elf32_Addr val, vallo;
896 /* Sign extend the addend we extract from the lo insn. */
897 vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000;
899 if (ifile->mips_hi16_list != NULL) {
902 l = ifile->mips_hi16_list;
904 struct mips_hi16 *next;
907 /* The value for the HI16 had best be the same. */
908 assert(v == l->value);
910 /* Do the HI16 relocation. Note that we actually don't
911 need to know anything about the LO16 itself, except where
912 to find the low 16 bits of the addend needed by the LO16. */
915 ((insn & 0xffff) << 16) +
919 /* Account for the sign extension that will happen in the
926 insn = (insn & ~0xffff) | val;
934 ifile->mips_hi16_list = NULL;
937 /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */
939 insnlo = (insnlo & ~0xffff) | (val & 0xffff);
946 #elif defined(__sh__)
950 #elif defined(__i386__)
955 #elif defined(__mc68000__)
958 if ((Elf32_Sword)v > 0x7f || (Elf32_Sword)v < -(Elf32_Sword)0x80)
959 ret = obj_reloc_overflow;
964 if ((Elf32_Sword)v > 0x7fff || (Elf32_Sword)v < -(Elf32_Sword)0x8000)
965 ret = obj_reloc_overflow;
969 *(int *)loc = v - dot;
971 #elif defined(__powerpc__)
981 #elif defined(__i386__)
984 #if defined(BB_USE_PLT_ENTRIES)
990 #if defined(__powerpc__)
993 /* find the plt entry and initialize it if necessary */
994 assert(isym != NULL);
996 pe = (struct arch_plt_entry*) &isym->pltent;
999 ip = (unsigned long *) (ifile->plt->contents + pe->offset);
1001 /* generate some machine code */
1003 #if defined(__arm__)
1004 ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */
1005 ip[1] = v; /* sym@ */
1007 #if defined(__powerpc__)
1008 ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */
1009 ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */
1010 ip[2] = 0x7d6903a6; /* mtctr r11 */
1011 ip[3] = 0x4e800420; /* bctr */
1016 /* relative distance to target */
1018 /* if the target is too far away.... */
1019 if ((int)v < -0x02000000 || (int)v >= 0x02000000) {
1020 /* go via the plt */
1021 v = plt + pe->offset - dot;
1024 ret = obj_reloc_dangerous;
1026 /* merge the offset into the instruction. */
1027 #if defined(__arm__)
1028 /* Convert to words. */
1031 *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff);
1033 #if defined(__powerpc__)
1034 *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc);
1037 #endif /* BB_USE_PLT_ENTRIES */
1039 #if defined(__arm__)
1040 #elif defined(__sh__)
1045 #elif defined(__i386__)
1046 case R_386_GLOB_DAT:
1047 case R_386_JMP_SLOT:
1050 #elif defined(__mc68000__)
1051 case R_68K_GLOB_DAT:
1052 case R_68K_JMP_SLOT:
1057 #if defined(__arm__)
1058 #elif defined(__sh__)
1060 *loc += f->baseaddr + rel->r_addend;
1062 #elif defined(__i386__)
1063 case R_386_RELATIVE:
1064 *loc += f->baseaddr;
1066 #elif defined(__mc68000__)
1067 case R_68K_RELATIVE:
1068 *(int *)loc += f->baseaddr;
1072 #if defined(BB_USE_GOT_ENTRIES)
1074 #if !defined(__68k__)
1077 #elif defined(__arm__)
1079 #elif defined(__i386__)
1084 *loc += got - dot + rel->r_addend;;
1085 #elif defined(__i386__) || defined(__arm__) || defined(__m68k_)
1093 #elif defined(__arm__)
1095 #elif defined(__i386__)
1097 #elif defined(__mc68000__)
1100 assert(isym != NULL);
1101 /* needs an entry in the .got: set it, once */
1102 if (!isym->gotent.reloc_done) {
1103 isym->gotent.reloc_done = 1;
1104 *(ElfW(Addr) *) (ifile->got->contents + isym->gotent.offset) = v;
1106 /* make the reloc with_respect_to_.got */
1108 *loc += isym->gotent.offset + rel->r_addend;
1109 #elif defined(__i386__) || defined(__arm__) || defined(__mc68000__)
1110 *loc += isym->gotent.offset;
1114 /* address relative to the got */
1115 #if !defined(__mc68000__)
1118 #elif defined(__arm__)
1120 #elif defined(__i386__)
1122 #elif defined(__mc68000__)
1128 #endif // __mc68000__
1130 #endif /* BB_USE_GOT_ENTRIES */
1133 printf("Warning: unhandled reloc %d\n",(int)ELF32_R_TYPE(rel->r_info));
1134 ret = obj_reloc_unhandled;
1141 static int arch_create_got(struct obj_file *f)
1143 #if defined(BB_USE_GOT_ENTRIES) || defined(BB_USE_PLT_ENTRIES)
1144 struct arch_file *ifile = (struct arch_file *) f;
1146 #if defined(BB_USE_GOT_ENTRIES)
1147 int got_offset = 0, gotneeded = 0;
1149 #if defined(BB_USE_PLT_ENTRIES)
1150 int plt_offset = 0, pltneeded = 0;
1152 struct obj_section *relsec, *symsec, *strsec;
1153 ElfW(RelM) *rel, *relend;
1154 ElfW(Sym) *symtab, *extsym;
1155 const char *strtab, *name;
1156 struct arch_symbol *intsym;
1158 for (i = 0; i < f->header.e_shnum; ++i) {
1159 relsec = f->sections[i];
1160 if (relsec->header.sh_type != SHT_RELM)
1163 symsec = f->sections[relsec->header.sh_link];
1164 strsec = f->sections[symsec->header.sh_link];
1166 rel = (ElfW(RelM) *) relsec->contents;
1167 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
1168 symtab = (ElfW(Sym) *) symsec->contents;
1169 strtab = (const char *) strsec->contents;
1171 for (; rel < relend; ++rel) {
1172 extsym = &symtab[ELF32_R_SYM(rel->r_info)];
1174 switch (ELF32_R_TYPE(rel->r_info)) {
1175 #if defined(__arm__)
1178 #elif defined(__sh__)
1181 #elif defined(__i386__)
1184 #elif defined(__mc68000__)
1189 #if defined(__powerpc__)
1195 #if defined(__arm__)
1204 if (got_offset == 0)
1206 #elif defined(__sh__)
1210 #elif defined(__i386__)
1220 if (extsym->st_name != 0) {
1221 name = strtab + extsym->st_name;
1223 name = f->sections[extsym->st_shndx]->name;
1225 intsym = (struct arch_symbol *) obj_find_symbol(f, name);
1226 #if defined(BB_USE_GOT_ENTRIES)
1227 if (!intsym->gotent.offset_done) {
1228 intsym->gotent.offset_done = 1;
1229 intsym->gotent.offset = got_offset;
1230 got_offset += BB_GOT_ENTRY_SIZE;
1233 #if defined(BB_USE_PLT_ENTRIES)
1234 if (pltneeded && intsym->pltent.allocated == 0) {
1235 intsym->pltent.allocated = 1;
1236 intsym->pltent.offset = plt_offset;
1237 plt_offset += BB_PLT_ENTRY_SIZE;
1238 intsym->pltent.inited = 0;
1245 #if defined(BB_USE_GOT_ENTRIES)
1247 struct obj_section* myrelsec = obj_find_section(f, ".got");
1250 obj_extend_section(myrelsec, got_offset);
1252 myrelsec = obj_create_alloced_section(f, ".got",
1258 ifile->got = myrelsec;
1262 #if defined(BB_USE_PLT_ENTRIES)
1264 ifile->plt = obj_create_alloced_section(f, ".plt",
1272 static int arch_init_module(struct obj_file *f, struct new_module *mod)
1278 /*======================================================================*/
1280 /* Standard ELF hash function. */
1281 static inline unsigned long obj_elf_hash_n(const char *name, unsigned long n)
1283 unsigned long h = 0;
1290 if ((g = (h & 0xf0000000)) != 0) {
1299 static unsigned long obj_elf_hash(const char *name)
1301 return obj_elf_hash_n(name, strlen(name));
1304 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
1305 /* Get the kernel version in the canonical integer form. */
1307 static int get_kernel_version(char str[STRVERSIONLEN])
1309 struct utsname uts_info;
1312 if (uname(&uts_info) < 0)
1314 strncpy(str, uts_info.release, STRVERSIONLEN);
1316 kv = get_kernel_revision();
1321 /* String comparison for non-co-versioned kernel and module. */
1323 static int ncv_strcmp(const char *a, const char *b)
1325 size_t alen = strlen(a), blen = strlen(b);
1327 if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R')
1328 return strncmp(a, b, alen);
1329 else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R')
1330 return strncmp(a, b, blen);
1332 return strcmp(a, b);
1335 /* String hashing for non-co-versioned kernel and module. Here
1336 we are simply forced to drop the crc from the hash. */
1338 static unsigned long ncv_symbol_hash(const char *str)
1340 size_t len = strlen(str);
1341 if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R')
1343 return obj_elf_hash_n(str, len);
1347 obj_set_symbol_compare(struct obj_file *f,
1348 int (*cmp) (const char *, const char *),
1349 unsigned long (*hash) (const char *))
1352 f->symbol_cmp = cmp;
1354 struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next;
1357 f->symbol_hash = hash;
1359 memcpy(tmptab, f->symtab, sizeof(tmptab));
1360 memset(f->symtab, 0, sizeof(f->symtab));
1362 for (i = 0; i < HASH_BUCKETS; ++i)
1363 for (sym = tmptab[i]; sym; sym = next) {
1364 unsigned long h = hash(sym->name) % HASH_BUCKETS;
1366 sym->next = f->symtab[h];
1372 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
1374 static struct obj_symbol *
1375 obj_add_symbol(struct obj_file *f, const char *name,
1376 unsigned long symidx, int info,
1377 int secidx, ElfW(Addr) value,
1380 struct obj_symbol *sym;
1381 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
1382 int n_type = ELFW(ST_TYPE) (info);
1383 int n_binding = ELFW(ST_BIND) (info);
1385 for (sym = f->symtab[hash]; sym; sym = sym->next)
1386 if (f->symbol_cmp(sym->name, name) == 0) {
1387 int o_secidx = sym->secidx;
1388 int o_info = sym->info;
1389 int o_type = ELFW(ST_TYPE) (o_info);
1390 int o_binding = ELFW(ST_BIND) (o_info);
1392 /* A redefinition! Is it legal? */
1394 if (secidx == SHN_UNDEF)
1396 else if (o_secidx == SHN_UNDEF)
1398 else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) {
1399 /* Cope with local and global symbols of the same name
1400 in the same object file, as might have been created
1401 by ld -r. The only reason locals are now seen at this
1402 level at all is so that we can do semi-sensible things
1405 struct obj_symbol *nsym, **p;
1407 nsym = arch_new_symbol();
1408 nsym->next = sym->next;
1411 /* Excise the old (local) symbol from the hash chain. */
1412 for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next)
1416 } else if (n_binding == STB_LOCAL) {
1417 /* Another symbol of the same name has already been defined.
1418 Just add this to the local table. */
1419 sym = arch_new_symbol();
1422 f->local_symtab[symidx] = sym;
1424 } else if (n_binding == STB_WEAK)
1426 else if (o_binding == STB_WEAK)
1428 /* Don't unify COMMON symbols with object types the programmer
1430 else if (secidx == SHN_COMMON
1431 && (o_type == STT_NOTYPE || o_type == STT_OBJECT))
1433 else if (o_secidx == SHN_COMMON
1434 && (n_type == STT_NOTYPE || n_type == STT_OBJECT))
1437 /* Don't report an error if the symbol is coming from
1438 the kernel or some external module. */
1439 if (secidx <= SHN_HIRESERVE)
1440 error_msg("%s multiply defined", name);
1445 /* Completely new symbol. */
1446 sym = arch_new_symbol();
1447 sym->next = f->symtab[hash];
1448 f->symtab[hash] = sym;
1451 if (ELFW(ST_BIND)(info) == STB_LOCAL && symidx != -1) {
1452 if (symidx >= f->local_symtab_size)
1453 error_msg("local symbol %s with index %ld exceeds local_symtab_size %ld",
1454 name, (long) symidx, (long) f->local_symtab_size);
1456 f->local_symtab[symidx] = sym;
1463 sym->secidx = secidx;
1469 static struct obj_symbol *
1470 obj_find_symbol(struct obj_file *f, const char *name)
1472 struct obj_symbol *sym;
1473 unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS;
1475 for (sym = f->symtab[hash]; sym; sym = sym->next)
1476 if (f->symbol_cmp(sym->name, name) == 0)
1483 obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym)
1486 if (sym->secidx >= SHN_LORESERVE)
1489 return sym->value + f->sections[sym->secidx]->header.sh_addr;
1491 /* As a special case, a NULL sym has value zero. */
1496 static struct obj_section *obj_find_section(struct obj_file *f, const char *name)
1498 int i, n = f->header.e_shnum;
1500 for (i = 0; i < n; ++i)
1501 if (strcmp(f->sections[i]->name, name) == 0)
1502 return f->sections[i];
1507 static int obj_load_order_prio(struct obj_section *a)
1509 unsigned long af, ac;
1511 af = a->header.sh_flags;
1514 if (a->name[0] != '.' || strlen(a->name) != 10 ||
1515 strcmp(a->name + 5, ".init"))
1519 if (!(af & SHF_WRITE))
1521 if (af & SHF_EXECINSTR)
1523 if (a->header.sh_type != SHT_NOBITS)
1530 obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec)
1532 struct obj_section **p;
1533 int prio = obj_load_order_prio(sec);
1534 for (p = f->load_order_search_start; *p; p = &(*p)->load_next)
1535 if (obj_load_order_prio(*p) < prio)
1537 sec->load_next = *p;
1541 static struct obj_section *obj_create_alloced_section(struct obj_file *f,
1543 unsigned long align,
1546 int newidx = f->header.e_shnum++;
1547 struct obj_section *sec;
1549 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
1550 f->sections[newidx] = sec = arch_new_section();
1552 memset(sec, 0, sizeof(*sec));
1553 sec->header.sh_type = SHT_PROGBITS;
1554 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
1555 sec->header.sh_size = size;
1556 sec->header.sh_addralign = align;
1560 sec->contents = xmalloc(size);
1562 obj_insert_section_load_order(f, sec);
1567 static struct obj_section *obj_create_alloced_section_first(struct obj_file *f,
1569 unsigned long align,
1572 int newidx = f->header.e_shnum++;
1573 struct obj_section *sec;
1575 f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec));
1576 f->sections[newidx] = sec = arch_new_section();
1578 memset(sec, 0, sizeof(*sec));
1579 sec->header.sh_type = SHT_PROGBITS;
1580 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
1581 sec->header.sh_size = size;
1582 sec->header.sh_addralign = align;
1586 sec->contents = xmalloc(size);
1588 sec->load_next = f->load_order;
1589 f->load_order = sec;
1590 if (f->load_order_search_start == &f->load_order)
1591 f->load_order_search_start = &sec->load_next;
1596 static void *obj_extend_section(struct obj_section *sec, unsigned long more)
1598 unsigned long oldsize = sec->header.sh_size;
1600 sec->contents = xrealloc(sec->contents, sec->header.sh_size += more);
1602 return sec->contents + oldsize;
1606 /* Conditionally add the symbols from the given symbol set to the
1612 int idx, struct new_module_symbol *syms, size_t nsyms)
1614 struct new_module_symbol *s;
1618 for (i = 0, s = syms; i < nsyms; ++i, ++s) {
1620 /* Only add symbols that are already marked external. If we
1621 override locals we may cause problems for argument initialization.
1622 We will also create a false dependency on the module. */
1623 struct obj_symbol *sym;
1625 sym = obj_find_symbol(f, (char *) s->name);
1626 if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) {
1627 sym = obj_add_symbol(f, (char *) s->name, -1,
1628 ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE),
1630 /* Did our symbol just get installed? If so, mark the
1631 module as "used". */
1632 if (sym->secidx == idx)
1640 static void add_kernel_symbols(struct obj_file *f)
1642 struct external_module *m;
1645 /* Add module symbols first. */
1647 for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m)
1649 && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms,
1650 m->nsyms)) m->used = 1, ++nused;
1652 n_ext_modules_used = nused;
1654 /* And finally the symbols from the kernel proper. */
1657 add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms);
1660 static char *get_modinfo_value(struct obj_file *f, const char *key)
1662 struct obj_section *sec;
1663 char *p, *v, *n, *ep;
1664 size_t klen = strlen(key);
1666 sec = obj_find_section(f, ".modinfo");
1670 ep = p + sec->header.sh_size;
1673 n = strchr(p, '\0');
1675 if (p + klen == v && strncmp(p, key, klen) == 0)
1678 if (p + klen == n && strcmp(p, key) == 0)
1688 /*======================================================================*/
1689 /* Functions relating to module loading in pre 2.1 kernels. */
1692 old_process_module_arguments(struct obj_file *f, int argc, char **argv)
1696 struct obj_symbol *sym;
1700 if ((q = strchr(p, '=')) == NULL) {
1706 sym = obj_find_symbol(f, p);
1708 /* Also check that the parameter was not resolved from the kernel. */
1709 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
1710 error_msg("symbol for parameter %s not found", p);
1714 loc = (int *) (f->sections[sym->secidx]->contents + sym->value);
1716 /* Do C quoting if we begin with a ". */
1720 str = alloca(strlen(q));
1721 for (r = str, q++; *q != '"'; ++q, ++r) {
1723 error_msg("improperly terminated string argument for %s", p);
1725 } else if (*q == '\\')
1759 if (q[1] >= '0' && q[1] <= '7') {
1760 c = (c * 8) + *++q - '0';
1761 if (q[1] >= '0' && q[1] <= '7')
1762 c = (c * 8) + *++q - '0';
1775 obj_string_patch(f, sym->secidx, sym->value, str);
1776 } else if (*q >= '0' && *q <= '9') {
1778 *loc++ = strtoul(q, &q, 0);
1779 while (*q++ == ',');
1781 char *contents = f->sections[sym->secidx]->contents;
1782 char *myloc = contents + sym->value;
1783 char *r; /* To search for commas */
1785 /* Break the string with comas */
1786 while ((r = strchr(q, ',')) != (char *) NULL) {
1788 obj_string_patch(f, sym->secidx, myloc - contents, q);
1789 myloc += sizeof(char *);
1794 obj_string_patch(f, sym->secidx, myloc - contents, q);
1803 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
1804 static int old_is_module_checksummed(struct obj_file *f)
1806 return obj_find_symbol(f, "Using_Versions") != NULL;
1808 /* Get the module's kernel version in the canonical integer form. */
1811 old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
1813 struct obj_symbol *sym;
1817 sym = obj_find_symbol(f, "kernel_version");
1821 p = f->sections[sym->secidx]->contents + sym->value;
1822 strncpy(str, p, STRVERSIONLEN);
1824 a = strtoul(p, &p, 10);
1827 b = strtoul(p + 1, &p, 10);
1830 c = strtoul(p + 1, &q, 10);
1834 return a << 16 | b << 8 | c;
1837 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
1839 #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
1841 /* Fetch all the symbols and divvy them up as appropriate for the modules. */
1843 static int old_get_kernel_symbols(const char *m_name)
1845 struct old_kernel_sym *ks, *k;
1846 struct new_module_symbol *s;
1847 struct external_module *mod;
1848 int nks, nms, nmod, i;
1850 nks = get_kernel_syms(NULL);
1853 perror_msg("get_kernel_syms: %s", m_name);
1855 error_msg("No kernel symbols");
1859 ks = k = xmalloc(nks * sizeof(*ks));
1861 if (get_kernel_syms(ks) != nks) {
1862 perror("inconsistency with get_kernel_syms -- is someone else "
1863 "playing with modules?");
1868 /* Collect the module information. */
1873 while (k->name[0] == '#' && k->name[1]) {
1874 struct old_kernel_sym *k2;
1876 /* Find out how many symbols this module has. */
1877 for (k2 = k + 1; k2->name[0] != '#'; ++k2)
1881 mod = xrealloc(mod, (++nmod + 1) * sizeof(*mod));
1882 mod[nmod].name = k->name + 1;
1883 mod[nmod].addr = k->value;
1885 mod[nmod].nsyms = nms;
1886 mod[nmod].syms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL);
1888 for (i = 0, ++k; i < nms; ++i, ++s, ++k) {
1889 s->name = (unsigned long) k->name;
1890 s->value = k->value;
1897 n_ext_modules = nmod + 1;
1899 /* Now collect the symbols for the kernel proper. */
1901 if (k->name[0] == '#')
1904 nksyms = nms = nks - (k - ks);
1905 ksyms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL);
1907 for (i = 0; i < nms; ++i, ++s, ++k) {
1908 s->name = (unsigned long) k->name;
1909 s->value = k->value;
1915 /* Return the kernel symbol checksum version, or zero if not used. */
1917 static int old_is_kernel_checksummed(void)
1919 /* Using_Versions is the first symbol. */
1921 && strcmp((char *) ksyms[0].name,
1922 "Using_Versions") == 0) return ksyms[0].value;
1928 static int old_create_mod_use_count(struct obj_file *f)
1930 struct obj_section *sec;
1932 sec = obj_create_alloced_section_first(f, ".moduse", sizeof(long),
1935 obj_add_symbol(f, "mod_use_count_", -1,
1936 ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0,
1943 old_init_module(const char *m_name, struct obj_file *f,
1944 unsigned long m_size)
1947 struct old_mod_routines routines;
1948 struct old_symbol_table *symtab;
1951 /* Create the symbol table */
1953 int nsyms = 0, strsize = 0, total;
1955 /* Size things first... */
1958 for (i = 0; i < HASH_BUCKETS; ++i) {
1959 struct obj_symbol *sym;
1960 for (sym = f->symtab[i]; sym; sym = sym->next)
1961 if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
1962 && sym->secidx <= SHN_HIRESERVE)
1964 sym->ksymidx = nsyms++;
1965 strsize += strlen(sym->name) + 1;
1970 total = (sizeof(struct old_symbol_table)
1971 + nsyms * sizeof(struct old_module_symbol)
1972 + n_ext_modules_used * sizeof(struct old_module_ref)
1974 symtab = xmalloc(total);
1975 symtab->size = total;
1976 symtab->n_symbols = nsyms;
1977 symtab->n_refs = n_ext_modules_used;
1979 if (flag_export && nsyms) {
1980 struct old_module_symbol *ksym;
1984 ksym = symtab->symbol;
1985 str = ((char *) ksym + nsyms * sizeof(struct old_module_symbol)
1986 + n_ext_modules_used * sizeof(struct old_module_ref));
1988 for (i = 0; i < HASH_BUCKETS; ++i) {
1989 struct obj_symbol *sym;
1990 for (sym = f->symtab[i]; sym; sym = sym->next)
1991 if (sym->ksymidx >= 0) {
1992 ksym->addr = obj_symbol_final_value(f, sym);
1994 (unsigned long) str - (unsigned long) symtab;
1996 strcpy(str, sym->name);
1997 str += strlen(sym->name) + 1;
2003 if (n_ext_modules_used) {
2004 struct old_module_ref *ref;
2007 ref = (struct old_module_ref *)
2008 ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol));
2010 for (i = 0; i < n_ext_modules; ++i)
2011 if (ext_modules[i].used)
2012 ref++->module = ext_modules[i].addr;
2016 /* Fill in routines. */
2019 obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
2021 obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module"));
2023 /* Whew! All of the initialization is complete. Collect the final
2024 module image and give it to the kernel. */
2026 image = xmalloc(m_size);
2027 obj_create_image(f, image);
2029 /* image holds the complete relocated module, accounting correctly for
2030 mod_use_count. However the old module kernel support assume that
2031 it is receiving something which does not contain mod_use_count. */
2032 ret = old_sys_init_module(m_name, image + sizeof(long),
2033 m_size | (flag_autoclean ? OLD_MOD_AUTOCLEAN
2034 : 0), &routines, symtab);
2036 perror_msg("init_module: %s", m_name);
2046 #define old_create_mod_use_count(x) TRUE
2047 #define old_init_module(x, y, z) TRUE
2049 #endif /* BB_FEATURE_OLD_MODULE_INTERFACE */
2053 /*======================================================================*/
2054 /* Functions relating to module loading after 2.1.18. */
2057 new_process_module_arguments(struct obj_file *f, int argc, char **argv)
2061 struct obj_symbol *sym;
2062 char *contents, *loc;
2066 if ((q = strchr(p, '=')) == NULL) {
2071 key = alloca(q - p + 6);
2072 memcpy(key, "parm_", 5);
2073 memcpy(key + 5, p, q - p);
2076 p = get_modinfo_value(f, key);
2079 error_msg("invalid parameter %s", key);
2083 sym = obj_find_symbol(f, key);
2085 /* Also check that the parameter was not resolved from the kernel. */
2086 if (sym == NULL || sym->secidx > SHN_HIRESERVE) {
2087 error_msg("symbol for parameter %s not found", key);
2092 min = strtoul(p, &p, 10);
2094 max = strtoul(p + 1, &p, 10);
2100 contents = f->sections[sym->secidx]->contents;
2101 loc = contents + sym->value;
2105 if ((*p == 's') || (*p == 'c')) {
2108 /* Do C quoting if we begin with a ", else slurp the lot. */
2112 str = alloca(strlen(q));
2113 for (r = str, q++; *q != '"'; ++q, ++r) {
2115 error_msg("improperly terminated string argument for %s",
2118 } else if (*q == '\\')
2152 if (q[1] >= '0' && q[1] <= '7') {
2153 c = (c * 8) + *++q - '0';
2154 if (q[1] >= '0' && q[1] <= '7')
2155 c = (c * 8) + *++q - '0';
2172 /* In this case, the string is not quoted. We will break
2173 it using the coma (like for ints). If the user wants to
2174 include comas in a string, he just has to quote it */
2176 /* Search the next coma */
2180 if (r != (char *) NULL) {
2181 /* Recopy the current field */
2182 str = alloca(r - q + 1);
2183 memcpy(str, q, r - q);
2185 /* I don't know if it is usefull, as the previous case
2186 doesn't null terminate the string ??? */
2189 /* Keep next fields */
2200 obj_string_patch(f, sym->secidx, loc - contents, str);
2201 loc += tgt_sizeof_char_p;
2203 /* Array of chars (in fact, matrix !) */
2204 unsigned long charssize; /* size of each member */
2206 /* Get the size of each member */
2207 /* Probably we should do that outside the loop ? */
2208 if (!isdigit(*(p + 1))) {
2209 error_msg("parameter type 'c' for %s must be followed by"
2210 " the maximum size", key);
2213 charssize = strtoul(p + 1, (char **) NULL, 10);
2216 if (strlen(str) >= charssize) {
2217 error_msg("string too long for %s (max %ld)", key,
2222 /* Copy to location */
2223 strcpy((char *) loc, str);
2227 long v = strtoul(q, &q, 0);
2234 loc += tgt_sizeof_short;
2238 loc += tgt_sizeof_int;
2242 loc += tgt_sizeof_long;
2246 error_msg("unknown parameter type '%c' for %s", *p, key);
2261 goto retry_end_of_value;
2265 error_msg("too many values for %s (max %d)", key, max);
2272 error_msg("invalid argument syntax for %s", key);
2279 error_msg("too few values for %s (min %d)", key, min);
2289 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
2290 static int new_is_module_checksummed(struct obj_file *f)
2292 const char *p = get_modinfo_value(f, "using_checksums");
2299 /* Get the module's kernel version in the canonical integer form. */
2302 new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN])
2307 p = get_modinfo_value(f, "kernel_version");
2310 strncpy(str, p, STRVERSIONLEN);
2312 a = strtoul(p, &p, 10);
2315 b = strtoul(p + 1, &p, 10);
2318 c = strtoul(p + 1, &q, 10);
2322 return a << 16 | b << 8 | c;
2325 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
2328 #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
2330 /* Fetch the loaded modules, and all currently exported symbols. */
2332 static int new_get_kernel_symbols(void)
2334 char *module_names, *mn;
2335 struct external_module *modules, *m;
2336 struct new_module_symbol *syms, *s;
2337 size_t ret, bufsize, nmod, nsyms, i, j;
2339 /* Collect the loaded modules. */
2341 module_names = xmalloc(bufsize = 256);
2343 if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) {
2344 if (errno == ENOSPC && bufsize < ret) {
2345 module_names = xrealloc(module_names, bufsize = ret);
2346 goto retry_modules_load;
2348 perror_msg("QM_MODULES");
2352 n_ext_modules = nmod = ret;
2354 /* Collect the modules' symbols. */
2357 ext_modules = modules = xmalloc(nmod * sizeof(*modules));
2358 memset(modules, 0, nmod * sizeof(*modules));
2359 for (i = 0, mn = module_names, m = modules;
2360 i < nmod; ++i, ++m, mn += strlen(mn) + 1) {
2361 struct new_module_info info;
2363 if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) {
2364 if (errno == ENOENT) {
2365 /* The module was removed out from underneath us. */
2368 perror_msg("query_module: QM_INFO: %s", mn);
2372 syms = xmalloc(bufsize = 1024);
2374 if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) {
2377 syms = xrealloc(syms, bufsize = ret);
2378 goto retry_mod_sym_load;
2380 /* The module was removed out from underneath us. */
2383 perror_msg("query_module: QM_SYMBOLS: %s", mn);
2390 m->addr = info.addr;
2394 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2395 s->name += (unsigned long) syms;
2400 /* Collect the kernel's symbols. */
2402 syms = xmalloc(bufsize = 16 * 1024);
2403 retry_kern_sym_load:
2404 if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) {
2405 if (errno == ENOSPC && bufsize < ret) {
2406 syms = xrealloc(syms, bufsize = ret);
2407 goto retry_kern_sym_load;
2409 perror_msg("kernel: QM_SYMBOLS");
2412 nksyms = nsyms = ret;
2415 for (j = 0, s = syms; j < nsyms; ++j, ++s) {
2416 s->name += (unsigned long) syms;
2422 /* Return the kernel symbol checksum version, or zero if not used. */
2424 static int new_is_kernel_checksummed(void)
2426 struct new_module_symbol *s;
2429 /* Using_Versions is not the first symbol, but it should be in there. */
2431 for (i = 0, s = ksyms; i < nksyms; ++i, ++s)
2432 if (strcmp((char *) s->name, "Using_Versions") == 0)
2439 static int new_create_this_module(struct obj_file *f, const char *m_name)
2441 struct obj_section *sec;
2443 sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long,
2444 sizeof(struct new_module));
2445 memset(sec->contents, 0, sizeof(struct new_module));
2447 obj_add_symbol(f, "__this_module", -1,
2448 ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0,
2449 sizeof(struct new_module));
2451 obj_string_patch(f, sec->idx, offsetof(struct new_module, name),
2458 static int new_create_module_ksymtab(struct obj_file *f)
2460 struct obj_section *sec;
2463 /* We must always add the module references. */
2465 if (n_ext_modules_used) {
2466 struct new_module_ref *dep;
2467 struct obj_symbol *tm;
2469 sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p,
2470 (sizeof(struct new_module_ref)
2471 * n_ext_modules_used));
2475 tm = obj_find_symbol(f, "__this_module");
2476 dep = (struct new_module_ref *) sec->contents;
2477 for (i = 0; i < n_ext_modules; ++i)
2478 if (ext_modules[i].used) {
2479 dep->dep = ext_modules[i].addr;
2480 obj_symbol_patch(f, sec->idx,
2481 (char *) &dep->ref - sec->contents, tm);
2487 if (flag_export && !obj_find_section(f, "__ksymtab")) {
2492 obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p,
2495 /* We don't want to export symbols residing in sections that
2496 aren't loaded. There are a number of these created so that
2497 we make sure certain module options don't appear twice. */
2499 loaded = alloca(sizeof(int) * (i = f->header.e_shnum));
2501 loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0;
2503 for (nsyms = i = 0; i < HASH_BUCKETS; ++i) {
2504 struct obj_symbol *sym;
2505 for (sym = f->symtab[i]; sym; sym = sym->next)
2506 if (ELFW(ST_BIND) (sym->info) != STB_LOCAL
2507 && sym->secidx <= SHN_HIRESERVE
2508 && (sym->secidx >= SHN_LORESERVE
2509 || loaded[sym->secidx])) {
2510 ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p;
2512 obj_symbol_patch(f, sec->idx, ofs, sym);
2513 obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p,
2520 obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p);
2528 new_init_module(const char *m_name, struct obj_file *f,
2529 unsigned long m_size)
2531 struct new_module *module;
2532 struct obj_section *sec;
2537 sec = obj_find_section(f, ".this");
2538 if (!sec || !sec->contents) {
2539 perror_msg_and_die("corrupt module %s?",m_name);
2541 module = (struct new_module *) sec->contents;
2542 m_addr = sec->header.sh_addr;
2544 module->size_of_struct = sizeof(*module);
2545 module->size = m_size;
2546 module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0;
2548 sec = obj_find_section(f, "__ksymtab");
2549 if (sec && sec->header.sh_size) {
2550 module->syms = sec->header.sh_addr;
2551 module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p);
2554 if (n_ext_modules_used) {
2555 sec = obj_find_section(f, ".kmodtab");
2556 module->deps = sec->header.sh_addr;
2557 module->ndeps = n_ext_modules_used;
2561 obj_symbol_final_value(f, obj_find_symbol(f, "init_module"));
2563 obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module"));
2565 sec = obj_find_section(f, "__ex_table");
2567 module->ex_table_start = sec->header.sh_addr;
2568 module->ex_table_end = sec->header.sh_addr + sec->header.sh_size;
2571 sec = obj_find_section(f, ".text.init");
2573 module->runsize = sec->header.sh_addr - m_addr;
2575 sec = obj_find_section(f, ".data.init");
2577 if (!module->runsize ||
2578 module->runsize > sec->header.sh_addr - m_addr)
2579 module->runsize = sec->header.sh_addr - m_addr;
2581 sec = obj_find_section(f, ARCHDATA_SEC_NAME);
2582 if (sec && sec->header.sh_size) {
2583 module->archdata_start = (void*)sec->header.sh_addr;
2584 module->archdata_end = module->archdata_start + sec->header.sh_size;
2586 sec = obj_find_section(f, KALLSYMS_SEC_NAME);
2587 if (sec && sec->header.sh_size) {
2588 module->kallsyms_start = (void*)sec->header.sh_addr;
2589 module->kallsyms_end = module->kallsyms_start + sec->header.sh_size;
2592 if (!arch_init_module(f, module))
2595 /* Whew! All of the initialization is complete. Collect the final
2596 module image and give it to the kernel. */
2598 image = xmalloc(m_size);
2599 obj_create_image(f, image);
2601 ret = new_sys_init_module(m_name, (struct new_module *) image);
2603 perror_msg("init_module: %s", m_name);
2612 #define new_init_module(x, y, z) TRUE
2613 #define new_create_this_module(x, y) 0
2614 #define new_create_module_ksymtab(x)
2615 #define query_module(v, w, x, y, z) -1
2617 #endif /* BB_FEATURE_NEW_MODULE_INTERFACE */
2620 /*======================================================================*/
2623 obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2626 struct obj_string_patch *p;
2627 struct obj_section *strsec;
2628 size_t len = strlen(string) + 1;
2631 p = xmalloc(sizeof(*p));
2632 p->next = f->string_patches;
2633 p->reloc_secidx = secidx;
2634 p->reloc_offset = offset;
2635 f->string_patches = p;
2637 strsec = obj_find_section(f, ".kstrtab");
2638 if (strsec == NULL) {
2639 strsec = obj_create_alloced_section(f, ".kstrtab", 1, len);
2640 p->string_offset = 0;
2641 loc = strsec->contents;
2643 p->string_offset = strsec->header.sh_size;
2644 loc = obj_extend_section(strsec, len);
2646 memcpy(loc, string, len);
2652 obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset,
2653 struct obj_symbol *sym)
2655 struct obj_symbol_patch *p;
2657 p = xmalloc(sizeof(*p));
2658 p->next = f->symbol_patches;
2659 p->reloc_secidx = secidx;
2660 p->reloc_offset = offset;
2662 f->symbol_patches = p;
2667 static int obj_check_undefineds(struct obj_file *f)
2672 for (i = 0; i < HASH_BUCKETS; ++i) {
2673 struct obj_symbol *sym;
2674 for (sym = f->symtab[i]; sym; sym = sym->next)
2675 if (sym->secidx == SHN_UNDEF) {
2676 if (ELFW(ST_BIND) (sym->info) == STB_WEAK) {
2677 sym->secidx = SHN_ABS;
2680 error_msg("unresolved symbol %s", sym->name);
2689 static void obj_allocate_commons(struct obj_file *f)
2691 struct common_entry {
2692 struct common_entry *next;
2693 struct obj_symbol *sym;
2694 } *common_head = NULL;
2698 for (i = 0; i < HASH_BUCKETS; ++i) {
2699 struct obj_symbol *sym;
2700 for (sym = f->symtab[i]; sym; sym = sym->next)
2701 if (sym->secidx == SHN_COMMON) {
2702 /* Collect all COMMON symbols and sort them by size so as to
2703 minimize space wasted by alignment requirements. */
2705 struct common_entry **p, *n;
2706 for (p = &common_head; *p; p = &(*p)->next)
2707 if (sym->size <= (*p)->sym->size)
2710 n = alloca(sizeof(*n));
2718 for (i = 1; i < f->local_symtab_size; ++i) {
2719 struct obj_symbol *sym = f->local_symtab[i];
2720 if (sym && sym->secidx == SHN_COMMON) {
2721 struct common_entry **p, *n;
2722 for (p = &common_head; *p; p = &(*p)->next)
2723 if (sym == (*p)->sym)
2725 else if (sym->size < (*p)->sym->size) {
2726 n = alloca(sizeof(*n));
2736 /* Find the bss section. */
2737 for (i = 0; i < f->header.e_shnum; ++i)
2738 if (f->sections[i]->header.sh_type == SHT_NOBITS)
2741 /* If for some reason there hadn't been one, create one. */
2742 if (i == f->header.e_shnum) {
2743 struct obj_section *sec;
2745 f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec));
2746 f->sections[i] = sec = arch_new_section();
2747 f->header.e_shnum = i + 1;
2749 memset(sec, 0, sizeof(*sec));
2750 sec->header.sh_type = SHT_PROGBITS;
2751 sec->header.sh_flags = SHF_WRITE | SHF_ALLOC;
2756 /* Allocate the COMMONS. */
2758 ElfW(Addr) bss_size = f->sections[i]->header.sh_size;
2759 ElfW(Addr) max_align = f->sections[i]->header.sh_addralign;
2760 struct common_entry *c;
2762 for (c = common_head; c; c = c->next) {
2763 ElfW(Addr) align = c->sym->value;
2765 if (align > max_align)
2767 if (bss_size & (align - 1))
2768 bss_size = (bss_size | (align - 1)) + 1;
2771 c->sym->value = bss_size;
2773 bss_size += c->sym->size;
2776 f->sections[i]->header.sh_size = bss_size;
2777 f->sections[i]->header.sh_addralign = max_align;
2781 /* For the sake of patch relocation and parameter initialization,
2782 allocate zeroed data for NOBITS sections now. Note that after
2783 this we cannot assume NOBITS are really empty. */
2784 for (i = 0; i < f->header.e_shnum; ++i) {
2785 struct obj_section *s = f->sections[i];
2786 if (s->header.sh_type == SHT_NOBITS) {
2787 if (s->header.sh_size != 0)
2788 s->contents = memset(xmalloc(s->header.sh_size),
2789 0, s->header.sh_size);
2793 s->header.sh_type = SHT_PROGBITS;
2798 static unsigned long obj_load_size(struct obj_file *f)
2800 unsigned long dot = 0;
2801 struct obj_section *sec;
2803 /* Finalize the positions of the sections relative to one another. */
2805 for (sec = f->load_order; sec; sec = sec->load_next) {
2808 align = sec->header.sh_addralign;
2809 if (align && (dot & (align - 1)))
2810 dot = (dot | (align - 1)) + 1;
2812 sec->header.sh_addr = dot;
2813 dot += sec->header.sh_size;
2819 static int obj_relocate(struct obj_file *f, ElfW(Addr) base)
2821 int i, n = f->header.e_shnum;
2824 /* Finalize the addresses of the sections. */
2827 for (i = 0; i < n; ++i)
2828 f->sections[i]->header.sh_addr += base;
2830 /* And iterate over all of the relocations. */
2832 for (i = 0; i < n; ++i) {
2833 struct obj_section *relsec, *symsec, *targsec, *strsec;
2834 ElfW(RelM) * rel, *relend;
2838 relsec = f->sections[i];
2839 if (relsec->header.sh_type != SHT_RELM)
2842 symsec = f->sections[relsec->header.sh_link];
2843 targsec = f->sections[relsec->header.sh_info];
2844 strsec = f->sections[symsec->header.sh_link];
2846 rel = (ElfW(RelM) *) relsec->contents;
2847 relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM)));
2848 symtab = (ElfW(Sym) *) symsec->contents;
2849 strtab = (const char *) strsec->contents;
2851 for (; rel < relend; ++rel) {
2852 ElfW(Addr) value = 0;
2853 struct obj_symbol *intsym = NULL;
2854 unsigned long symndx;
2855 ElfW(Sym) * extsym = 0;
2858 /* Attempt to find a value to use for this relocation. */
2860 symndx = ELFW(R_SYM) (rel->r_info);
2862 /* Note we've already checked for undefined symbols. */
2864 extsym = &symtab[symndx];
2865 if (ELFW(ST_BIND) (extsym->st_info) == STB_LOCAL) {
2866 /* Local symbols we look up in the local table to be sure
2867 we get the one that is really intended. */
2868 intsym = f->local_symtab[symndx];
2870 /* Others we look up in the hash table. */
2872 if (extsym->st_name)
2873 name = strtab + extsym->st_name;
2875 name = f->sections[extsym->st_shndx]->name;
2876 intsym = obj_find_symbol(f, name);
2879 value = obj_symbol_final_value(f, intsym);
2880 intsym->referenced = 1;
2882 #if SHT_RELM == SHT_RELA
2883 #if defined(__alpha__) && defined(AXP_BROKEN_GAS)
2884 /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */
2885 if (!extsym || !extsym->st_name ||
2886 ELFW(ST_BIND) (extsym->st_info) != STB_LOCAL)
2888 value += rel->r_addend;
2892 switch (arch_apply_relocation
2893 (f, targsec, symsec, intsym, rel, value)) {
2897 case obj_reloc_overflow:
2898 errmsg = "Relocation overflow";
2900 case obj_reloc_dangerous:
2901 errmsg = "Dangerous relocation";
2903 case obj_reloc_unhandled:
2904 errmsg = "Unhandled relocation";
2907 error_msg("%s of type %ld for %s", errmsg,
2908 (long) ELFW(R_TYPE) (rel->r_info),
2909 strtab + extsym->st_name);
2911 error_msg("%s of type %ld", errmsg,
2912 (long) ELFW(R_TYPE) (rel->r_info));
2920 /* Finally, take care of the patches. */
2922 if (f->string_patches) {
2923 struct obj_string_patch *p;
2924 struct obj_section *strsec;
2925 ElfW(Addr) strsec_base;
2926 strsec = obj_find_section(f, ".kstrtab");
2927 strsec_base = strsec->header.sh_addr;
2929 for (p = f->string_patches; p; p = p->next) {
2930 struct obj_section *targsec = f->sections[p->reloc_secidx];
2931 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
2932 = strsec_base + p->string_offset;
2936 if (f->symbol_patches) {
2937 struct obj_symbol_patch *p;
2939 for (p = f->symbol_patches; p; p = p->next) {
2940 struct obj_section *targsec = f->sections[p->reloc_secidx];
2941 *(ElfW(Addr) *) (targsec->contents + p->reloc_offset)
2942 = obj_symbol_final_value(f, p->sym);
2949 static int obj_create_image(struct obj_file *f, char *image)
2951 struct obj_section *sec;
2952 ElfW(Addr) base = f->baseaddr;
2954 for (sec = f->load_order; sec; sec = sec->load_next) {
2957 if (sec->contents == 0 || sec->header.sh_size == 0)
2960 secimg = image + (sec->header.sh_addr - base);
2962 /* Note that we allocated data for NOBITS sections earlier. */
2963 memcpy(secimg, sec->contents, sec->header.sh_size);
2969 /*======================================================================*/
2971 static struct obj_file *obj_load(FILE * fp, int loadprogbits)
2974 ElfW(Shdr) * section_headers;
2978 /* Read the file header. */
2980 f = arch_new_file();
2981 memset(f, 0, sizeof(*f));
2982 f->symbol_cmp = strcmp;
2983 f->symbol_hash = obj_elf_hash;
2984 f->load_order_search_start = &f->load_order;
2986 fseek(fp, 0, SEEK_SET);
2987 if (fread(&f->header, sizeof(f->header), 1, fp) != 1) {
2988 perror_msg("error reading ELF header");
2992 if (f->header.e_ident[EI_MAG0] != ELFMAG0
2993 || f->header.e_ident[EI_MAG1] != ELFMAG1
2994 || f->header.e_ident[EI_MAG2] != ELFMAG2
2995 || f->header.e_ident[EI_MAG3] != ELFMAG3) {
2996 error_msg("not an ELF file");
2999 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3000 || f->header.e_ident[EI_DATA] != ELFDATAM
3001 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3002 || !MATCH_MACHINE(f->header.e_machine)) {
3003 error_msg("ELF file not for this architecture");
3006 if (f->header.e_type != ET_REL) {
3007 error_msg("ELF file not a relocatable object");
3011 /* Read the section headers. */
3013 if (f->header.e_shentsize != sizeof(ElfW(Shdr))) {
3014 error_msg("section header size mismatch: %lu != %lu",
3015 (unsigned long) f->header.e_shentsize,
3016 (unsigned long) sizeof(ElfW(Shdr)));
3020 shnum = f->header.e_shnum;
3021 f->sections = xmalloc(sizeof(struct obj_section *) * shnum);
3022 memset(f->sections, 0, sizeof(struct obj_section *) * shnum);
3024 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3025 fseek(fp, f->header.e_shoff, SEEK_SET);
3026 if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) {
3027 perror_msg("error reading ELF section headers");
3031 /* Read the section data. */
3033 for (i = 0; i < shnum; ++i) {
3034 struct obj_section *sec;
3036 f->sections[i] = sec = arch_new_section();
3037 memset(sec, 0, sizeof(*sec));
3039 sec->header = section_headers[i];
3042 if(sec->header.sh_size) switch (sec->header.sh_type) {
3051 if (!loadprogbits) {
3052 sec->contents = NULL;
3059 if (sec->header.sh_size > 0) {
3060 sec->contents = xmalloc(sec->header.sh_size);
3061 fseek(fp, sec->header.sh_offset, SEEK_SET);
3062 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3063 perror_msg("error reading ELF section data");
3067 sec->contents = NULL;
3071 #if SHT_RELM == SHT_REL
3073 error_msg("RELA relocations not supported on this architecture");
3077 error_msg("REL relocations not supported on this architecture");
3082 if (sec->header.sh_type >= SHT_LOPROC) {
3083 /* Assume processor specific section types are debug
3084 info and can safely be ignored. If this is ever not
3085 the case (Hello MIPS?), don't put ifdefs here but
3086 create an arch_load_proc_section(). */
3090 error_msg("can't handle sections of type %ld",
3091 (long) sec->header.sh_type);
3096 /* Do what sort of interpretation as needed by each section. */
3098 shstrtab = f->sections[f->header.e_shstrndx]->contents;
3100 for (i = 0; i < shnum; ++i) {
3101 struct obj_section *sec = f->sections[i];
3102 sec->name = shstrtab + sec->header.sh_name;
3105 for (i = 0; i < shnum; ++i) {
3106 struct obj_section *sec = f->sections[i];
3108 /* .modinfo should be contents only but gcc has no attribute for that.
3109 * The kernel may have marked .modinfo as ALLOC, ignore this bit.
3111 if (strcmp(sec->name, ".modinfo") == 0)
3112 sec->header.sh_flags &= ~SHF_ALLOC;
3114 if (sec->header.sh_flags & SHF_ALLOC)
3115 obj_insert_section_load_order(f, sec);
3117 switch (sec->header.sh_type) {
3120 unsigned long nsym, j;
3124 if (sec->header.sh_entsize != sizeof(ElfW(Sym))) {
3125 error_msg("symbol size mismatch: %lu != %lu",
3126 (unsigned long) sec->header.sh_entsize,
3127 (unsigned long) sizeof(ElfW(Sym)));
3131 nsym = sec->header.sh_size / sizeof(ElfW(Sym));
3132 strtab = f->sections[sec->header.sh_link]->contents;
3133 sym = (ElfW(Sym) *) sec->contents;
3135 /* Allocate space for a table of local symbols. */
3136 j = f->local_symtab_size = sec->header.sh_info;
3137 f->local_symtab = xcalloc(j, sizeof(struct obj_symbol *));
3139 /* Insert all symbols into the hash table. */
3140 for (j = 1, ++sym; j < nsym; ++j, ++sym) {
3143 name = strtab + sym->st_name;
3145 name = f->sections[sym->st_shndx]->name;
3147 obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx,
3148 sym->st_value, sym->st_size);
3154 if (sec->header.sh_entsize != sizeof(ElfW(RelM))) {
3155 error_msg("relocation entry size mismatch: %lu != %lu",
3156 (unsigned long) sec->header.sh_entsize,
3157 (unsigned long) sizeof(ElfW(RelM)));
3161 /* XXX Relocation code from modutils-2.3.19 is not here.
3162 * Why? That's about 20 lines of code from obj/obj_load.c,
3163 * which gets done in a second pass through the sections.
3164 * This BusyBox insmod does similar work in obj_relocate(). */
3171 #ifdef BB_FEATURE_INSMOD_LOADINKMEM
3173 * load the unloaded sections directly into the memory allocated by
3174 * kernel for the module
3177 static int obj_load_progbits(FILE * fp, struct obj_file* f)
3179 char* imagebase = (char*) f->imagebase;
3180 ElfW(Addr) base = f->baseaddr;
3181 struct obj_section* sec;
3183 for (sec = f->load_order; sec; sec = sec->load_next) {
3185 /* section already loaded? */
3186 if (sec->contents != NULL)
3189 if (sec->header.sh_size == 0)
3192 sec->contents = imagebase + (sec->header.sh_addr - base);
3193 fseek(fp, sec->header.sh_offset, SEEK_SET);
3194 if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) {
3195 errorMsg("error reading ELF section data: %s\n", strerror(errno));
3204 static void hide_special_symbols(struct obj_file *f)
3206 static const char *const specials[] = {
3213 struct obj_symbol *sym;
3214 const char *const *p;
3216 for (p = specials; *p; ++p)
3217 if ((sym = obj_find_symbol(f, *p)) != NULL)
3219 ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info));
3224 extern int insmod_main( int argc, char **argv)
3231 unsigned long m_size;
3236 char m_name[FILENAME_MAX + 1] = "\0";
3237 int exit_status = EXIT_FAILURE;
3239 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
3241 char k_strversion[STRVERSIONLEN];
3242 char m_strversion[STRVERSIONLEN];
3247 /* Parse any options */
3248 while ((opt = getopt(argc, argv, "fkvxLo:")) > 0) {
3250 case 'f': /* force loading */
3251 flag_force_load = 1;
3253 case 'k': /* module loaded by kerneld, auto-cleanable */
3256 case 'v': /* verbose output */
3259 case 'x': /* do not export externs */
3262 case 'o': /* name the output module */
3263 strncpy(m_name, optarg, FILENAME_MAX);
3265 case 'L': /* Stub warning */
3266 /* This is needed for compatibility with modprobe.
3267 * In theory, this does locking, but we don't do
3268 * that. So be careful and plan your life around not
3269 * loading the same module 50 times concurrently. */
3276 if (argv[optind] == NULL) {
3280 /* Grab the module name */
3281 if ((tmp = strrchr(argv[optind], '/')) != NULL) {
3288 if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o')
3290 memcpy(m_fullName, tmp, len);
3291 m_fullName[len]='\0';
3292 if (*m_name == '\0') {
3293 strcpy(m_name, m_fullName);
3295 strcat(m_fullName, ".o");
3297 /* Get a filedesc for the module. Check we we have a complete path */
3298 if (stat(argv[optind], &st) < 0 || !S_ISREG(st.st_mode) ||
3299 (fp = fopen(argv[optind], "r")) == NULL) {
3300 struct utsname myuname;
3302 /* Hmm. Could not open it. First search under /lib/modules/`uname -r`,
3303 * but do not error out yet if we fail to find it... */
3304 if (uname(&myuname) == 0) {
3305 char module_dir[FILENAME_MAX];
3306 char real_module_dir[FILENAME_MAX];
3307 snprintf (module_dir, sizeof(module_dir), "%s/%s",
3308 _PATH_MODULES, myuname.release);
3309 /* Jump through hoops in case /lib/modules/`uname -r`
3310 * is a symlink. We do not want recursive_action to
3311 * follow symlinks, but we do want to follow the
3312 * /lib/modules/`uname -r` dir, So resolve it ourselves
3313 * if it is a link... */
3314 if (realpath (module_dir, real_module_dir) == NULL)
3315 strcpy(real_module_dir, module_dir);
3316 recursive_action(real_module_dir, TRUE, FALSE, FALSE,
3317 check_module_name_match, 0, m_fullName);
3320 /* Check if we have found anything yet */
3321 if (m_filename[0] == '\0' || ((fp = fopen(m_filename, "r")) == NULL))
3323 char module_dir[FILENAME_MAX];
3324 if (realpath (_PATH_MODULES, module_dir) == NULL)
3325 strcpy(module_dir, _PATH_MODULES);
3326 /* No module found under /lib/modules/`uname -r`, this
3327 * time cast the net a bit wider. Search /lib/modules/ */
3328 if (recursive_action(module_dir, TRUE, FALSE, FALSE,
3329 check_module_name_match, 0, m_fullName) == FALSE)
3331 if (m_filename[0] == '\0'
3332 || ((fp = fopen(m_filename, "r")) == NULL))
3334 error_msg("%s: no module by that name found", m_fullName);
3335 return EXIT_FAILURE;
3338 error_msg_and_die("%s: no module by that name found", m_fullName);
3341 safe_strncpy(m_filename, argv[optind], sizeof(m_filename));
3343 printf("Using %s\n", m_filename);
3345 if ((f = obj_load(fp, LOADBITS)) == NULL)
3346 perror_msg_and_die("Could not load the module");
3348 if (get_modinfo_value(f, "kernel_version") == NULL)
3353 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
3354 /* Version correspondence? */
3356 k_version = get_kernel_version(k_strversion);
3357 if (m_has_modinfo) {
3358 m_version = new_get_module_version(f, m_strversion);
3360 m_version = old_get_module_version(f, m_strversion);
3361 if (m_version == -1) {
3362 error_msg("couldn't find the kernel version the module was "
3368 if (strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) {
3369 if (flag_force_load) {
3370 error_msg("Warning: kernel-module version mismatch\n"
3371 "\t%s was compiled for kernel version %s\n"
3372 "\twhile this kernel is version %s",
3373 m_filename, m_strversion, k_strversion);
3375 error_msg("kernel-module version mismatch\n"
3376 "\t%s was compiled for kernel version %s\n"
3377 "\twhile this kernel is version %s.",
3378 m_filename, m_strversion, k_strversion);
3383 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
3385 k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL);
3387 if (k_new_syscalls) {
3388 #ifdef BB_FEATURE_NEW_MODULE_INTERFACE
3389 if (!new_get_kernel_symbols())
3391 k_crcs = new_is_kernel_checksummed();
3393 error_msg("Not configured to support new kernels");
3397 #ifdef BB_FEATURE_OLD_MODULE_INTERFACE
3398 if (!old_get_kernel_symbols(m_name))
3400 k_crcs = old_is_kernel_checksummed();
3402 error_msg("Not configured to support old kernels");
3407 #ifdef BB_FEATURE_INSMOD_VERSION_CHECKING
3409 m_crcs = new_is_module_checksummed(f);
3411 m_crcs = old_is_module_checksummed(f);
3413 if (m_crcs != k_crcs)
3414 obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash);
3415 #endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */
3417 /* Let the module know about the kernel symbols. */
3418 add_kernel_symbols(f);
3420 /* Allocate common symbols, symbol tables, and string tables. */
3423 ? !new_create_this_module(f, m_name)
3424 : !old_create_mod_use_count(f))
3429 if (!obj_check_undefineds(f)) {
3432 obj_allocate_commons(f);
3434 /* done with the module name, on to the optional var=value arguments */
3437 if (optind < argc) {
3439 ? !new_process_module_arguments(f, argc - optind, argv + optind)
3440 : !old_process_module_arguments(f, argc - optind, argv + optind))
3447 hide_special_symbols(f);
3450 new_create_module_ksymtab(f);
3452 /* Find current size of the module */
3453 m_size = obj_load_size(f);
3456 m_addr = create_module(m_name, m_size);
3457 if (m_addr==-1) switch (errno) {
3459 error_msg("A module named %s already exists", m_name);
3462 error_msg("Can't allocate kernel memory for module; needed %lu bytes",
3466 perror_msg("create_module: %s", m_name);
3472 * the PROGBITS section was not loaded by the obj_load
3473 * now we can load them directly into the kernel memory
3475 // f->imagebase = (char*) m_addr;
3476 f->imagebase = (ElfW(Addr)) m_addr;
3477 if (!obj_load_progbits(fp, f)) {
3478 delete_module(m_name);
3483 if (!obj_relocate(f, m_addr)) {
3484 delete_module(m_name);
3489 ? !new_init_module(m_name, f, m_size)
3490 : !old_init_module(m_name, f, m_size))
3492 delete_module(m_name);
3496 exit_status = EXIT_SUCCESS;
3500 return(exit_status);