• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Abstract description of component ELF types.
2    Copyright (C) 1998, 1999, 2000, 2002, 2004 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 1998.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation, version 2.
8 
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13 
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software Foundation,
16    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17 
18 /* ELF header.  */
19 #define Ehdr(Bits, Ext) \
20 START (Bits, Ehdr, Ext##Ehdr)						      \
21   TYPE_EXTRA (unsigned char e_ident[EI_NIDENT];)			      \
22   TYPE_XLATE (memmove (tdest->e_ident, tsrc->e_ident, EI_NIDENT);)	      \
23   TYPE_NAME (ElfW2(Bits, Ext##Half), e_type)				      \
24   TYPE_NAME (ElfW2(Bits, Ext##Half), e_machine)				      \
25   TYPE_NAME (ElfW2(Bits, Ext##Word), e_version)				      \
26   TYPE_NAME (ElfW2(Bits, Ext##Addr), e_entry)				      \
27   TYPE_NAME (ElfW2(Bits, Ext##Off), e_phoff)				      \
28   TYPE_NAME (ElfW2(Bits, Ext##Off), e_shoff)				      \
29   TYPE_NAME (ElfW2(Bits, Ext##Word), e_flags)				      \
30   TYPE_NAME (ElfW2(Bits, Ext##Half), e_ehsize)				      \
31   TYPE_NAME (ElfW2(Bits, Ext##Half), e_phentsize)			      \
32   TYPE_NAME (ElfW2(Bits, Ext##Half), e_phnum)				      \
33   TYPE_NAME (ElfW2(Bits, Ext##Half), e_shentsize)			      \
34   TYPE_NAME (ElfW2(Bits, Ext##Half), e_shnum)				      \
35   TYPE_NAME (ElfW2(Bits, Ext##Half), e_shstrndx)			      \
36 END (Bits, Ext##Ehdr)
37 
38 #define Ehdr32(Ext) \
39   Ehdr(32, Ext)
40 #define Ehdr64(Ext) \
41   Ehdr(64, Ext)
42 
43 
44 /* Program header.  */
45 #define Phdr32(Ext) \
46 START (32, Phdr, Ext##Phdr)						      \
47   TYPE_NAME (ElfW2(32, Ext##Word), p_type)				      \
48   TYPE_NAME (ElfW2(32, Ext##Off), p_offset)				      \
49   TYPE_NAME (ElfW2(32, Ext##Addr), p_vaddr)				      \
50   TYPE_NAME (ElfW2(32, Ext##Addr), p_paddr)				      \
51   TYPE_NAME (ElfW2(32, Ext##Word), p_filesz)				      \
52   TYPE_NAME (ElfW2(32, Ext##Word), p_memsz)				      \
53   TYPE_NAME (ElfW2(32, Ext##Word), p_flags)				      \
54   TYPE_NAME (ElfW2(32, Ext##Word), p_align)				      \
55 END (32, Ext##Phdr)
56 #define Phdr64(Ext) \
57 START (64, Phdr, Ext##Phdr)						      \
58   TYPE_NAME (ElfW2(64, Ext##Word), p_type)				      \
59   TYPE_NAME (ElfW2(64, Ext##Word), p_flags)				      \
60   TYPE_NAME (ElfW2(64, Ext##Off), p_offset)				      \
61   TYPE_NAME (ElfW2(64, Ext##Addr), p_vaddr)				      \
62   TYPE_NAME (ElfW2(64, Ext##Addr), p_paddr)				      \
63   TYPE_NAME (ElfW2(64, Ext##Xword), p_filesz)				      \
64   TYPE_NAME (ElfW2(64, Ext##Xword), p_memsz)				      \
65   TYPE_NAME (ElfW2(64, Ext##Xword), p_align)				      \
66 END (64, Ext##Phdr)
67 
68 
69 /* Section header.  */
70 #define Shdr32(Ext) \
71 START (32, Shdr, Ext##Shdr)						      \
72   TYPE_NAME (ElfW2(32, Ext##Word), sh_name)				      \
73   TYPE_NAME (ElfW2(32, Ext##Word), sh_type)				      \
74   TYPE_NAME (ElfW2(32, Ext##Word), sh_flags)				      \
75   TYPE_NAME (ElfW2(32, Ext##Addr), sh_addr)				      \
76   TYPE_NAME (ElfW2(32, Ext##Off), sh_offset)				      \
77   TYPE_NAME (ElfW2(32, Ext##Word), sh_size)				      \
78   TYPE_NAME (ElfW2(32, Ext##Word), sh_link)				      \
79   TYPE_NAME (ElfW2(32, Ext##Word), sh_info)				      \
80   TYPE_NAME (ElfW2(32, Ext##Word), sh_addralign)			      \
81   TYPE_NAME (ElfW2(32, Ext##Word), sh_entsize)				      \
82 END (32, Ext##Shdr)
83 #define Shdr64(Ext) \
84 START (64, Shdr, Ext##Shdr)						      \
85   TYPE_NAME (ElfW2(64, Ext##Word), sh_name)				      \
86   TYPE_NAME (ElfW2(64, Ext##Word), sh_type)				      \
87   TYPE_NAME (ElfW2(64, Ext##Xword), sh_flags)				      \
88   TYPE_NAME (ElfW2(64, Ext##Addr), sh_addr)				      \
89   TYPE_NAME (ElfW2(64, Ext##Off), sh_offset)				      \
90   TYPE_NAME (ElfW2(64, Ext##Xword), sh_size)				      \
91   TYPE_NAME (ElfW2(64, Ext##Word), sh_link)				      \
92   TYPE_NAME (ElfW2(64, Ext##Word), sh_info)				      \
93   TYPE_NAME (ElfW2(64, Ext##Xword), sh_addralign)			      \
94   TYPE_NAME (ElfW2(64, Ext##Xword), sh_entsize)				      \
95 END (64, Ext##Shdr)
96 
97 
98 /* Symbol table.  */
99 #define Sym32(Ext) \
100 START (32, Sym, Ext##Sym)						      \
101   TYPE_NAME (ElfW2(32, Ext##Word), st_name)				      \
102   TYPE_NAME (ElfW2(32, Ext##Addr), st_value)				      \
103   TYPE_NAME (ElfW2(32, Ext##Word), st_size)				      \
104   TYPE_EXTRA (unsigned char st_info;)					      \
105   TYPE_XLATE (tdest->st_info = tsrc->st_info;)				      \
106   TYPE_EXTRA (unsigned char st_other;)					      \
107   TYPE_XLATE (tdest->st_other = tsrc->st_other;)			      \
108   TYPE_NAME (ElfW2(32, Ext##Half), st_shndx)				      \
109 END (32, Ext##Sym)
110 #define Sym64(Ext) \
111 START (64, Sym, Ext##Sym)						      \
112   TYPE_NAME (ElfW2(64, Ext##Word), st_name)				      \
113   TYPE_EXTRA (unsigned char st_info;)					      \
114   TYPE_XLATE (tdest->st_info = tsrc->st_info;)				      \
115   TYPE_EXTRA (unsigned char st_other;)					      \
116   TYPE_XLATE (tdest->st_other = tsrc->st_other;)			      \
117   TYPE_NAME (ElfW2(64, Ext##Half), st_shndx)				      \
118   TYPE_NAME (ElfW2(64, Ext##Addr), st_value)				      \
119   TYPE_NAME (ElfW2(64, Ext##Xword), st_size)				      \
120 END (64, Ext##Sym)
121 
122 
123 /* Relocation.  */
124 #define Rel32(Ext) \
125 START (32, Rel, Ext##Rel)						      \
126   TYPE_NAME (ElfW2(32, Ext##Addr), r_offset)				      \
127   TYPE_NAME (ElfW2(32, Ext##Word), r_info)				      \
128 END (32, Ext##Rel)
129 #define Rel64(Ext) \
130 START (64, Rel, Ext##Rel)						      \
131   TYPE_NAME (ElfW2(64, Ext##Addr), r_offset)				      \
132   TYPE_NAME (ElfW2(64, Ext##Xword), r_info)				      \
133 END (64, Ext##Rel)
134 
135 #define Rela32(Ext) \
136 START (32, Rela, Ext##Rela)						      \
137   TYPE_NAME (ElfW2(32, Ext##Addr), r_offset)				      \
138   TYPE_NAME (ElfW2(32, Ext##Word), r_info)				      \
139   TYPE_NAME (ElfW2(32, Ext##Sword), r_addend)				      \
140 END (32, Ext##Rela)
141 #define Rela64(Ext) \
142 START (64, Rela, Ext##Rela)						      \
143   TYPE_NAME (ElfW2(64, Ext##Addr), r_offset)				      \
144   TYPE_NAME (ElfW2(64, Ext##Xword), r_info)				      \
145   TYPE_NAME (ElfW2(64, Ext##Sxword), r_addend)				      \
146 END (64, Ext##Rela)
147 
148 
149 /* Note entry header.  */
150 #define Note(Bits, Ext) \
151 START (Bits, Nhdr, Ext##Nhdr)						      \
152   TYPE_NAME (ElfW2(Bits, Ext##Word), n_namesz)				      \
153   TYPE_NAME (ElfW2(Bits, Ext##Word), n_descsz)				      \
154   TYPE_NAME (ElfW2(Bits, Ext##Word), n_type)				      \
155 END (Bits, Ext##Nhdr)
156 
157 #define Note32(Ext) \
158   Note (32, Ext)
159 #define Note64(Ext) \
160   Note (64, Ext)
161 
162 
163 /* Dynamic section data.  */
164 #define Dyn32(Ext) \
165 START (32, Dyn, Ext##Dyn)						      \
166   TYPE_NAME (ElfW2(32, Ext##Sword), d_tag)				      \
167   TYPE_EXTRA (union {)							      \
168   TYPE_EXTRA (ElfW2(32, Ext##Word) d_val;)				      \
169   TYPE_EXTRA (ElfW2(32, Ext##Addr) d_ptr;)				      \
170   TYPE_XLATE (Elf32_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);)	      \
171   TYPE_EXTRA (ElfW2(32, Ext##Off) d_off;)				      \
172   TYPE_EXTRA (} d_un;)							      \
173 END (32, Ext##Dyn)
174 #define Dyn64(Ext) \
175 START (64, Dyn, Ext##Dyn)						      \
176   TYPE_NAME (ElfW2(64, Ext##Xword), d_tag)				      \
177   TYPE_EXTRA (union {)							      \
178   TYPE_EXTRA (ElfW2(64, Ext##Xword) d_val;)				      \
179   TYPE_EXTRA (ElfW2(64, Ext##Addr) d_ptr;)				      \
180   TYPE_XLATE (Elf64_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);)	      \
181   TYPE_EXTRA (} d_un;)							      \
182 END (64, Ext##Dyn)
183 
184 
185 #ifndef GENERATE_CONVERSION
186 /* Version definitions.  */
187 # define Verdef(Bits, Ext) \
188 START (Bits, Verdef, Ext##Verdef)					      \
189   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_version)			      \
190   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_flags)				      \
191   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_ndx)				      \
192   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_cnt)				      \
193   TYPE_NAME (ElfW2(Bits, Ext##Word), vd_hash)				      \
194   TYPE_NAME (ElfW2(Bits, Ext##Word), vd_aux)				      \
195   TYPE_NAME (ElfW2(Bits, Ext##Word), vd_next)				      \
196 END (Bits, Ext##Verdef)
197 
198 # define Verdef32(Ext) \
199   Verdef (32, Ext)
200 # define Verdef64(Ext) \
201   Verdef (64, Ext)
202 
203 # define Verdaux(Bits, Ext) \
204 START (Bits, Verdaux, Ext##Verdaux)					      \
205   TYPE_NAME (ElfW2(Bits, Ext##Word), vda_name)				      \
206   TYPE_NAME (ElfW2(Bits, Ext##Word), vda_next)				      \
207 END (Bits, Ext##Verdaux)
208 
209 # define Verdaux32(Ext) \
210   Verdaux (32, Ext)
211 # define Verdaux64(Ext) \
212   Verdaux (64, Ext)
213 
214 /* Required versions.  */
215 # define Verneed(Bits, Ext) \
216 START (Bits, Verneed, Ext##Verneed)					      \
217   TYPE_NAME (ElfW2(Bits, Ext##Half), vn_version)			      \
218   TYPE_NAME (ElfW2(Bits, Ext##Half), vn_cnt)				      \
219   TYPE_NAME (ElfW2(Bits, Ext##Word), vn_file)				      \
220   TYPE_NAME (ElfW2(Bits, Ext##Word), vn_aux)				      \
221   TYPE_NAME (ElfW2(Bits, Ext##Word), vn_next)				      \
222 END (Bits, Ext##Verneed)
223 
224 # define Verneed32(Ext) \
225   Verneed (32, Ext)
226 # define Verneed64(Ext) \
227   Verneed (64, Ext)
228 
229 # define Vernaux(Bits, Ext) \
230 START (Bits, Vernaux, Ext##Vernaux)					      \
231   TYPE_NAME (ElfW2(Bits, Ext##Word), vna_hash)				      \
232   TYPE_NAME (ElfW2(Bits, Ext##Half), vna_flags)				      \
233   TYPE_NAME (ElfW2(Bits, Ext##Half), vna_other)				      \
234   TYPE_NAME (ElfW2(Bits, Ext##Word), vna_name)				      \
235   TYPE_NAME (ElfW2(Bits, Ext##Word), vna_next)				      \
236 END (Bits, Ext##Vernaux)
237 
238 # define Vernaux32(Ext) \
239   Vernaux (32, Ext)
240 # define Vernaux64(Ext) \
241   Vernaux (64, Ext)
242 #endif
243 
244 /* Symbol information.  */
245 #define Syminfo(Bits, Ext) \
246 START (Bits, Syminfo, Ext##Syminfo)					      \
247   TYPE_NAME (ElfW2(Bits, Ext##Half), si_boundto)			      \
248   TYPE_NAME (ElfW2(Bits, Ext##Half), si_flags)				      \
249 END (Bits, Ext##Syminfo)
250 
251 #define Syminfo32(Ext) \
252   Syminfo (32, Ext)
253 #define Syminfo64(Ext) \
254   Syminfo (64, Ext)
255 
256 /* Move information.  */
257 #define Move(Bits, Ext) \
258 START (Bits, Move, Ext##Move)						      \
259   TYPE_NAME (ElfW2(Bits, Ext##Xword), m_value)				      \
260   TYPE_NAME (ElfW2(Bits, Ext##Xword), m_info)				      \
261   TYPE_NAME (ElfW2(Bits, Ext##Xword), m_poffset)			      \
262   TYPE_NAME (ElfW2(Bits, Ext##Half), m_repeat)				      \
263   TYPE_NAME (ElfW2(Bits, Ext##Half), m_stride)				      \
264 END (Bits, Ext##Move)
265 
266 #define Move32(Ext) \
267   Move (32, Ext)
268 #define Move64(Ext) \
269   Move (64, Ext)
270 
271 #define Lib(Bits, Ext) \
272 START (Bits, Lib, Ext##Lib)						      \
273   TYPE_NAME (ElfW2(Bits, Ext##Word), l_name)				      \
274   TYPE_NAME (ElfW2(Bits, Ext##Word), l_time_stamp)			      \
275   TYPE_NAME (ElfW2(Bits, Ext##Word), l_checksum)			      \
276   TYPE_NAME (ElfW2(Bits, Ext##Word), l_version)				      \
277   TYPE_NAME (ElfW2(Bits, Ext##Word), l_flags)				      \
278 END (Bits, Ext##Lib)
279 
280 #define Lib32(Ext) \
281   Lib (32, Ext)
282 #define Lib64(Ext) \
283   Lib (64, Ext)
284