1  /* ELF object file format.
       2     Copyright (C) 1992-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of GAS, the GNU Assembler.
       5  
       6     GAS is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3, or (at your option)
       9     any later version.
      10  
      11     GAS is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with GAS; see the file COPYING.  If not, write to the Free
      18     Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
      19     02110-1301, USA.  */
      20  
      21  /* HP PA-RISC support was contributed by the Center for Software Science
      22     at the University of Utah.  */
      23  
      24  #ifndef _OBJ_ELF_H
      25  #define _OBJ_ELF_H
      26  
      27  #define OBJ_ELF 1
      28  
      29  /* Note that all macros in this file should be wrapped in #ifndef, for
      30     sake of obj-multi.h which includes this file.  */
      31  
      32  #ifndef OUTPUT_FLAVOR
      33  #define OUTPUT_FLAVOR bfd_target_elf_flavour
      34  #endif
      35  
      36  #include "bfd/elf-bfd.h"
      37  
      38  #include "targ-cpu.h"
      39  
      40  #ifdef TC_ALPHA
      41  #define ECOFF_DEBUGGING (alpha_flag_mdebug > 0)
      42  extern int alpha_flag_mdebug;
      43  #endif
      44  
      45  /* For now, always set ECOFF_DEBUGGING for a MIPS target.  */
      46  #ifdef TC_MIPS
      47  #define ECOFF_DEBUGGING mips_flag_mdebug
      48  extern int mips_flag_mdebug;
      49  #endif /* TC_MIPS */
      50  
      51  #ifdef OBJ_MAYBE_ECOFF
      52  #ifndef ECOFF_DEBUGGING
      53  #define ECOFF_DEBUGGING 1
      54  #endif
      55  #endif
      56  
      57  enum elf_visibility
      58  {
      59    visibility_unchanged = 0,
      60    visibility_local,
      61    visibility_hidden,
      62    visibility_remove
      63  };
      64  
      65  struct elf_versioned_name_list
      66  {
      67    char *name;
      68    struct elf_versioned_name_list *next;
      69  };
      70  
      71  /* Additional information we keep for each symbol.  */
      72  struct elf_obj_sy
      73  {
      74    /* Whether the symbol has been marked as local.  */
      75    unsigned int local : 1;
      76  
      77    /* Whether the symbol has been marked for rename with @@@.  */
      78    unsigned int rename : 1;
      79  
      80    /* Whether the symbol has a bad version name.  */
      81    unsigned int bad_version : 1;
      82  
      83    /* Whether visibility of the symbol should be changed.  */
      84    ENUM_BITFIELD (elf_visibility) visibility : 2;
      85  
      86    /* Use this to keep track of .size expressions that involve
      87       differences that we can't compute yet.  */
      88    expressionS *size;
      89  
      90    /* The list of names specified by the .symver directive.  */
      91    struct elf_versioned_name_list *versioned_name;
      92  
      93  #ifdef ECOFF_DEBUGGING
      94    /* If we are generating ECOFF debugging information, we need some
      95       additional fields for each symbol.  */
      96    struct efdr *ecoff_file;
      97    struct localsym *ecoff_symbol;
      98    valueT ecoff_extern_size;
      99  #endif
     100  };
     101  
     102  /* Match section group name, the sh_info field and the section_id
     103     field.  */
     104  struct elf_section_match
     105  {
     106    const char *   group_name;
     107    const char *   linked_to_symbol_name;
     108    unsigned int   section_id;
     109    unsigned int   sh_info;		/* ELF section information.  */
     110    bfd_vma        sh_flags;		/* ELF section flags.  */
     111    flagword       flags;
     112  };
     113  
     114  #define OBJ_SYMFIELD_TYPE struct elf_obj_sy
     115  
     116  #ifndef obj_begin
     117  #define obj_begin() elf_begin ()
     118  #endif
     119  extern void elf_begin (void);
     120  
     121  #ifndef obj_end
     122  #define obj_end() elf_end ()
     123  #endif
     124  extern void elf_end (void);
     125  
     126  #ifndef LOCAL_LABEL_PREFIX
     127  #define LOCAL_LABEL_PREFIX '.'
     128  #endif
     129  
     130  /* should be conditional on address size! */
     131  #define elf_symbol(asymbol) ((elf_symbol_type *) (&(asymbol)->the_bfd))
     132  
     133  #ifndef S_GET_SIZE
     134  #define S_GET_SIZE(S) \
     135    (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_size)
     136  #endif
     137  #ifndef S_SET_SIZE
     138  #define S_SET_SIZE(S,V) \
     139    (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_size = (V))
     140  #endif
     141  
     142  #ifndef S_GET_ALIGN
     143  #define S_GET_ALIGN(S) \
     144    (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_value)
     145  #endif
     146  #ifndef S_SET_ALIGN
     147  #define S_SET_ALIGN(S,V) \
     148    (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_value = (V))
     149  #endif
     150  
     151  int elf_s_get_other (symbolS *);
     152  #ifndef S_GET_OTHER
     153  #define S_GET_OTHER(S)	(elf_s_get_other (S))
     154  #endif
     155  #ifndef S_SET_OTHER
     156  #define S_SET_OTHER(S,V) \
     157    (elf_symbol (symbol_get_bfdsym (S))->internal_elf_sym.st_other = (V))
     158  #endif
     159  
     160  extern asection *gdb_section;
     161  
     162  #ifndef obj_frob_file
     163  #define obj_frob_file  elf_frob_file
     164  #endif
     165  extern void elf_frob_file (void);
     166  
     167  #ifndef obj_frob_file_before_adjust
     168  #define obj_frob_file_before_adjust  elf_frob_file_before_adjust
     169  #endif
     170  extern void elf_frob_file_before_adjust (void);
     171  
     172  #ifndef obj_frob_file_after_relocs
     173  #define obj_frob_file_after_relocs  elf_frob_file_after_relocs
     174  #endif
     175  extern void elf_frob_file_after_relocs (void);
     176  
     177  /* If the target doesn't have special processing for labels, take care of
     178     dwarf2 output at the object file level.  */
     179  #ifndef tc_frob_label
     180  #include "dwarf2dbg.h"
     181  #define obj_frob_label  dwarf2_emit_label
     182  #endif
     183  
     184  #ifndef obj_app_file
     185  #define obj_app_file elf_file_symbol
     186  #endif
     187  extern void elf_file_symbol (const char *);
     188  
     189  extern void obj_elf_section_change_hook (void);
     190  
     191  extern void obj_elf_section (int);
     192  extern const char * obj_elf_section_name (void);
     193  extern void obj_elf_previous (int);
     194  extern void obj_elf_version (int);
     195  extern void obj_elf_common (int);
     196  extern void obj_elf_bss (int);
     197  extern void obj_elf_data (int);
     198  extern void obj_elf_text (int);
     199  extern void obj_elf_change_section
     200    (const char *, unsigned int, bfd_vma, int, struct elf_section_match *,
     201     int, int);
     202  extern void obj_elf_vtable_inherit (int);
     203  extern void obj_elf_vtable_entry (int);
     204  extern struct fix * obj_elf_get_vtable_inherit (void);
     205  extern struct fix * obj_elf_get_vtable_entry (void);
     206  extern bool obj_elf_seen_attribute
     207    (int, unsigned int);
     208  extern int obj_elf_vendor_attribute (int);
     209  
     210  /* BFD wants to write the udata field, which is a no-no for the
     211     predefined section symbols in bfd/section.c.  They are read-only.  */
     212  #ifndef obj_sec_sym_ok_for_reloc
     213  #define obj_sec_sym_ok_for_reloc(SEC)	((SEC)->owner != 0)
     214  #endif
     215  
     216  void elf_obj_read_begin_hook (void);
     217  #ifndef obj_read_begin_hook
     218  #define obj_read_begin_hook	elf_obj_read_begin_hook
     219  #endif
     220  
     221  void elf_obj_symbol_new_hook (symbolS *);
     222  #ifndef obj_symbol_new_hook
     223  #define obj_symbol_new_hook	elf_obj_symbol_new_hook
     224  #endif
     225  
     226  void elf_obj_symbol_clone_hook (symbolS *, symbolS *);
     227  #ifndef obj_symbol_clone_hook
     228  #define obj_symbol_clone_hook	elf_obj_symbol_clone_hook
     229  #endif
     230  
     231  void elf_copy_symbol_attributes (symbolS *, symbolS *);
     232  #ifndef OBJ_COPY_SYMBOL_ATTRIBUTES
     233  #define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
     234    (elf_copy_symbol_attributes (DEST, SRC))
     235  #endif
     236  
     237  void elf_adjust_symtab (void);
     238  #ifndef obj_adjust_symtab
     239  #define obj_adjust_symtab	elf_adjust_symtab
     240  #endif
     241  
     242  #ifndef SEPARATE_STAB_SECTIONS
     243  /* Avoid ifndef each separate macro setting by wrapping the whole of the
     244     stab group on the assumption that whoever sets SEPARATE_STAB_SECTIONS
     245     caters to ECOFF_DEBUGGING and the right setting of INIT_STAB_SECTIONS
     246     and OBJ_PROCESS_STAB too, without needing the tweaks below.  */
     247  
     248  /* Stabs go in a separate section.  */
     249  #define SEPARATE_STAB_SECTIONS 1
     250  
     251  /* We need 12 bytes at the start of the section to hold some initial
     252     information.  */
     253  extern void obj_elf_init_stab_section (segT);
     254  #define INIT_STAB_SECTION(seg) obj_elf_init_stab_section (seg)
     255  
     256  #ifdef ECOFF_DEBUGGING
     257  /* We smuggle stabs in ECOFF rather than using a separate section.
     258     The Irix linker can not handle a separate stabs section.  */
     259  
     260  #undef  SEPARATE_STAB_SECTIONS
     261  #define SEPARATE_STAB_SECTIONS (!ECOFF_DEBUGGING)
     262  
     263  #undef  INIT_STAB_SECTION
     264  #define INIT_STAB_SECTION(seg) \
     265    ((void) (ECOFF_DEBUGGING ? 0 : (obj_elf_init_stab_section (seg), 0)))
     266  
     267  #undef OBJ_PROCESS_STAB
     268  #define OBJ_PROCESS_STAB(seg, what, string, type, other, desc)		\
     269    if (ECOFF_DEBUGGING)							\
     270      ecoff_stab ((seg), (what), (string), (type), (other), (desc))
     271  #endif /* ECOFF_DEBUGGING */
     272  
     273  #endif /* SEPARATE_STAB_SECTIONS not defined.  */
     274  
     275  extern void elf_frob_symbol (symbolS *, int *);
     276  #ifndef obj_frob_symbol
     277  #define obj_frob_symbol(symp, punt) elf_frob_symbol (symp, &punt)
     278  #endif
     279  
     280  extern void elf_fixup_removed_symbol (symbolS **);
     281  #ifndef obj_fixup_removed_symbol
     282  #define obj_fixup_removed_symbol(sympp) elf_fixup_removed_symbol (sympp)
     283  #endif
     284  
     285  extern void elf_pop_insert (void);
     286  #ifndef obj_pop_insert
     287  #define obj_pop_insert()	elf_pop_insert()
     288  #endif
     289  
     290  #ifndef OBJ_MAYBE_ELF
     291  /* If OBJ_MAYBE_ELF then obj-multi.h will define obj_ecoff_set_ext.  */
     292  #define obj_ecoff_set_ext elf_ecoff_set_ext
     293  struct ecoff_extr;
     294  extern void elf_ecoff_set_ext (symbolS *, struct ecoff_extr *);
     295  #endif
     296  extern asection *elf_com_section_ptr;
     297  extern symbolS * elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP,
     298  				   addressT size);
     299  
     300  #endif /* _OBJ_ELF_H */