11da177e4SLinus Torvalds #include <stdio.h> 21da177e4SLinus Torvalds #include <stdlib.h> 31da177e4SLinus Torvalds #include <stdarg.h> 41da177e4SLinus Torvalds #include <string.h> 51da177e4SLinus Torvalds #include <sys/types.h> 61da177e4SLinus Torvalds #include <sys/stat.h> 71da177e4SLinus Torvalds #include <sys/mman.h> 81da177e4SLinus Torvalds #include <fcntl.h> 91da177e4SLinus Torvalds #include <unistd.h> 101da177e4SLinus Torvalds #include <elf.h> 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include "elfconfig.h" 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds #if KERNEL_ELFCLASS == ELFCLASS32 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #define Elf_Ehdr Elf32_Ehdr 171da177e4SLinus Torvalds #define Elf_Shdr Elf32_Shdr 181da177e4SLinus Torvalds #define Elf_Sym Elf32_Sym 19*b39927cfSSam Ravnborg #define Elf_Addr Elf32_Addr 20*b39927cfSSam Ravnborg #define Elf_Section Elf32_Section 211da177e4SLinus Torvalds #define ELF_ST_BIND ELF32_ST_BIND 221da177e4SLinus Torvalds #define ELF_ST_TYPE ELF32_ST_TYPE 231da177e4SLinus Torvalds 24*b39927cfSSam Ravnborg #define Elf_Rela Elf32_Rela 25*b39927cfSSam Ravnborg #define ELF_R_SYM ELF32_R_SYM 26*b39927cfSSam Ravnborg #define ELF_R_TYPE ELF32_R_TYPE 271da177e4SLinus Torvalds #else 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds #define Elf_Ehdr Elf64_Ehdr 301da177e4SLinus Torvalds #define Elf_Shdr Elf64_Shdr 311da177e4SLinus Torvalds #define Elf_Sym Elf64_Sym 32*b39927cfSSam Ravnborg #define Elf_Addr Elf64_Addr 33*b39927cfSSam Ravnborg #define Elf_Section Elf64_Section 341da177e4SLinus Torvalds #define ELF_ST_BIND ELF64_ST_BIND 351da177e4SLinus Torvalds #define ELF_ST_TYPE ELF64_ST_TYPE 361da177e4SLinus Torvalds 37*b39927cfSSam Ravnborg #define Elf_Rela Elf64_Rela 38*b39927cfSSam Ravnborg #define ELF_R_SYM ELF64_R_SYM 39*b39927cfSSam Ravnborg #define ELF_R_TYPE ELF64_R_TYPE 401da177e4SLinus Torvalds #endif 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds #if KERNEL_ELFDATA != HOST_ELFDATA 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds static inline void __endian(const void *src, void *dest, unsigned int size) 451da177e4SLinus Torvalds { 461da177e4SLinus Torvalds unsigned int i; 471da177e4SLinus Torvalds for (i = 0; i < size; i++) 481da177e4SLinus Torvalds ((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1]; 491da177e4SLinus Torvalds } 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds 531da177e4SLinus Torvalds #define TO_NATIVE(x) \ 541da177e4SLinus Torvalds ({ \ 551da177e4SLinus Torvalds typeof(x) __x; \ 561da177e4SLinus Torvalds __endian(&(x), &(__x), sizeof(__x)); \ 571da177e4SLinus Torvalds __x; \ 581da177e4SLinus Torvalds }) 591da177e4SLinus Torvalds 601da177e4SLinus Torvalds #else /* endianness matches */ 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds #define TO_NATIVE(x) (x) 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds #endif 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds #define NOFAIL(ptr) do_nofail((ptr), #ptr) 671da177e4SLinus Torvalds void *do_nofail(void *ptr, const char *expr); 681da177e4SLinus Torvalds 691da177e4SLinus Torvalds struct buffer { 701da177e4SLinus Torvalds char *p; 711da177e4SLinus Torvalds int pos; 721da177e4SLinus Torvalds int size; 731da177e4SLinus Torvalds }; 741da177e4SLinus Torvalds 751da177e4SLinus Torvalds void __attribute__((format(printf, 2, 3))) 761da177e4SLinus Torvalds buf_printf(struct buffer *buf, const char *fmt, ...); 771da177e4SLinus Torvalds 781da177e4SLinus Torvalds void 791da177e4SLinus Torvalds buf_write(struct buffer *buf, const char *s, int len); 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds struct module { 821da177e4SLinus Torvalds struct module *next; 831da177e4SLinus Torvalds const char *name; 841da177e4SLinus Torvalds struct symbol *unres; 851da177e4SLinus Torvalds int seen; 861da177e4SLinus Torvalds int skip; 871da177e4SLinus Torvalds int has_init; 881da177e4SLinus Torvalds int has_cleanup; 891da177e4SLinus Torvalds struct buffer dev_table_buf; 901da177e4SLinus Torvalds char srcversion[25]; 911da177e4SLinus Torvalds }; 921da177e4SLinus Torvalds 931da177e4SLinus Torvalds struct elf_info { 941da177e4SLinus Torvalds unsigned long size; 951da177e4SLinus Torvalds Elf_Ehdr *hdr; 961da177e4SLinus Torvalds Elf_Shdr *sechdrs; 971da177e4SLinus Torvalds Elf_Sym *symtab_start; 981da177e4SLinus Torvalds Elf_Sym *symtab_stop; 991da177e4SLinus Torvalds const char *strtab; 1001da177e4SLinus Torvalds char *modinfo; 1011da177e4SLinus Torvalds unsigned int modinfo_len; 1021da177e4SLinus Torvalds }; 1031da177e4SLinus Torvalds 104cb80514dSSam Ravnborg /* file2alias.c */ 1051da177e4SLinus Torvalds void handle_moddevtable(struct module *mod, struct elf_info *info, 1061da177e4SLinus Torvalds Elf_Sym *sym, const char *symname); 1071da177e4SLinus Torvalds void add_moddevtable(struct buffer *buf, struct module *mod); 1081da177e4SLinus Torvalds 109cb80514dSSam Ravnborg /* sumversion.c */ 1101da177e4SLinus Torvalds void maybe_frob_rcs_version(const char *modfilename, 1111da177e4SLinus Torvalds char *version, 1121da177e4SLinus Torvalds void *modinfo, 1131da177e4SLinus Torvalds unsigned long modinfo_offset); 1141da177e4SLinus Torvalds void get_src_version(const char *modname, char sum[], unsigned sumlen); 1151da177e4SLinus Torvalds 116cb80514dSSam Ravnborg /* from modpost.c */ 1171da177e4SLinus Torvalds void *grab_file(const char *filename, unsigned long *size); 1181da177e4SLinus Torvalds char* get_next_line(unsigned long *pos, void *file, unsigned long size); 1191da177e4SLinus Torvalds void release_file(void *file, unsigned long size); 120cb80514dSSam Ravnborg 121cb80514dSSam Ravnborg void fatal(const char *fmt, ...); 122cb80514dSSam Ravnborg void warn(const char *fmt, ...); 123