123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- /* AIX cross support for collect2.
- Copyright (C) 2009-2015 Free Software Foundation, Inc.
- This file is part of GCC.
- GCC is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 3, or (at your option) any later
- version.
- GCC is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
- You should have received a copy of the GNU General Public License
- along with GCC; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>. */
- #ifndef GCC_COLLECT2_AIX_H
- #define GCC_COLLECT2_AIX_H
- /* collect2-aix.c requires mmap support. It should otherwise be
- fairly portable. */
- #if defined(CROSS_DIRECTORY_STRUCTURE) \
- && defined(TARGET_AIX_VERSION) \
- && HAVE_MMAP
- #define CROSS_AIX_SUPPORT 1
- /* -------------------------------------------------------------------------
- Definitions adapted from bfd. (Fairly heavily adapted in some cases.)
- ------------------------------------------------------------------------- */
- /* Compatibility types for bfd. */
- typedef unsigned HOST_WIDE_INT bfd_vma;
- /* The size of an archive's fl_magic field. */
- #define FL_MAGIC_SIZE 8
- /* The expected contents of fl_magic for big archives. */
- #define FL_MAGIC_BIG_AR "<bigaf>\012"
- /* The size of each offset string in the header of a big archive. */
- #define AR_BIG_OFFSET_SIZE 20
- /* The format of the file header in a "big" XCOFF archive. */
- struct external_big_ar_filehdr
- {
- /* Magic string. */
- char fl_magic[FL_MAGIC_SIZE];
- /* Offset of the member table (decimal ASCII string). */
- char fl_memoff[AR_BIG_OFFSET_SIZE];
- /* Offset of the global symbol table for 32-bit objects (decimal ASCII
- string). */
- char fl_symoff[AR_BIG_OFFSET_SIZE];
- /* Offset of the global symbol table for 64-bit objects (decimal ASCII
- string). */
- char fl_symoff64[AR_BIG_OFFSET_SIZE];
- /* Offset of the first member in the archive (decimal ASCII string). */
- char fl_firstmemoff[AR_BIG_OFFSET_SIZE];
- /* Offset of the last member in the archive (decimal ASCII string). */
- char fl_lastmemoff[AR_BIG_OFFSET_SIZE];
- /* Offset of the first member on the free list (decimal ASCII
- string). */
- char fl_freeoff[AR_BIG_OFFSET_SIZE];
- };
- /* Each archive name is followed by this many bytes of magic string. */
- #define SXCOFFARFMAG 2
- /* The format of a member header in a "big" XCOFF archive. */
- struct external_big_ar_member
- {
- /* File size not including the header (decimal ASCII string). */
- char ar_size[AR_BIG_OFFSET_SIZE];
- /* File offset of next archive member (decimal ASCII string). */
- char ar_nextoff[AR_BIG_OFFSET_SIZE];
- /* File offset of previous archive member (decimal ASCII string). */
- char ar_prevoff[AR_BIG_OFFSET_SIZE];
- /* File mtime (decimal ASCII string). */
- char ar_date[12];
- /* File UID (decimal ASCII string). */
- char ar_uid[12];
- /* File GID (decimal ASCII string). */
- char ar_gid[12];
- /* File mode (octal ASCII string). */
- char ar_mode[12];
- /* Length of file name (decimal ASCII string). */
- char ar_namlen[4];
- /* This structure is followed by the file name. The length of the
- name is given in the namlen field. If the length of the name is
- odd, the name is followed by a null byte. The name and optional
- null byte are followed by XCOFFARFMAG, which is not included in
- namlen. The contents of the archive member follow; the number of
- bytes is given in the size field. */
- };
- /* The known values of f_magic in an XCOFF file header. */
- #define U802WRMAGIC 0730 /* Writeable text segments. */
- #define U802ROMAGIC 0735 /* Readonly sharable text segments. */
- #define U802TOCMAGIC 0737 /* Readonly text segments and TOC. */
- #define U803XTOCMAGIC 0757 /* Aix 4.3 64-bit XCOFF. */
- #define U64_TOCMAGIC 0767 /* AIX 5+ 64-bit XCOFF. */
- /* The number of bytes in an XCOFF file's f_magic field. */
- #define F_MAGIC_SIZE 2
- /* The format of a 32-bit XCOFF file header. */
- struct external_filehdr_32
- {
- /* The magic number. */
- char f_magic[F_MAGIC_SIZE];
- /* The number of sections. */
- char f_nscns[2];
- /* Time & date stamp. */
- char f_timdat[4];
- /* The offset of the symbol table from the start of the file. */
- char f_symptr[4];
- /* The number of entries in the symbol table. */
- char f_nsyms[4];
- /* The size of the auxiliary header. */
- char f_opthdr[2];
- /* Flags. */
- char f_flags[2];
- };
- /* The format of a 64-bit XCOFF file header. */
- struct external_filehdr_64
- {
- /* The magic number. */
- char f_magic[F_MAGIC_SIZE];
- /* The number of sections. */
- char f_nscns[2];
- /* Time & date stamp. */
- char f_timdat[4];
- /* The offset of the symbol table from the start of the file. */
- char f_symptr[8];
- /* The size of the auxiliary header. */
- char f_opthdr[2];
- /* Flags. */
- char f_flags[2];
- /* The number of entries in the symbol table. */
- char f_nsyms[4];
- };
- /* An internal representation of the XCOFF file header. */
- struct internal_filehdr
- {
- unsigned short f_magic;
- unsigned short f_nscns;
- long f_timdat;
- bfd_vma f_symptr;
- long f_nsyms;
- unsigned short f_opthdr;
- unsigned short f_flags;
- };
- /* Symbol classes have their names in the debug section if this flag
- is set. */
- #define DBXMASK 0x80
- /* The format of an XCOFF symbol-table entry. */
- struct external_syment
- {
- union {
- struct {
- union {
- /* The name of the symbol. There is an implicit null character
- after the end of the array. */
- char n_name[8];
- struct {
- /* If n_zeroes is zero, n_offset is the offset the name from
- the start of the string table. */
- char n_zeroes[4];
- char n_offset[4];
- } u;
- } u;
- /* The symbol's value. */
- char n_value[4];
- } xcoff32;
- struct {
- /* The symbol's value. */
- char n_value[8];
- /* The offset of the symbol from the start of the string table. */
- char n_offset[4];
- } xcoff64;
- } u;
- /* The number of the section to which this symbol belongs. */
- char n_scnum[2];
- /* The type of symbol. (It can be interpreted as an n_lang
- and an n_cpu byte, but we don't care about that here.) */
- char n_type[2];
- /* The class of symbol (a C_* value). */
- char n_sclass[1];
- /* The number of auxiliary symbols attached to this entry. */
- char n_numaux[1];
- };
- /* Definitions required by collect2. */
- #define C_EXT 2
- #define F_SHROBJ 0x2000
- #define F_LOADONLY 0x4000
- #define N_UNDEF ((short) 0)
- #define N_TMASK 060
- #define N_BTSHFT 4
- #define DT_NON 0
- #define DT_FCN 2
- /* -------------------------------------------------------------------------
- Local code.
- ------------------------------------------------------------------------- */
- /* An internal representation of an XCOFF symbol-table entry,
- which is associated with the API-defined SYMENT type. */
- struct internal_syment
- {
- char n_name[9];
- unsigned int n_zeroes;
- bfd_vma n_offset;
- bfd_vma n_value;
- short n_scnum;
- unsigned short n_flags;
- unsigned short n_type;
- unsigned char n_sclass;
- unsigned char n_numaux;
- };
- typedef struct internal_syment SYMENT;
- /* The internal representation of the API-defined LDFILE type. */
- struct internal_ldfile
- {
- /* The file handle for the associated file, or -1 if it hasn't been
- opened yet. */
- int fd;
- /* The start of the current XCOFF object, if one has been mapped
- into memory. Null otherwise. */
- char *object;
- /* The offset of OBJECT from the start of the containing page. */
- size_t page_offset;
- /* The size of the file pointed to by OBJECT. Valid iff OFFSET
- is nonnull. */
- size_t object_size;
- /* The offset of the next member in an archive after OBJECT,
- or -1 if this isn't an archive. Valid iff OFFSET is nonnull. */
- off_t next_member;
- /* The parsed version of the XCOFF file header. */
- struct internal_filehdr filehdr;
- };
- typedef struct internal_ldfile LDFILE;
- /* The API allows the file header to be directly accessed via this macro. */
- #define HEADER(FILE) ((FILE)->filehdr)
- /* API-defined return codes. SUCCESS must be > 0 and FAILURE must be <= 0. */
- #define SUCCESS 1
- #define FAILURE 0
- /* API-defined functions. */
- extern LDFILE *ldopen (char *, LDFILE *);
- extern char *ldgetname (LDFILE *, SYMENT *);
- extern int ldtbread (LDFILE *, long, SYMENT *);
- extern int ldclose (LDFILE *);
- #endif
- #endif /* GCC_COLLECT2_AIX_H */
|