(root)/
binutils-2.41/
bfd/
pe-x86_64.c
       1  /* BFD back-end for Intel/AMD x86_64 PECOFF files.
       2     Copyright (C) 2006-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     Written by Kai Tietz, OneVision Software GmbH&CoKg.  */
      22  
      23  #define PEI_HEADERS
      24  #include "sysdep.h"
      25  #include "bfd.h"
      26  #include "libbfd.h"
      27  #include "libiberty.h"
      28  #include "coff/x86_64.h"
      29  #include "coff/internal.h"
      30  #include "coff/pe.h"
      31  #include "libcoff.h"
      32  
      33  #define TARGET_SYM		x86_64_pe_vec
      34  #define TARGET_NAME		"pe-x86-64"
      35  #define TARGET_SYM_BIG		x86_64_pe_big_vec
      36  #define TARGET_NAME_BIG		"pe-bigobj-x86-64"
      37  #define COFF_WITH_PE
      38  #define COFF_WITH_pex64
      39  #define COFF_WITH_PE_BIGOBJ
      40  #define PCRELOFFSET		true
      41  #if defined (USE_MINGW64_LEADING_UNDERSCORES)
      42  #define TARGET_UNDERSCORE	'_'
      43  #else
      44  #define TARGET_UNDERSCORE	0
      45  #endif
      46  #define COFF_LONG_SECTION_NAMES
      47  #define COFF_SUPPORT_GNU_LINKONCE
      48  #define COFF_LONG_FILENAMES
      49  
      50  #define COFF_SECTION_ALIGNMENT_ENTRIES \
      51  { COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
      52    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
      53  { COFF_SECTION_NAME_PARTIAL_MATCH (".data"), \
      54    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
      55  { COFF_SECTION_NAME_PARTIAL_MATCH (".rdata"), \
      56    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
      57  { COFF_SECTION_NAME_PARTIAL_MATCH (".text"), \
      58    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
      59  { COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
      60    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
      61  { COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
      62    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
      63  { COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
      64    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
      65  { COFF_SECTION_NAME_PARTIAL_MATCH (".zdebug"), \
      66    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
      67  { COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi."), \
      68    COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
      69  
      70  /* The function pex64_bfd_print_pdata is implemented in pei-x86_64.c
      71     source, but has be extended to also handle pe objects.  */
      72  extern bool pex64_bfd_print_pdata (bfd *, void *);
      73  
      74  #define bfd_pe_print_pdata   pex64_bfd_print_pdata
      75  
      76  static bool
      77  pex64_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
      78  {
      79    if (bfd_link_pde (info)
      80        && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
      81      {
      82        /* NB: When linking Windows x86-64 relocatable object files to
      83  	 generate ELF executable, create an indirect reference to
      84  	 __executable_start for __ImageBase to support R_AMD64_IMAGEBASE
      85  	 relocation which is relative to __ImageBase.  */
      86        struct bfd_link_hash_entry *h, *hi;
      87        hi = bfd_link_hash_lookup (info->hash, "__ImageBase", true, false,
      88  				 false);
      89        if (hi->type == bfd_link_hash_new
      90  	  || hi->type == bfd_link_hash_undefined
      91  	  || hi->type == bfd_link_hash_undefweak)
      92  	{
      93  	  h = bfd_link_hash_lookup (info->hash, "__executable_start",
      94  				    true, false, true);
      95  	  hi->type = bfd_link_hash_indirect;
      96  	  hi->u.i.link = h;
      97  	}
      98      }
      99  
     100    return _bfd_coff_link_add_symbols (abfd, info);
     101  }
     102  
     103  #define coff_bfd_link_add_symbols pex64_link_add_symbols
     104  
     105  #include "coff-x86_64.c"