1 /* AIX cross support for collect2. 2 Copyright (C) 2009-2019 Free Software Foundation, Inc. 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 20 #ifndef GCC_COLLECT2_AIX_H 21 #define GCC_COLLECT2_AIX_H 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 34 /* Compatibility types for bfd. */ 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 140 /* The size of the auxiliary header. */ 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 162 /* The size of the auxiliary header. */ 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 227 /* The number of auxiliary symbols attached to this entry. */ 228 char n_numaux[1]; 229 }; 230 231 /* Definitions required by collect2. */ 232 #define C_EXT 2 233 234 #define F_SHROBJ 0x2000 235 #define F_LOADONLY 0x4000 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 305 306 #endif /* GCC_COLLECT2_AIX_H */ 307