Blame view

scripts/mod/modpost.h 4.65 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  #include <stdio.h>
  #include <stdlib.h>
  #include <stdarg.h>
  #include <string.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <sys/mman.h>
  #include <fcntl.h>
  #include <unistd.h>
  #include <elf.h>
  
  #include "elfconfig.h"
  
  #if KERNEL_ELFCLASS == ELFCLASS32
62070fa42   Sam Ravnborg   kbuild: kill trai...
15
16
  #define Elf_Ehdr    Elf32_Ehdr
  #define Elf_Shdr    Elf32_Shdr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  #define Elf_Sym     Elf32_Sym
b39927cf4   Sam Ravnborg   kbuild: check for...
18
  #define Elf_Addr    Elf32_Addr
9ad21c3f3   Sam Ravnborg   kbuild: try harde...
19
  #define Elf_Sword   Elf64_Sword
4f4c4ee1b   Sam Ravnborg   kbuild: Use Elfnn...
20
  #define Elf_Section Elf32_Half
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
  #define ELF_ST_BIND ELF32_ST_BIND
  #define ELF_ST_TYPE ELF32_ST_TYPE
2c1a51f39   Atsushi Nemoto   [PATCH] kbuild: c...
23
  #define Elf_Rel     Elf32_Rel
b39927cf4   Sam Ravnborg   kbuild: check for...
24
25
26
  #define Elf_Rela    Elf32_Rela
  #define ELF_R_SYM   ELF32_R_SYM
  #define ELF_R_TYPE  ELF32_R_TYPE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
  #else
62070fa42   Sam Ravnborg   kbuild: kill trai...
28
29
  #define Elf_Ehdr    Elf64_Ehdr
  #define Elf_Shdr    Elf64_Shdr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #define Elf_Sym     Elf64_Sym
b39927cf4   Sam Ravnborg   kbuild: check for...
31
  #define Elf_Addr    Elf64_Addr
9ad21c3f3   Sam Ravnborg   kbuild: try harde...
32
  #define Elf_Sword   Elf64_Sxword
4f4c4ee1b   Sam Ravnborg   kbuild: Use Elfnn...
33
  #define Elf_Section Elf64_Half
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
34
35
  #define ELF_ST_BIND ELF64_ST_BIND
  #define ELF_ST_TYPE ELF64_ST_TYPE
2c1a51f39   Atsushi Nemoto   [PATCH] kbuild: c...
36
  #define Elf_Rel     Elf64_Rel
b39927cf4   Sam Ravnborg   kbuild: check for...
37
38
39
  #define Elf_Rela    Elf64_Rela
  #define ELF_R_SYM   ELF64_R_SYM
  #define ELF_R_TYPE  ELF64_R_TYPE
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
  #endif
eae07ac60   Atsushi Nemoto   [PATCH] kbuild: f...
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  /* The 64-bit MIPS ELF ABI uses an unusual reloc format. */
  typedef struct
  {
  	Elf32_Word    r_sym;	/* Symbol index */
  	unsigned char r_ssym;	/* Special symbol for 2nd relocation */
  	unsigned char r_type3;	/* 3rd relocation type */
  	unsigned char r_type2;	/* 2nd relocation type */
  	unsigned char r_type1;	/* 1st relocation type */
  } _Elf64_Mips_R_Info;
  
  typedef union
  {
  	Elf64_Xword		r_info_number;
  	_Elf64_Mips_R_Info	r_info_fields;
  } _Elf64_Mips_R_Info_union;
  
  #define ELF64_MIPS_R_SYM(i) \
    ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
