xref: /linux/scripts/mod/modpost.h (revision b39927cf4cc5a9123d2b157ffd396884cb8156eb)
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