(root)/
binutils-2.41/
bfd/
elfxx-sparc.h
       1  /* SPARC ELF specific backend routines.
       2     Copyright (C) 2005-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of BFD, the Binary File Descriptor library.
       5  
       6     This program 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 of the License, or
       9     (at your option) any later version.
      10  
      11     This program 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 this program; if not, write to the Free Software
      18     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      19     MA 02110-1301, USA.  */
      20  
      21  #include "elf/common.h"
      22  #include "elf/internal.h"
      23  
      24  struct _bfd_sparc_elf_section_data
      25  {
      26    struct bfd_elf_section_data elf;
      27    unsigned int do_relax, reloc_count;
      28  };
      29  
      30  #define sec_do_relax(sec) \
      31    ((struct _bfd_sparc_elf_section_data *) elf_section_data (sec))->do_relax
      32  #define canon_reloc_count(sec) \
      33    ((struct _bfd_sparc_elf_section_data *) elf_section_data (sec))->reloc_count
      34  
      35  struct _bfd_sparc_elf_app_reg
      36  {
      37    unsigned char bind;
      38    unsigned short shndx;
      39    bfd *abfd;
      40    char *name;
      41  };
      42  
      43  /* Sparc ELF linker hash table.  */
      44  
      45  struct _bfd_sparc_elf_link_hash_table
      46  {
      47    struct elf_link_hash_table elf;
      48  
      49    /* Short-cut to get to dynamic linker sections.  */
      50    asection *interp;
      51  
      52    union
      53    {
      54      bfd_signed_vma refcount;
      55      bfd_vma offset;
      56    } tls_ldm_got;
      57  
      58    /* Used by local STT_GNU_IFUNC symbols.  */
      59    htab_t loc_hash_table;
      60    void *loc_hash_memory;
      61  
      62    /* The (unloaded but important) .rela.plt.unloaded section, for VxWorks.  */
      63    asection *srelplt2;
      64  
      65    void (*put_word) (bfd *, bfd_vma, void *);
      66    bfd_vma (*r_info) (Elf_Internal_Rela *, bfd_vma, bfd_vma);
      67    bfd_vma (*r_symndx) (bfd_vma);
      68    int (*build_plt_entry) (bfd *, asection *, bfd_vma, bfd_vma, bfd_vma *);
      69    const char *dynamic_interpreter;
      70    int dynamic_interpreter_size;
      71    unsigned int word_align_power;
      72    unsigned int align_power_max;
      73    unsigned int plt_header_size;
      74    unsigned int plt_entry_size;
      75    int bytes_per_word;
      76    int bytes_per_rela;
      77    int dtpoff_reloc;
      78    int dtpmod_reloc;
      79    int tpoff_reloc;
      80  
      81    struct _bfd_sparc_elf_app_reg app_regs [4];
      82  };
      83  
      84  /* Get the SPARC ELF linker hash table from a link_info structure.  */
      85  
      86  #define _bfd_sparc_elf_hash_table(p) \
      87    ((is_elf_hash_table ((p)->hash)					\
      88      && elf_hash_table_id (elf_hash_table (p)) == SPARC_ELF_DATA)	\
      89     ? (struct _bfd_sparc_elf_link_hash_table *) (p)->hash : NULL)
      90  
      91  extern reloc_howto_type *_bfd_sparc_elf_reloc_type_lookup
      92    (bfd *, bfd_reloc_code_real_type);
      93  extern reloc_howto_type *_bfd_sparc_elf_reloc_name_lookup
      94    (bfd *, const char *);
      95  extern bool _bfd_sparc_elf_info_to_howto
      96    (bfd *, arelent *, Elf_Internal_Rela *);
      97  extern reloc_howto_type *_bfd_sparc_elf_info_to_howto_ptr
      98    (bfd*, unsigned int);
      99  extern bool _bfd_sparc_elf_mkobject
     100    (bfd *);
     101  extern struct bfd_link_hash_table *_bfd_sparc_elf_link_hash_table_create
     102    (bfd *);
     103  extern bool _bfd_sparc_elf_create_dynamic_sections
     104    (bfd *, struct bfd_link_info *);
     105  extern void _bfd_sparc_elf_copy_indirect_symbol
     106    (struct bfd_link_info *,
     107     struct elf_link_hash_entry *,
     108     struct elf_link_hash_entry *);
     109  extern bool _bfd_sparc_elf_check_relocs
     110    (bfd *, struct bfd_link_info *,
     111     asection *, const Elf_Internal_Rela *);
     112  extern asection *_bfd_sparc_elf_gc_mark_hook
     113    (asection *, struct bfd_link_info *,
     114     Elf_Internal_Rela *, struct elf_link_hash_entry *,
     115     Elf_Internal_Sym *);
     116  extern bool _bfd_sparc_elf_adjust_dynamic_symbol
     117    (struct bfd_link_info *, struct elf_link_hash_entry *);
     118  extern bool _bfd_sparc_elf_omit_section_dynsym
     119    (bfd *, struct bfd_link_info *, asection *);
     120  extern bool _bfd_sparc_elf_size_dynamic_sections
     121    (bfd *, struct bfd_link_info *);
     122  extern bool _bfd_sparc_elf_new_section_hook
     123    (bfd *, asection *);
     124  extern bool _bfd_sparc_elf_relax_section
     125    (bfd *, struct bfd_section *, struct bfd_link_info *, bool *);
     126  extern int _bfd_sparc_elf_relocate_section
     127    (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
     128     Elf_Internal_Rela *, Elf_Internal_Sym *, asection **);
     129  extern bool _bfd_sparc_elf_finish_dynamic_symbol
     130    (bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
     131     Elf_Internal_Sym *sym);
     132  extern bool _bfd_sparc_elf_finish_dynamic_sections
     133    (bfd *, struct bfd_link_info *);
     134  extern bool _bfd_sparc_elf_fixup_symbol
     135    (struct bfd_link_info *, struct elf_link_hash_entry *);
     136  extern bool _bfd_sparc_elf_object_p
     137    (bfd *);
     138  extern bfd_vma _bfd_sparc_elf_plt_sym_val
     139    (bfd_vma, const asection *, const arelent *);
     140  extern bool _bfd_sparc_elf_merge_private_bfd_data
     141    (bfd *, struct bfd_link_info *);