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