]>
Commit | Line | Data |
---|---|---|
dfb636dc | 1 | /* AIX cross support for collect2. |
99dee823 | 2 | Copyright (C) 2009-2021 Free Software Foundation, Inc. |
dfb636dc RS |
3 | |
4 | This file is part of GCC. | |
5 | ||
6 | GCC is free software; you can redistribute it and/or modify it under | |
7 | the terms of the GNU General Public License as published by the Free | |
8 | Software Foundation; either version 3, or (at your option) any later | |
9 | version. | |
10 | ||
11 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 | for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GCC; see the file COPYING3. If not see | |
18 | <http://www.gnu.org/licenses/>. */ | |
19 | ||
f1717f8d KC |
20 | #ifndef GCC_COLLECT2_AIX_H |
21 | #define GCC_COLLECT2_AIX_H | |
dfb636dc RS |
22 | /* collect2-aix.c requires mmap support. It should otherwise be |
23 | fairly portable. */ | |
24 | #if defined(CROSS_DIRECTORY_STRUCTURE) \ | |
25 | && defined(TARGET_AIX_VERSION) \ | |
26 | && HAVE_MMAP | |
27 | ||
28 | #define CROSS_AIX_SUPPORT 1 | |
29 | ||
30 | /* ------------------------------------------------------------------------- | |
31 | Definitions adapted from bfd. (Fairly heavily adapted in some cases.) | |
32 | ------------------------------------------------------------------------- */ | |
33 | ||
073a8998 | 34 | /* Compatibility types for bfd. */ |
dfb636dc RS |
35 | typedef unsigned HOST_WIDE_INT bfd_vma; |
36 | ||
37 | /* The size of an archive's fl_magic field. */ | |
38 | #define FL_MAGIC_SIZE 8 | |
39 | ||
40 | /* The expected contents of fl_magic for big archives. */ | |
41 | #define FL_MAGIC_BIG_AR "<bigaf>\012" | |
42 | ||
43 | /* The size of each offset string in the header of a big archive. */ | |
44 | #define AR_BIG_OFFSET_SIZE 20 | |
45 | ||
46 | /* The format of the file header in a "big" XCOFF archive. */ | |
47 | struct external_big_ar_filehdr | |
48 | { | |
49 | /* Magic string. */ | |
50 | char fl_magic[FL_MAGIC_SIZE]; | |
51 | ||
52 | /* Offset of the member table (decimal ASCII string). */ | |
53 | char fl_memoff[AR_BIG_OFFSET_SIZE]; | |
54 | ||
55 | /* Offset of the global symbol table for 32-bit objects (decimal ASCII | |
56 | string). */ | |
57 | char fl_symoff[AR_BIG_OFFSET_SIZE]; | |
58 | ||
59 | /* Offset of the global symbol table for 64-bit objects (decimal ASCII | |
60 | string). */ | |
61 | char fl_symoff64[AR_BIG_OFFSET_SIZE]; | |
62 | ||
63 | /* Offset of the first member in the archive (decimal ASCII string). */ | |
64 | char fl_firstmemoff[AR_BIG_OFFSET_SIZE]; | |
65 | ||
66 | /* Offset of the last member in the archive (decimal ASCII string). */ | |
67 | char fl_lastmemoff[AR_BIG_OFFSET_SIZE]; | |
68 | ||
69 | /* Offset of the first member on the free list (decimal ASCII | |
70 | string). */ | |
71 | char fl_freeoff[AR_BIG_OFFSET_SIZE]; | |
72 | }; | |
73 | ||
74 | /* Each archive name is followed by this many bytes of magic string. */ | |
75 | #define SXCOFFARFMAG 2 | |
76 | ||
77 | /* The format of a member header in a "big" XCOFF archive. */ | |
78 | struct external_big_ar_member | |
79 | { | |
80 | /* File size not including the header (decimal ASCII string). */ | |
81 | char ar_size[AR_BIG_OFFSET_SIZE]; | |
82 | ||
83 | /* File offset of next archive member (decimal ASCII string). */ | |
84 | char ar_nextoff[AR_BIG_OFFSET_SIZE]; | |
85 | ||
86 | /* File offset of previous archive member (decimal ASCII string). */ | |
87 | char ar_prevoff[AR_BIG_OFFSET_SIZE]; | |
88 | ||
89 | /* File mtime (decimal ASCII string). */ | |
90 | char ar_date[12]; | |
91 | ||
92 | /* File UID (decimal ASCII string). */ | |
93 | char ar_uid[12]; | |
94 | ||
95 | /* File GID (decimal ASCII string). */ | |
96 | char ar_gid[12]; | |
97 | ||
98 | /* File mode (octal ASCII string). */ | |
99 | char ar_mode[12]; | |
100 | ||
101 | /* Length of file name (decimal ASCII string). */ | |
102 | char ar_namlen[4]; | |
103 | ||
104 | /* This structure is followed by the file name. The length of the | |
105 | name is given in the namlen field. If the length of the name is | |
106 | odd, the name is followed by a null byte. The name and optional | |
107 | null byte are followed by XCOFFARFMAG, which is not included in | |
108 | namlen. The contents of the archive member follow; the number of | |
109 | bytes is given in the size field. */ | |
110 | }; | |
111 | ||
112 | /* The known values of f_magic in an XCOFF file header. */ | |
113 | #define U802WRMAGIC 0730 /* Writeable text segments. */ | |
114 | #define U802ROMAGIC 0735 /* Readonly sharable text segments. */ | |
115 | #define U802TOCMAGIC 0737 /* Readonly text segments and TOC. */ | |
116 | #define U803XTOCMAGIC 0757 /* Aix 4.3 64-bit XCOFF. */ | |
117 | #define U64_TOCMAGIC 0767 /* AIX 5+ 64-bit XCOFF. */ | |
118 | ||
119 | /* The number of bytes in an XCOFF file's f_magic field. */ | |
120 | #define F_MAGIC_SIZE 2 | |
121 | ||
122 | /* The format of a 32-bit XCOFF file header. */ | |
123 | struct external_filehdr_32 | |
124 | { | |
125 | /* The magic number. */ | |
126 | char f_magic[F_MAGIC_SIZE]; | |
127 | ||
128 | /* The number of sections. */ | |
129 | char f_nscns[2]; | |
130 | ||
131 | /* Time & date stamp. */ | |
132 | char f_timdat[4]; | |
133 | ||
134 | /* The offset of the symbol table from the start of the file. */ | |
135 | char f_symptr[4]; | |
136 | ||
137 | /* The number of entries in the symbol table. */ | |
138 | char f_nsyms[4]; | |
139 | ||
073a8998 | 140 | /* The size of the auxiliary header. */ |
dfb636dc RS |
141 | char f_opthdr[2]; |
142 | ||
143 | /* Flags. */ | |
144 | char f_flags[2]; | |
145 | }; | |
146 | ||
147 | /* The format of a 64-bit XCOFF file header. */ | |
148 | struct external_filehdr_64 | |
149 | { | |
150 | /* The magic number. */ | |
151 | char f_magic[F_MAGIC_SIZE]; | |
152 | ||
153 | /* The number of sections. */ | |
154 | char f_nscns[2]; | |
155 | ||
156 | /* Time & date stamp. */ | |
157 | char f_timdat[4]; | |
158 | ||
159 | /* The offset of the symbol table from the start of the file. */ | |
160 | char f_symptr[8]; | |
161 | ||
073a8998 | 162 | /* The size of the auxiliary header. */ |
dfb636dc RS |
163 | char f_opthdr[2]; |
164 | ||
165 | /* Flags. */ | |
166 | char f_flags[2]; | |
167 | ||
168 | /* The number of entries in the symbol table. */ | |
169 | char f_nsyms[4]; | |
170 | }; | |
171 | ||
172 | /* An internal representation of the XCOFF file header. */ | |
173 | struct internal_filehdr | |
174 | { | |
175 | unsigned short f_magic; | |
176 | unsigned short f_nscns; | |
177 | long f_timdat; | |
178 | bfd_vma f_symptr; | |
179 | long f_nsyms; | |
180 | unsigned short f_opthdr; | |
181 | unsigned short f_flags; | |
182 | }; | |
183 | ||
184 | /* Symbol classes have their names in the debug section if this flag | |
185 | is set. */ | |
186 | #define DBXMASK 0x80 | |
187 | ||
188 | /* The format of an XCOFF symbol-table entry. */ | |
189 | struct external_syment | |
190 | { | |
191 | union { | |
192 | struct { | |
193 | union { | |
194 | /* The name of the symbol. There is an implicit null character | |
195 | after the end of the array. */ | |
196 | char n_name[8]; | |
197 | struct { | |
198 | /* If n_zeroes is zero, n_offset is the offset the name from | |
199 | the start of the string table. */ | |
200 | char n_zeroes[4]; | |
201 | char n_offset[4]; | |
202 | } u; | |
203 | } u; | |
204 | ||
205 | /* The symbol's value. */ | |
206 | char n_value[4]; | |
207 | } xcoff32; | |
208 | struct { | |
209 | /* The symbol's value. */ | |
210 | char n_value[8]; | |
211 | ||
212 | /* The offset of the symbol from the start of the string table. */ | |
213 | char n_offset[4]; | |
214 | } xcoff64; | |
215 | } u; | |
216 | ||
217 | /* The number of the section to which this symbol belongs. */ | |
218 | char n_scnum[2]; | |
219 | ||
220 | /* The type of symbol. (It can be interpreted as an n_lang | |
221 | and an n_cpu byte, but we don't care about that here.) */ | |
222 | char n_type[2]; | |
223 | ||
224 | /* The class of symbol (a C_* value). */ | |
225 | char n_sclass[1]; | |
226 | ||
073a8998 | 227 | /* The number of auxiliary symbols attached to this entry. */ |
dfb636dc RS |
228 | char n_numaux[1]; |
229 | }; | |
230 | ||
231 | /* Definitions required by collect2. */ | |
232 | #define C_EXT 2 | |
233 | ||
bb3accfa SB |
234 | #define F_SHROBJ 0x2000 |
235 | #define F_LOADONLY 0x4000 | |
dfb636dc RS |
236 | |
237 | #define N_UNDEF ((short) 0) | |
238 | #define N_TMASK 060 | |
239 | #define N_BTSHFT 4 | |
240 | ||
241 | #define DT_NON 0 | |
242 | #define DT_FCN 2 | |
243 | ||
244 | /* ------------------------------------------------------------------------- | |
245 | Local code. | |
246 | ------------------------------------------------------------------------- */ | |
247 | ||
248 | /* An internal representation of an XCOFF symbol-table entry, | |
249 | which is associated with the API-defined SYMENT type. */ | |
250 | struct internal_syment | |
251 | { | |
252 | char n_name[9]; | |
253 | unsigned int n_zeroes; | |
254 | bfd_vma n_offset; | |
255 | bfd_vma n_value; | |
256 | short n_scnum; | |
257 | unsigned short n_flags; | |
258 | unsigned short n_type; | |
259 | unsigned char n_sclass; | |
260 | unsigned char n_numaux; | |
261 | }; | |
262 | typedef struct internal_syment SYMENT; | |
263 | ||
264 | /* The internal representation of the API-defined LDFILE type. */ | |
265 | struct internal_ldfile | |
266 | { | |
267 | /* The file handle for the associated file, or -1 if it hasn't been | |
268 | opened yet. */ | |
269 | int fd; | |
270 | ||
271 | /* The start of the current XCOFF object, if one has been mapped | |
272 | into memory. Null otherwise. */ | |
273 | char *object; | |
274 | ||
275 | /* The offset of OBJECT from the start of the containing page. */ | |
276 | size_t page_offset; | |
277 | ||
278 | /* The size of the file pointed to by OBJECT. Valid iff OFFSET | |
279 | is nonnull. */ | |
280 | size_t object_size; | |
281 | ||
282 | /* The offset of the next member in an archive after OBJECT, | |
283 | or -1 if this isn't an archive. Valid iff OFFSET is nonnull. */ | |
284 | off_t next_member; | |
285 | ||
286 | /* The parsed version of the XCOFF file header. */ | |
287 | struct internal_filehdr filehdr; | |
288 | }; | |
289 | typedef struct internal_ldfile LDFILE; | |
290 | ||
291 | /* The API allows the file header to be directly accessed via this macro. */ | |
292 | #define HEADER(FILE) ((FILE)->filehdr) | |
293 | ||
294 | /* API-defined return codes. SUCCESS must be > 0 and FAILURE must be <= 0. */ | |
295 | #define SUCCESS 1 | |
296 | #define FAILURE 0 | |
297 | ||
298 | /* API-defined functions. */ | |
299 | extern LDFILE *ldopen (char *, LDFILE *); | |
300 | extern char *ldgetname (LDFILE *, SYMENT *); | |
301 | extern int ldtbread (LDFILE *, long, SYMENT *); | |
302 | extern int ldclose (LDFILE *); | |
303 | ||
304 | #endif | |
f1717f8d KC |
305 | |
306 | #endif /* GCC_COLLECT2_AIX_H */ |