1 /* AIX cross support for collect2.
2 Copyright (C) 2009-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
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
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
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/>. */
20 /* collect2-aix.c requires mmap support. It should otherwise be
22 #if defined(CROSS_DIRECTORY_STRUCTURE) \
23 && defined(TARGET_AIX_VERSION) \
26 #define CROSS_AIX_SUPPORT 1
28 /* -------------------------------------------------------------------------
29 Definitions adapted from bfd. (Fairly heavily adapted in some cases.)
30 ------------------------------------------------------------------------- */
32 /* Compatibility types for bfd. */
33 typedef unsigned HOST_WIDE_INT bfd_vma
;
35 /* The size of an archive's fl_magic field. */
36 #define FL_MAGIC_SIZE 8
38 /* The expected contents of fl_magic for big archives. */
39 #define FL_MAGIC_BIG_AR "<bigaf>\012"
41 /* The size of each offset string in the header of a big archive. */
42 #define AR_BIG_OFFSET_SIZE 20
44 /* The format of the file header in a "big" XCOFF archive. */
45 struct external_big_ar_filehdr
48 char fl_magic
[FL_MAGIC_SIZE
];
50 /* Offset of the member table (decimal ASCII string). */
51 char fl_memoff
[AR_BIG_OFFSET_SIZE
];
53 /* Offset of the global symbol table for 32-bit objects (decimal ASCII
55 char fl_symoff
[AR_BIG_OFFSET_SIZE
];
57 /* Offset of the global symbol table for 64-bit objects (decimal ASCII
59 char fl_symoff64
[AR_BIG_OFFSET_SIZE
];
61 /* Offset of the first member in the archive (decimal ASCII string). */
62 char fl_firstmemoff
[AR_BIG_OFFSET_SIZE
];
64 /* Offset of the last member in the archive (decimal ASCII string). */
65 char fl_lastmemoff
[AR_BIG_OFFSET_SIZE
];
67 /* Offset of the first member on the free list (decimal ASCII
69 char fl_freeoff
[AR_BIG_OFFSET_SIZE
];
72 /* Each archive name is followed by this many bytes of magic string. */
73 #define SXCOFFARFMAG 2
75 /* The format of a member header in a "big" XCOFF archive. */
76 struct external_big_ar_member
78 /* File size not including the header (decimal ASCII string). */
79 char ar_size
[AR_BIG_OFFSET_SIZE
];
81 /* File offset of next archive member (decimal ASCII string). */
82 char ar_nextoff
[AR_BIG_OFFSET_SIZE
];
84 /* File offset of previous archive member (decimal ASCII string). */
85 char ar_prevoff
[AR_BIG_OFFSET_SIZE
];
87 /* File mtime (decimal ASCII string). */
90 /* File UID (decimal ASCII string). */
93 /* File GID (decimal ASCII string). */
96 /* File mode (octal ASCII string). */
99 /* Length of file name (decimal ASCII string). */
102 /* This structure is followed by the file name. The length of the
103 name is given in the namlen field. If the length of the name is
104 odd, the name is followed by a null byte. The name and optional
105 null byte are followed by XCOFFARFMAG, which is not included in
106 namlen. The contents of the archive member follow; the number of
107 bytes is given in the size field. */
110 /* The known values of f_magic in an XCOFF file header. */
111 #define U802WRMAGIC 0730 /* Writeable text segments. */
112 #define U802ROMAGIC 0735 /* Readonly sharable text segments. */
113 #define U802TOCMAGIC 0737 /* Readonly text segments and TOC. */
114 #define U803XTOCMAGIC 0757 /* Aix 4.3 64-bit XCOFF. */
115 #define U64_TOCMAGIC 0767 /* AIX 5+ 64-bit XCOFF. */
117 /* The number of bytes in an XCOFF file's f_magic field. */
118 #define F_MAGIC_SIZE 2
120 /* The format of a 32-bit XCOFF file header. */
121 struct external_filehdr_32
123 /* The magic number. */
124 char f_magic
[F_MAGIC_SIZE
];
126 /* The number of sections. */
129 /* Time & date stamp. */
132 /* The offset of the symbol table from the start of the file. */
135 /* The number of entries in the symbol table. */
138 /* The size of the auxiliary header. */
145 /* The format of a 64-bit XCOFF file header. */
146 struct external_filehdr_64
148 /* The magic number. */
149 char f_magic
[F_MAGIC_SIZE
];
151 /* The number of sections. */
154 /* Time & date stamp. */
157 /* The offset of the symbol table from the start of the file. */
160 /* The size of the auxiliary header. */
166 /* The number of entries in the symbol table. */
170 /* An internal representation of the XCOFF file header. */
171 struct internal_filehdr
173 unsigned short f_magic
;
174 unsigned short f_nscns
;
178 unsigned short f_opthdr
;
179 unsigned short f_flags
;
182 /* Symbol classes have their names in the debug section if this flag
186 /* The format of an XCOFF symbol-table entry. */
187 struct external_syment
192 /* The name of the symbol. There is an implicit null character
193 after the end of the array. */
196 /* If n_zeroes is zero, n_offset is the offset the name from
197 the start of the string table. */
203 /* The symbol's value. */
207 /* The symbol's value. */
210 /* The offset of the symbol from the start of the string table. */
215 /* The number of the section to which this symbol belongs. */
218 /* The type of symbol. (It can be interpreted as an n_lang
219 and an n_cpu byte, but we don't care about that here.) */
222 /* The class of symbol (a C_* value). */
225 /* The number of auxiliary symbols attached to this entry. */
229 /* Definitions required by collect2. */
232 #define F_SHROBJ 0x2000
233 #define F_LOADONLY 0x4000
235 #define N_UNDEF ((short) 0)
242 /* -------------------------------------------------------------------------
244 ------------------------------------------------------------------------- */
246 /* An internal representation of an XCOFF symbol-table entry,
247 which is associated with the API-defined SYMENT type. */
248 struct internal_syment
251 unsigned int n_zeroes
;
255 unsigned short n_flags
;
256 unsigned short n_type
;
257 unsigned char n_sclass
;
258 unsigned char n_numaux
;
260 typedef struct internal_syment SYMENT
;
262 /* The internal representation of the API-defined LDFILE type. */
263 struct internal_ldfile
265 /* The file handle for the associated file, or -1 if it hasn't been
269 /* The start of the current XCOFF object, if one has been mapped
270 into memory. Null otherwise. */
273 /* The offset of OBJECT from the start of the containing page. */
276 /* The size of the file pointed to by OBJECT. Valid iff OFFSET
280 /* The offset of the next member in an archive after OBJECT,
281 or -1 if this isn't an archive. Valid iff OFFSET is nonnull. */
284 /* The parsed version of the XCOFF file header. */
285 struct internal_filehdr filehdr
;
287 typedef struct internal_ldfile LDFILE
;
289 /* The API allows the file header to be directly accessed via this macro. */
290 #define HEADER(FILE) ((FILE)->filehdr)
292 /* API-defined return codes. SUCCESS must be > 0 and FAILURE must be <= 0. */
296 /* API-defined functions. */
297 extern LDFILE
*ldopen (char *, LDFILE
*);
298 extern char *ldgetname (LDFILE
*, SYMENT
*);
299 extern int ldtbread (LDFILE
*, long, SYMENT
*);
300 extern int ldclose (LDFILE
*);