(root)/
gcc-13.2.0/
gcc/
collect2-aix.h
       1  /* AIX cross support for collect2.
       2     Copyright (C) 2009-2023 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.cc 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 */