rs6000.h revision 1.10 1 1.1 christos /* IBM RS/6000 "XCOFF" file definitions for BFD.
2 1.10 christos Copyright (C) 1990-2025 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.8 christos unsigned char magic[2]; /* type of file */
52 1.8 christos unsigned char vstamp[2]; /* version stamp */
53 1.8 christos unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */
54 1.8 christos unsigned char dsize[4]; /* initialized data " " */
55 1.8 christos unsigned char bsize[4]; /* uninitialized data " " */
56 1.8 christos unsigned char entry[4]; /* entry pt. */
57 1.8 christos unsigned char text_start[4]; /* base of text used for this file */
58 1.8 christos unsigned char data_start[4]; /* base of data used for this file */
59 1.8 christos unsigned char o_toc[4]; /* address of TOC */
60 1.8 christos unsigned char o_snentry[2]; /* section number of entry point */
61 1.8 christos unsigned char o_sntext[2]; /* section number of .text section */
62 1.8 christos unsigned char o_sndata[2]; /* section number of .data section */
63 1.8 christos unsigned char o_sntoc[2]; /* section number of TOC */
64 1.8 christos unsigned char o_snloader[2]; /* section number of .loader section */
65 1.8 christos unsigned char o_snbss[2]; /* section number of .bss section */
66 1.8 christos unsigned char o_algntext[2]; /* .text alignment */
67 1.8 christos unsigned char o_algndata[2]; /* .data alignment */
68 1.8 christos unsigned char o_modtype[2]; /* module type (??) */
69 1.8 christos unsigned char o_cputype[2]; /* cpu type */
70 1.8 christos unsigned char o_maxstack[4]; /* max stack size (??) */
71 1.8 christos unsigned char o_maxdata[4]; /* max data size (??) */
72 1.8 christos unsigned char o_debugger[4]; /* reserved */
73 1.8 christos unsigned char o_textpsize[1]; /* text page size */
74 1.8 christos unsigned char o_datapsize[1]; /* data page size */
75 1.8 christos unsigned char o_stackpsize[1]; /* stack page size */
76 1.8 christos unsigned char o_flags[1]; /* Flags and TLS alignment */
77 1.8 christos unsigned char o_sntdata[2]; /* section number of .tdata section */
78 1.8 christos unsigned char o_sntbss[2]; /* section number of .tbss section */
79 1.1 christos }
80 1.1 christos AOUTHDR;
81 1.1 christos
82 1.1 christos #define AOUTSZ 72
83 1.1 christos #define SMALL_AOUTSZ (28)
84 1.1 christos #define AOUTHDRSZ 72
85 1.1 christos
86 1.1 christos /********************** SECTION HEADER **********************/
87 1.1 christos
88 1.1 christos
89 1.1 christos struct external_scnhdr {
90 1.1 christos char s_name[8]; /* section name */
91 1.1 christos char s_paddr[4]; /* physical address, aliased s_nlib */
92 1.1 christos char s_vaddr[4]; /* virtual address */
93 1.1 christos char s_size[4]; /* section size */
94 1.1 christos char s_scnptr[4]; /* file ptr to raw data for section */
95 1.1 christos char s_relptr[4]; /* file ptr to relocation */
96 1.1 christos char s_lnnoptr[4]; /* file ptr to line numbers */
97 1.1 christos char s_nreloc[2]; /* number of relocation entries */
98 1.1 christos char s_nlnno[2]; /* number of line number entries*/
99 1.1 christos char s_flags[4]; /* flags */
100 1.1 christos };
101 1.1 christos
102 1.1 christos #define SCNHDR struct external_scnhdr
103 1.1 christos #define SCNHSZ 40
104 1.1 christos
105 1.1 christos /********************** LINE NUMBERS **********************/
106 1.1 christos
107 1.1 christos /* 1 line number entry for every "breakpointable" source line in a section.
108 1.1 christos * Line numbers are grouped on a per function basis; first entry in a function
109 1.1 christos * grouping will have l_lnno = 0 and in place of physical address will be the
110 1.1 christos * symbol table index of the function name.
111 1.1 christos */
112 1.1 christos struct external_lineno {
113 1.1 christos union {
114 1.1 christos char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/
115 1.1 christos char l_paddr[4]; /* (physical) address of line number */
116 1.1 christos } l_addr;
117 1.1 christos char l_lnno[2]; /* line number */
118 1.1 christos };
119 1.1 christos
120 1.1 christos
121 1.1 christos #define LINENO struct external_lineno
122 1.1 christos #define LINESZ 6
123 1.1 christos
124 1.1 christos
125 1.1 christos /********************** SYMBOLS **********************/
126 1.1 christos
127 1.1 christos #define E_SYMNMLEN 8 /* # characters in a symbol name */
128 1.1 christos #define E_FILNMLEN 14 /* # characters in a file name */
129 1.1 christos #define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
130 1.1 christos
131 1.1 christos struct external_syment
132 1.1 christos {
133 1.1 christos union {
134 1.1 christos char e_name[E_SYMNMLEN];
135 1.1 christos struct {
136 1.1 christos char e_zeroes[4];
137 1.1 christos char e_offset[4];
138 1.1 christos } e;
139 1.1 christos } e;
140 1.1 christos char e_value[4];
141 1.1 christos char e_scnum[2];
142 1.1 christos char e_type[2];
143 1.1 christos char e_sclass[1];
144 1.1 christos char e_numaux[1];
145 1.1 christos };
146 1.1 christos
147 1.1 christos
148 1.1 christos
149 1.1 christos #define N_BTMASK (017)
150 1.1 christos #define N_TMASK (060)
151 1.1 christos #define N_BTSHFT (4)
152 1.1 christos #define N_TSHIFT (2)
153 1.1 christos
154 1.1 christos
155 1.1 christos union external_auxent {
156 1.8 christos struct {
157 1.8 christos char x_pad1[2];
158 1.8 christos char x_lnno[4]; /* Source line number */
159 1.8 christos char x_pad[12];
160 1.8 christos } x_sym;
161 1.8 christos
162 1.8 christos struct {
163 1.8 christos char x_exptr[4];
164 1.8 christos char x_fsize[4];
165 1.8 christos char x_lnnoptr[4];
166 1.8 christos char x_endndx[4];
167 1.8 christos char x_pad[1];
168 1.8 christos } x_fcn;
169 1.8 christos
170 1.8 christos struct {
171 1.8 christos union {
172 1.8 christos char x_fname[E_FILNMLEN];
173 1.8 christos struct {
174 1.8 christos char x_zeroes[4];
175 1.8 christos char x_offset[4];
176 1.8 christos } x_n;
177 1.8 christos } x_n;
178 1.8 christos char x_ftype[1];
179 1.8 christos char x_resv[3];
180 1.8 christos } x_file;
181 1.8 christos
182 1.8 christos struct {
183 1.8 christos char x_scnlen[4]; /* section length */
184 1.8 christos char x_nreloc[2]; /* # relocation entries */
185 1.8 christos char x_nlinno[2]; /* # line numbers */
186 1.8 christos char x_pad[10];
187 1.8 christos } x_scn;
188 1.8 christos
189 1.8 christos struct {
190 1.8 christos char x_scnlen[4];
191 1.8 christos char x_parmhash[4];
192 1.8 christos char x_snhash[2];
193 1.8 christos char x_smtyp[1];
194 1.8 christos char x_smclas[1];
195 1.8 christos char x_stab[4];
196 1.8 christos char x_snstab[2];
197 1.8 christos } x_csect;
198 1.8 christos
199 1.8 christos struct {
200 1.8 christos char x_scnlen[4];
201 1.8 christos char x_pad1[4];
202 1.8 christos char x_nreloc[4];
203 1.8 christos char x_pad2[6];
204 1.8 christos } x_sect;
205 1.1 christos
206 1.1 christos };
207 1.1 christos
208 1.1 christos #define SYMENT struct external_syment
209 1.3 christos #define SYMESZ 18
210 1.1 christos #define AUXENT union external_auxent
211 1.1 christos #define AUXESZ 18
212 1.1 christos #define DBXMASK 0x80 /* for dbx storage mask */
213 1.1 christos #define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
214 1.1 christos
215 1.1 christos
216 1.1 christos
217 1.1 christos /********************** RELOCATION DIRECTIVES **********************/
218 1.1 christos
219 1.1 christos
220 1.1 christos struct external_reloc {
221 1.1 christos char r_vaddr[4];
222 1.1 christos char r_symndx[4];
223 1.1 christos char r_size[1];
224 1.1 christos char r_type[1];
225 1.1 christos };
226 1.1 christos
227 1.1 christos
228 1.1 christos #define RELOC struct external_reloc
229 1.1 christos #define RELSZ 10
230 1.1 christos
231 1.1 christos #define DEFAULT_DATA_SECTION_ALIGNMENT 4
232 1.1 christos #define DEFAULT_BSS_SECTION_ALIGNMENT 4
233 1.1 christos #define DEFAULT_TEXT_SECTION_ALIGNMENT 4
234 1.1 christos /* For new sections we havn't heard of before */
235 1.1 christos #define DEFAULT_SECTION_ALIGNMENT 4
236 1.1 christos
237 1.1 christos /* The ldhdr structure. This appears at the start of the .loader
238 1.1 christos section. */
239 1.1 christos
240 1.1 christos struct external_ldhdr
241 1.1 christos {
242 1.1 christos bfd_byte l_version[4];
243 1.1 christos bfd_byte l_nsyms[4];
244 1.1 christos bfd_byte l_nreloc[4];
245 1.1 christos bfd_byte l_istlen[4];
246 1.1 christos bfd_byte l_nimpid[4];
247 1.1 christos bfd_byte l_impoff[4];
248 1.1 christos bfd_byte l_stlen[4];
249 1.1 christos bfd_byte l_stoff[4];
250 1.1 christos };
251 1.1 christos
252 1.1 christos #define LDHDRSZ (8 * 4)
253 1.1 christos
254 1.1 christos struct external_ldsym
255 1.1 christos {
256 1.1 christos union
257 1.1 christos {
258 1.1 christos bfd_byte _l_name[E_SYMNMLEN];
259 1.1 christos struct
260 1.1 christos {
261 1.1 christos bfd_byte _l_zeroes[4];
262 1.1 christos bfd_byte _l_offset[4];
263 1.1 christos } _l_l;
264 1.1 christos } _l;
265 1.1 christos bfd_byte l_value[4];
266 1.1 christos bfd_byte l_scnum[2];
267 1.1 christos bfd_byte l_smtype[1];
268 1.1 christos bfd_byte l_smclas[1];
269 1.1 christos bfd_byte l_ifile[4];
270 1.1 christos bfd_byte l_parm[4];
271 1.1 christos };
272 1.1 christos
273 1.1 christos #define LDSYMSZ (8 + 3 * 4 + 2 + 2)
274 1.1 christos
275 1.1 christos struct external_ldrel
276 1.1 christos {
277 1.1 christos bfd_byte l_vaddr[4];
278 1.1 christos bfd_byte l_symndx[4];
279 1.1 christos bfd_byte l_rtype[2];
280 1.1 christos bfd_byte l_rsecnm[2];
281 1.1 christos };
282 1.1 christos
283 1.1 christos #define LDRELSZ (2 * 4 + 2 * 2)
284 1.1 christos
285 1.1 christos struct external_exceptab
286 1.1 christos {
287 1.1 christos union {
288 1.1 christos bfd_byte e_symndx[4];
289 1.1 christos bfd_byte e_paddr[4];
290 1.1 christos } e_addr;
291 1.1 christos bfd_byte e_lang[1];
292 1.1 christos bfd_byte e_reason[1];
293 1.1 christos };
294 1.1 christos
295 1.1 christos #define EXCEPTSZ (4 + 2)
296 1.3 christos
297 1.3 christos /******************** Core files *************************/
298 1.3 christos
299 1.3 christos struct external_core_dumpx
300 1.3 christos {
301 1.3 christos unsigned char c_signo[1];
302 1.3 christos unsigned char c_flag[1];
303 1.3 christos unsigned char c_entries[2];
304 1.3 christos
305 1.3 christos unsigned char c_version[4];
306 1.3 christos
307 1.3 christos unsigned char c_fdsinfox[8];
308 1.3 christos unsigned char c_loader[8];
309 1.3 christos unsigned char c_lsize[8];
310 1.3 christos
311 1.3 christos unsigned char c_n_thr[4];
312 1.3 christos unsigned char c_reserved0[4];
313 1.3 christos unsigned char c_thr[8];
314 1.3 christos
315 1.3 christos unsigned char c_segs[8];
316 1.3 christos unsigned char c_segregion[8];
317 1.3 christos
318 1.3 christos unsigned char c_stack[8];
319 1.3 christos unsigned char c_stackorg[8];
320 1.3 christos unsigned char c_size[8];
321 1.3 christos
322 1.3 christos unsigned char c_data[8];
323 1.3 christos unsigned char c_dataorg[8];
324 1.3 christos unsigned char c_datasize[8];
325 1.3 christos unsigned char c_sdorg[8];
326 1.3 christos unsigned char c_sdsize[8];
327 1.3 christos
328 1.3 christos unsigned char c_vmmregions[8];
329 1.3 christos unsigned char c_vmm[8];
330 1.3 christos
331 1.3 christos unsigned char c_impl[4];
332 1.3 christos unsigned char c_pad[4];
333 1.3 christos unsigned char c_cprs[8];
334 1.3 christos unsigned char c_reserved[7 * 8];
335 1.3 christos
336 1.3 christos /* Followed by:
337 1.3 christos - context of the faulting thread.
338 1.3 christos - user structure. */
339 1.3 christos };
340 1.3 christos
341 1.3 christos
342 1.3 christos /* Core file verion. */
343 1.3 christos #define CORE_DUMPX_VERSION 0x0feeddb1
344 1.3 christos #define CORE_DUMPXX_VERSION 0x0feeddb2
345 1.3 christos
346 1.3 christos struct external_ld_info32
347 1.3 christos {
348 1.3 christos unsigned char ldinfo_next[4];
349 1.3 christos unsigned char core_offset[4];
350 1.3 christos unsigned char ldinfo_textorg[4];
351 1.3 christos unsigned char ldinfo_textsize[4];
352 1.3 christos unsigned char ldinfo_dataorg[4];
353 1.3 christos unsigned char ldinfo_datasize[4];
354 1.3 christos unsigned char ldinfo_filename[2];
355 1.3 christos };
356