ae4ac1232   Atsushi Nemoto   kbuild: make bett...
59
60
  #define ELF64_MIPS_R_TYPE(i) \
    ((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
67
68
  #if KERNEL_ELFDATA != HOST_ELFDATA
  
  static inline void __endian(const void *src, void *dest, unsigned int size)
  {
  	unsigned int i;
  	for (i = 0; i < size; i++)
  		((unsigned char*)dest)[i] = ((unsigned char*)src)[size - i-1];
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  #define TO_NATIVE(x)						\
  ({								\
  	typeof(x) __x;						\
  	__endian(&(x), &(__x), sizeof(__x));			\
  	__x;							\
  })
  
  #else /* endianness matches */
  
  #define TO_NATIVE(x) (x)
  
  #endif
  
  #define NOFAIL(ptr)   do_nofail((ptr), #ptr)
  void *do_nofail(void *ptr, const char *expr);
  
  struct buffer {
  	char *p;
  	int pos;
  	int size;
  };
  
  void __attribute__((format(printf, 2, 3)))
  buf_printf(struct buffer *buf, const char *fmt, ...);
  
  void
  buf_write(struct buffer *buf, const char *s, int len);
  
  struct module {
  	struct module *next;
  	const char *name;
b817f6fef   Sam Ravnborg   kbuild: check lic...
100
  	int gpl_compatible;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  	struct symbol *unres;
  	int seen;
  	int skip;
  	int has_init;
  	int has_cleanup;
  	struct buffer dev_table_buf;
  	char	     srcversion[25];
  };
  
  struct elf_info {
  	unsigned long size;
  	Elf_Ehdr     *hdr;
  	Elf_Shdr     *sechdrs;
  	Elf_Sym      *symtab_start;
  	Elf_Sym      *symtab_stop;
bd5cbcedf   Ram Pai   kbuild: export-ty...
116
  	Elf_Section  export_sec;
c96fca213   Sam Ravnborg   kbuild: warn when...
117
  	Elf_Section  export_unused_sec;
bd5cbcedf   Ram Pai   kbuild: export-ty...
118
  	Elf_Section  export_gpl_sec;
c96fca213   Sam Ravnborg   kbuild: warn when...
119
  	Elf_Section  export_unused_gpl_sec;
bd5cbcedf   Ram Pai   kbuild: export-ty...
120
  	Elf_Section  export_gpl_future_sec;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
  	const char   *strtab;
  	char	     *modinfo;
  	unsigned int modinfo_len;
1ce53adf1   Denys Vlasenko   modpost: support ...
124
125
126
127
128
129
130
131
132
  
  	/* support for 32bit section numbers */
  
  	unsigned int num_sections; /* max_secindex + 1 */
  	unsigned int secindex_strings;
  	/* if Nth symbol table entry has .st_shndx = SHN_XINDEX,
  	 * take shndx from symtab_shndx_start[N] instead */
  	Elf32_Word   *symtab_shndx_start;
  	Elf32_Word   *symtab_shndx_stop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  };
1ce53adf1   Denys Vlasenko   modpost: support ...
134
135
136
137
  static inline int is_shndx_special(unsigned int i)
  {
  	return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE;
  }
6845756b2   Anders Kaseorg   modpost: Update 6...
138
139
140
141
  /*
   * Move reserved section indices SHN_LORESERVE..SHN_HIRESERVE out of
   * the way to -256..-1, to avoid conflicting with real section
   * indices.
1ce53adf1   Denys Vlasenko   modpost: support ...
142
   */
6845756b2   Anders Kaseorg   modpost: Update 6...
143
  #define SPECIAL(i) ((i) - (SHN_HIRESERVE + 1))
1ce53adf1   Denys Vlasenko   modpost: support ...
144
145
146
147
148
  
  /* Accessor for sym->st_shndx, hides ugliness of "64k sections" */
  static inline unsigned int get_secindex(const struct elf_info *info,
  					const Elf_Sym *sym)
  {
6845756b2   Anders Kaseorg   modpost: Update 6...
149
150
  	if (is_shndx_special(sym->st_shndx))
  		return SPECIAL(sym->st_shndx);
1ce53adf1   Denys Vlasenko   modpost: support ...
151
152
  	if (sym->st_shndx != SHN_XINDEX)
  		return sym->st_shndx;
6845756b2   Anders Kaseorg   modpost: Update 6...
153
  	return info->symtab_shndx_start[sym - info->symtab_start];
1ce53adf1   Denys Vlasenko   modpost: support ...
154
  }
cb80514d9   Sam Ravnborg   kbuild: use warn(...
155
  /* file2alias.c */
4ce6efed4   Sam Ravnborg   kbuild: soften mo...
156
  extern unsigned int cross_build;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
158
  void handle_moddevtable(struct module *mod, struct elf_info *info,
  			Elf_Sym *sym, const char *symname);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
  void add_moddevtable(struct buffer *buf, struct module *mod);
cb80514d9   Sam Ravnborg   kbuild: use warn(...
160
  /* sumversion.c */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
163
164
165
  void maybe_frob_rcs_version(const char *modfilename,
  			    char *version,
  			    void *modinfo,
  			    unsigned long modinfo_offset);
  void get_src_version(const char *modname, char sum[], unsigned sumlen);
cb80514d9   Sam Ravnborg   kbuild: use warn(...
166
  /* from modpost.c */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
  void *grab_file(const char *filename, unsigned long *size);
  char* get_next_line(unsigned long *pos, void *file, unsigned long size);
  void release_file(void *file, unsigned long size);
cb80514d9   Sam Ravnborg   kbuild: use warn(...
170
171
172
  
  void fatal(const char *fmt, ...);
  void warn(const char *fmt, ...);
2a1166594   Matthew Wilcox   kbuild: distingui...
173
  void merror(const char *fmt, ...);