rs6000.h revision 1.5 1 1.1 christos /* IBM RS/6000 "XCOFF" file definitions for BFD.
2 1.5 christos Copyright (C) 1990-2016 Free Software Foundation, Inc.
3 1.1 christos Written by Mimi Phuong-Thao Vo of IBM
4 1.1 christos and John Gilmore of Cygnus Support.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program; if not, write to the Free Software
18 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 1.1 christos MA 02110-1301, USA. */
20 1.1 christos
21 1.1 christos /********************** FILE HEADER **********************/
22 1.1 christos
23 1.1 christos struct external_filehdr {
24 1.1 christos char f_magic[2]; /* magic number */
25 1.1 christos char f_nscns[2]; /* number of sections */
26 1.1 christos char f_timdat[4]; /* time & date stamp */
27 1.1 christos char f_symptr[4]; /* file pointer to symtab */
28 1.1 christos char f_nsyms[4]; /* number of symtab entries */
29 1.1 christos char f_opthdr[2]; /* sizeof(optional hdr) */
30 1.1 christos char f_flags[2]; /* flags */
31 1.1 christos };
32 1.1 christos
33 1.1 christos /* IBM RS/6000 */
34 1.1 christos #define U802WRMAGIC 0730 /* writeable text segments **chh** */
35 1.1 christos #define U802ROMAGIC 0735 /* readonly sharable text segments */
36 1.1 christos #define U802TOCMAGIC 0737 /* readonly text segments and TOC */
37 1.1 christos
38 1.1 christos #define BADMAG(x) \
39 1.1 christos ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
40 1.1 christos (x).f_magic != U802TOCMAGIC)
41 1.1 christos
42 1.1 christos #define FILHDR struct external_filehdr
43 1.1 christos #define FILHSZ 20
44 1.1 christos
45 1.1 christos
46 1.1 christos /********************** AOUT "OPTIONAL HEADER" **********************/
47 1.1 christos
48 1.1 christos
49 1.3 christos typedef struct
50 1.1 christos {
51 1.1 christos unsigned char magic[2]; /* type of file */
52 1.1 christos unsigned char vstamp[2]; /* version stamp */
53 1.1 christos unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */
54 1.1 christos unsigned char dsize[4]; /* initialized data " " */
55 1.1 christos unsigned char bsize[4]; /* uninitialized data " " */
56 1.1 christos unsigned char entry[4]; /* entry pt. */
57 1.1 christos unsigned char text_start[4]; /* base of text used for this file */
58 1.1 christos unsigned char data_start[4]; /* base of data used for this file */
59 1.1 christos unsigned char o_toc[4]; /* address of TOC */
60 1.1 christos unsigned char o_snentry[2]; /* section number of entry point */
61 1.1 christos unsigned char o_sntext[2]; /* section number of .text section */
62 1.1 christos unsigned char o_sndata[2]; /* section number of .data section */
63 1.1 christos unsigned char o_sntoc[2]; /* section number of TOC */
64 1.1 christos unsigned char o_snloader[2]; /* section number of .loader section */
65 1.1 christos unsigned char o_snbss[2]; /* section number of .bss section */
66 1.1 christos unsigned char o_algntext[2]; /* .text alignment */
67 1.1 christos unsigned char o_algndata[2]; /* .data alignment */
68 1.1 christos unsigned char o_modtype[2]; /* module type (??) */
69 1.1 christos unsigned char o_cputype[2]; /* cpu type */
70 1.1 christos unsigned char o_maxstack[4]; /* max stack size (??) */
71 1.1 christos unsigned char o_maxdata[4]; /* max data size (??) */
72 1.1 christos unsigned char o_resv2[12]; /* reserved */
73 1.1 christos }
74 1.1 christos AOUTHDR;
75 1.1 christos
76 1.1 christos #define AOUTSZ 72
77 1.1 christos #define SMALL_AOUTSZ (28)
78 1.1 christos #define AOUTHDRSZ 72
79 1.1 christos
80 1.1 christos /********************** SECTION HEADER **********************/
81 1.1 christos
82 1.1 christos
83 1.1 christos struct external_scnhdr {
84 1.1 christos char s_name[8]; /* section name */
85 1.1 christos char s_paddr[4]; /* physical address, aliased s_nlib */
86 1.1 christos char s_vaddr[4]; /* virtual address */
87 1.1 christos char s_size[4]; /* section size */
88 1.1 christos char s_scnptr[4]; /* file ptr to raw data for section */
89 1.1 christos char s_relptr[4]; /* file ptr to relocation */
90 1.1 christos char s_lnnoptr[4]; /* file ptr to line numbers */
91 1.1 christos char s_nreloc[2]; /* number of relocation entries */
92 1.1 christos char s_nlnno[2]; /* number of line number entries*/
93 1.1 christos char s_flags[4]; /* flags */
94 1.1 christos };
95 1.1 christos
96 1.1 christos #define SCNHDR struct external_scnhdr
97 1.1 christos #define SCNHSZ 40
98 1.1 christos
99 1.1 christos /********************** LINE NUMBERS **********************/
100 1.1 christos
101 1.1 christos /* 1 line number entry for every "breakpointable" source line in a section.
102 1.1 christos * Line numbers are grouped on a per function basis; first entry in a function
103 1.1 christos * grouping will have l_lnno = 0 and in place of physical address will be the
104 1.1 christos * symbol table index of the function name.
105 1.1 christos */
106 1.1 christos struct external_lineno {
107 1.1 christos union {
108 1.1 christos char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/
109 1.1 christos char l_paddr[4]; /* (physical) address of line number */
110 1.1 christos } l_addr;
111 1.1 christos char l_lnno[2]; /* line number */
112 1.1 christos };
113 1.1 christos
114 1.1 christos
115 1.1 christos #define LINENO struct external_lineno
116 1.1 christos #define LINESZ 6
117 1.1 christos
118 1.1 christos
119 1.1 christos /********************** SYMBOLS **********************/
120 1.1 christos
121 1.1 christos #define E_SYMNMLEN 8 /* # characters in a symbol name */
122 1.1 christos #define E_FILNMLEN 14 /* # characters in a file name */
123 1.1 christos #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
124 1.1 christos
125 1.1 christos struct external_syment
126 1.1 christos {
127 1.1 christos union {
128 1.1 christos char e_name[E_SYMNMLEN];
129 1.1 christos struct {
130 1.1 christos char e_zeroes[4];
131 1.1 christos char e_offset[4];
132 1.1 christos } e;
133 1.1 christos } e;
134 1.1 christos char e_value[4];
135 1.1 christos char e_scnum[2];
136 1.1 christos char e_type[2];
137 1.1 christos char e_sclass[1];
138 1.1 christos char e_numaux[1];
139 1.1 christos };
140 1.1 christos
141 1.1 christos
142 1.1 christos
143 1.1 christos #define N_BTMASK (017)
144 1.1 christos #define N_TMASK (060)
145 1.1 christos #define N_BTSHFT (4)
146 1.1 christos #define N_TSHIFT (2)
147 1.1 christos
148 1.1 christos
149 1.1 christos union external_auxent {
150 1.1 christos struct {
151 1.1 christos char x_tagndx[4]; /* str, un, or enum tag indx */
152 1.1 christos union {
153 1.1 christos struct {
154 1.1 christos char x_lnno[2]; /* declaration line number */
155 1.1 christos char x_size[2]; /* str/union/array size */
156 1.1 christos } x_lnsz;
157 1.1 christos char x_fsize[4]; /* size of function */
158 1.1 christos } x_misc;
159 1.1 christos union {
160 1.1 christos struct { /* if ISFCN, tag, or .bb */
161 1.1 christos char x_lnnoptr[4]; /* ptr to fcn line # */
162 1.1 christos char x_endndx[4]; /* entry ndx past block end */
163 1.1 christos } x_fcn;
164 1.1 christos struct { /* if ISARY, up to 4 dimen. */
165 1.1 christos char x_dimen[E_DIMNUM][2];
166 1.1 christos } x_ary;
167 1.1 christos } x_fcnary;
168 1.1 christos char x_tvndx[2]; /* tv index */
169 1.1 christos } x_sym;
170 1.1 christos
171 1.1 christos struct {
172 1.1 christos union {
173 1.1 christos char x_fname[E_FILNMLEN];
174 1.1 christos struct {
175 1.1 christos char x_zeroes[4];
176 1.1 christos char x_offset[4];
177 1.1 christos } x_n;
178 1.1 christos } x_n;
179 1.1 christos char x_ftype[1];
180 1.1 christos } x_file;
181 1.1 christos
182 1.1 christos struct {
183 1.1 christos char x_scnlen[4]; /* section length */
184 1.1 christos char x_nreloc[2]; /* # relocation entries */
185 1.1 christos char x_nlinno[2]; /* # line numbers */
186 1.1 christos } x_scn;
187 1.1 christos
188 1.1 christos struct {
189 1.1 christos char x_tvfill[4]; /* tv fill value */
190 1.1 christos char x_tvlen[2]; /* length of .tv */
191 1.1 christos char x_tvran[2][2]; /* tv range */
192 1.1 christos } x_tv; /* info about .tv section (in auxent of symbol .tv)) */
193 1.1 christos
194 1.1 christos struct {
195 1.1 christos unsigned char x_scnlen[4];
196 1.1 christos unsigned char x_parmhash[4];
197 1.1 christos unsigned char x_snhash[2];
198 1.1 christos unsigned char x_smtyp[1];
199 1.1 christos unsigned char x_smclas[1];
200 1.1 christos unsigned char x_stab[4];
201 1.1 christos unsigned char x_snstab[2];
202 1.1 christos } x_csect;
203 1.1 christos
204 1.1 christos };
205 1.1 christos
206 1.1 christos #define SYMENT struct external_syment
207 1.3 christos #define SYMESZ 18
208 1.1 christos #define AUXENT union external_auxent
209 1.1 christos #define AUXESZ 18
210 1.1 christos #define DBXMASK 0x80 /* for dbx storage mask */
211 1.1 christos #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
212 1.1 christos
213 1.1 christos
214 1.1 christos
215 1.1 christos /********************** RELOCATION DIRECTIVES **********************/
216 1.1 christos
217 1.1 christos
218 1.1 christos struct external_reloc {
219 1.1 christos char r_vaddr[4];
220 1.1 christos char r_symndx[4];
221 1.1 christos char r_size[1];
222 1.1 christos char r_type[1];
223 1.1 christos };
224 1.1 christos
225 1.1 christos
226 1.1 christos #define RELOC struct external_reloc
227 1.1 christos #define RELSZ 10
228 1.1 christos
229 1.1 christos #define DEFAULT_DATA_SECTION_ALIGNMENT 4
230 1.1 christos #define DEFAULT_BSS_SECTION_ALIGNMENT 4
231 1.1 christos #define DEFAULT_TEXT_SECTION_ALIGNMENT 4
232 1.1 christos /* For new sections we havn't heard of before */
233 1.1 christos #define DEFAULT_SECTION_ALIGNMENT 4
234 1.1 christos
235 1.1 christos /* The ldhdr structure. This appears at the start of the .loader
236 1.1 christos section. */
237 1.1 christos
238 1.1 christos struct external_ldhdr
239 1.1 christos {
240 1.1 christos bfd_byte l_version[4];
241 1.1 christos bfd_byte l_nsyms[4];
242 1.1 christos bfd_byte l_nreloc[4];
243 1.1 christos bfd_byte l_istlen[4];
244 1.1 christos bfd_byte l_nimpid[4];
245 1.1 christos bfd_byte l_impoff[4];
246 1.1 christos bfd_byte l_stlen[4];
247 1.1 christos bfd_byte l_stoff[4];
248 1.1 christos };
249 1.1 christos
250 1.1 christos #define LDHDRSZ (8 * 4)
251 1.1 christos
252 1.1 christos struct external_ldsym
253 1.1 christos {
254 1.1 christos union
255 1.1 christos {
256 1.1 christos bfd_byte _l_name[E_SYMNMLEN];
257 1.1 christos struct
258 1.1 christos {
259 1.1 christos bfd_byte _l_zeroes[4];
260 1.1 christos bfd_byte _l_offset[4];
261 1.1 christos } _l_l;
262 1.1 christos } _l;
263 1.1 christos bfd_byte l_value[4];
264 1.1 christos bfd_byte l_scnum[2];
265 1.1 christos bfd_byte l_smtype[1];
266 1.1 christos bfd_byte l_smclas[1];
267 1.1 christos bfd_byte l_ifile[4];
268 1.1 christos bfd_byte l_parm[4];
269 1.1 christos };
270 1.1 christos
271 1.1 christos #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
272 1.1 christos
273 1.1 christos struct external_ldrel
274 1.1 christos {
275 1.1 christos bfd_byte l_vaddr[4];
276 1.1 christos bfd_byte l_symndx[4];
277 1.1 christos bfd_byte l_rtype[2];
278 1.1 christos bfd_byte l_rsecnm[2];
279 1.1 christos };
280 1.1 christos
281 1.1 christos #define LDRELSZ (2 * 4 + 2 * 2)
282 1.1 christos
283 1.1 christos struct external_exceptab
284 1.1 christos {
285 1.1 christos union {
286 1.1 christos bfd_byte e_symndx[4];
287 1.1 christos bfd_byte e_paddr[4];
288 1.1 christos } e_addr;
289 1.1 christos bfd_byte e_lang[1];
290 1.1 christos bfd_byte e_reason[1];
291 1.1 christos };
292 1.1 christos
293 1.1 christos #define EXCEPTSZ (4 + 2)
294 1.3 christos
295 1.3 christos /******************** Core files *************************/
296 1.3 christos
297 1.3 christos struct external_core_dumpx
298 1.3 christos {
299 1.3 christos unsigned char c_signo[1];
300 1.3 christos unsigned char c_flag[1];
301 1.3 christos unsigned char c_entries[2];
302 1.3 christos
303 1.3 christos unsigned char c_version[4];
304 1.3 christos
305 1.3 christos unsigned char c_fdsinfox[8];
306 1.3 christos unsigned char c_loader[8];
307 1.3 christos unsigned char c_lsize[8];
308 1.3 christos
309 1.3 christos unsigned char c_n_thr[4];
310 1.3 christos unsigned char c_reserved0[4];
311 1.3 christos unsigned char c_thr[8];
312 1.3 christos
313 1.3 christos unsigned char c_segs[8];
314 1.3 christos unsigned char c_segregion[8];
315 1.3 christos
316 1.3 christos unsigned char c_stack[8];
317 1.3 christos unsigned char c_stackorg[8];
318 1.3 christos unsigned char c_size[8];
319 1.3 christos
320 1.3 christos unsigned char c_data[8];
321 1.3 christos unsigned char c_dataorg[8];
322 1.3 christos unsigned char c_datasize[8];
323 1.3 christos unsigned char c_sdorg[8];
324 1.3 christos unsigned char c_sdsize[8];
325 1.3 christos
326 1.3 christos unsigned char c_vmmregions[8];
327 1.3 christos unsigned char c_vmm[8];
328 1.3 christos
329 1.3 christos unsigned char c_impl[4];
330 1.3 christos unsigned char c_pad[4];
331 1.3 christos unsigned char c_cprs[8];
332 1.3 christos unsigned char c_reserved[7 * 8];
333 1.3 christos
334 1.3 christos /* Followed by:
335 1.3 christos - context of the faulting thread.
336 1.3 christos - user structure. */
337 1.3 christos };
338 1.3 christos
339 1.3 christos
340 1.3 christos /* Core file verion. */
341 1.3 christos #define CORE_DUMPX_VERSION 0x0feeddb1
342 1.3 christos #define CORE_DUMPXX_VERSION 0x0feeddb2
343 1.3 christos
344 1.3 christos struct external_ld_info32
345 1.3 christos {
346 1.3 christos unsigned char ldinfo_next[4];
347 1.3 christos unsigned char core_offset[4];
348 1.3 christos unsigned char ldinfo_textorg[4];
349 1.3 christos unsigned char ldinfo_textsize[4];
350 1.3 christos unsigned char ldinfo_dataorg[4];
351 1.3 christos unsigned char ldinfo_datasize[4];
352 1.3 christos unsigned char ldinfo_filename[2];
353 1.3 christos };
354