(root)/
binutils-2.41/
bfd/
coff-loongarch64.c
       1  /* BFD back-end for LoongArch64 COFF files.
       2     Copyright (C) 2022-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  
      22  #ifndef COFF_WITH_peLoongArch64
      23  #define COFF_WITH_peLoongArch64
      24  #endif
      25  
      26  /* Note we have to make sure not to include headers twice.
      27     Not all headers are wrapped in #ifdef guards, so we define
      28     PEI_HEADERS to prevent double including here.  */
      29  #ifndef PEI_HEADERS
      30  #include "sysdep.h"
      31  #include "bfd.h"
      32  #include "libbfd.h"
      33  #include "coff/loongarch64.h"
      34  #include "coff/internal.h"
      35  #include "coff/pe.h"
      36  #include "libcoff.h"
      37  #include "libiberty.h"
      38  #endif
      39  
      40  #include "libcoff.h"
      41  
      42  /* The page size is a guess based on ELF.  */
      43  
      44  #define COFF_PAGE_SIZE 0x4000
      45  
      46  /* All users of this file have bfd_octets_per_byte (abfd, sec) == 1.  */
      47  #define OCTETS_PER_BYTE(ABFD, SEC) 1
      48  
      49  #ifndef PCRELOFFSET
      50  #define PCRELOFFSET true
      51  #endif
      52  
      53  /* Currently we don't handle any relocations.  */
      54  static reloc_howto_type pe_loongarch64_std_reloc_howto[] =
      55    {
      56  
      57    };
      58  
      59  #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER  2
      60  
      61  #ifndef NUM_ELEM
      62  #define NUM_ELEM(a) ((sizeof (a)) / sizeof ((a)[0]))
      63  #endif
      64  
      65  #define NUM_RELOCS NUM_ELEM (pe_loongarch64_std_reloc_howto)
      66  
      67  #define RTYPE2HOWTO(cache_ptr, dst)             \
      68    (cache_ptr)->howto = NULL
      69  
      70  #ifndef bfd_pe_print_pdata
      71  #define bfd_pe_print_pdata      NULL
      72  #endif
      73  
      74  /* Handle include/coff/loongarch64.h external_reloc.  */
      75  #define SWAP_IN_RELOC_OFFSET	H_GET_32
      76  #define SWAP_OUT_RELOC_OFFSET	H_PUT_32
      77  
      78  /* Return TRUE if this relocation should
      79     appear in the output .reloc section.  */
      80  
      81  static bool
      82  in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
      83  	    reloc_howto_type * howto)
      84  {
      85    return !howto->pc_relative;
      86  }
      87  
      88  #include "coffcode.h"
      89  
      90  /* Target vectors.  */
      91  const bfd_target
      92  #ifdef TARGET_SYM
      93    TARGET_SYM =
      94  #else
      95    loongarch64_pei_vec =
      96  #endif
      97  {
      98  #ifdef TARGET_NAME
      99    TARGET_NAME,
     100  #else
     101   "pei-loongarch64",			/* Name.  */
     102  #endif
     103    bfd_target_coff_flavour,
     104    BFD_ENDIAN_LITTLE,		/* Data byte order is little.  */
     105    BFD_ENDIAN_LITTLE,		/* Header byte order is little.  */
     106  
     107    (HAS_RELOC | EXEC_P		/* Object flags.  */
     108     | HAS_LINENO | HAS_DEBUG
     109     | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS),
     110  
     111    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags.  */
     112  #if defined(COFF_WITH_PE)
     113     | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING
     114  #endif
     115     | SEC_CODE | SEC_DATA | SEC_EXCLUDE ),
     116  
     117  #ifdef TARGET_UNDERSCORE
     118    TARGET_UNDERSCORE,		/* Leading underscore.  */
     119  #else
     120    0,				/* Leading underscore.  */
     121  #endif
     122    '/',				/* Ar_pad_char.  */
     123    15,				/* Ar_max_namelen.  */
     124    0,				/* match priority.  */
     125    TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
     126  
     127       /* Data conversion functions.  */
     128       bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     129       bfd_getl32, bfd_getl_signed_32, bfd_putl32,
     130       bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
     131       /* Header conversion functions.  */
     132       bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     133       bfd_getl32, bfd_getl_signed_32, bfd_putl32,
     134       bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs.  */
     135  
     136    /* Note that we allow an object file to be treated as a core file as well.  */
     137    {				/* bfd_check_format.  */
     138      _bfd_dummy_target,
     139      coff_object_p,
     140      bfd_generic_archive_p,
     141      coff_object_p
     142    },
     143    {				/* bfd_set_format.  */
     144      _bfd_bool_bfd_false_error,
     145      coff_mkobject,
     146      _bfd_generic_mkarchive,
     147      _bfd_bool_bfd_false_error
     148    },
     149    {				/* bfd_write_contents.  */
     150      _bfd_bool_bfd_false_error,
     151      coff_write_object_contents,
     152      _bfd_write_archive_contents,
     153      _bfd_bool_bfd_false_error
     154    },
     155  
     156    BFD_JUMP_TABLE_GENERIC (coff),
     157    BFD_JUMP_TABLE_COPY (coff),
     158    BFD_JUMP_TABLE_CORE (_bfd_nocore),
     159    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
     160    BFD_JUMP_TABLE_SYMBOLS (coff),
     161    BFD_JUMP_TABLE_RELOCS (coff),
     162    BFD_JUMP_TABLE_WRITE (coff),
     163    BFD_JUMP_TABLE_LINK (coff),
     164    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
     165  
     166    NULL,
     167  
     168    COFF_SWAP_TABLE
     169  };