X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fcoff-x86_64.c;h=979996ca887315e4388ba5a5641801ad1465d3fe;hb=322f9c2100806387b8ace4df7a2b940b03b3d703;hp=ec78fbfafd299d050d68c43b653c64fdb089979b;hpb=db1fe6e9e555d8f7a6350da197032cffd7fe1378;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/coff-x86_64.c b/bfd/coff-x86_64.c index ec78fbfafd..979996ca88 100644 --- a/bfd/coff-x86_64.c +++ b/bfd/coff-x86_64.c @@ -1,5 +1,5 @@ /* BFD back-end for AMD 64 COFF files. - Copyright 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2006-2014 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -17,13 +17,17 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. - + Written by Kai Tietz, OneVision Software GmbH&CoKg. */ #ifndef COFF_WITH_pex64 #define COFF_WITH_pex64 #endif +/* Note we have to make sure not to include headers twice. + Not all headers are wrapped in #ifdef guards, so we define + PEI_HEADERS to prevent double including here. */ +#ifndef PEI_HEADERS #include "sysdep.h" #include "bfd.h" #include "libbfd.h" @@ -32,6 +36,7 @@ #include "coff/pe.h" #include "libcoff.h" #include "libiberty.h" +#endif #define BADMAG(x) AMD64BADMAG(x) @@ -187,7 +192,8 @@ coff_amd64_reloc (bfd *abfd, static bfd_boolean in_reloc_p (bfd *abfd ATTRIBUTE_UNUSED, reloc_howto_type *howto) { - return ! howto->pc_relative && howto->type != R_AMD64_IMAGEBASE; + return ! howto->pc_relative && howto->type != R_AMD64_IMAGEBASE + && howto->type != R_AMD64_SECREL; } #endif /* COFF_WITH_PE */ @@ -540,21 +546,21 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, { reloc_howto_type *howto; - if (rel->r_type > ARRAY_SIZE (howto_table)) + if (rel->r_type >= ARRAY_SIZE (howto_table)) { bfd_set_error (bfd_error_bad_value); return NULL; } - if (rel->r_type >= R_AMD64_PCRLONG_1 && rel->r_type <= R_AMD64_PCRLONG_5) - { - rel->r_vaddr += (bfd_vma)(rel->r_type-R_AMD64_PCRLONG); - rel->r_type = R_AMD64_PCRLONG; - } howto = howto_table + rel->r_type; #if defined(COFF_WITH_PE) /* Cancel out code in _bfd_coff_generic_relocate_section. */ *addendp = 0; + if (rel->r_type >= R_AMD64_PCRLONG_1 && rel->r_type <= R_AMD64_PCRLONG_5) + { + *addendp -= (bfd_vma)(rel->r_type - R_AMD64_PCRLONG); + rel->r_type = R_AMD64_PCRLONG; + } #endif if (howto->pc_relative) @@ -612,19 +618,20 @@ coff_amd64_rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, { bfd_vma osect_vma; - if (h && (h->type == bfd_link_hash_defined || h->type == bfd_link_hash_defweak)) + if (h && (h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak)) osect_vma = h->root.u.def.section->output_section->vma; else { - asection *sec; + asection *s; int i; /* Sigh, the only way to get the section to offset against is to find it the hard way. */ - for (sec = abfd->sections, i = 1; i < sym->n_scnum; i++) - sec = sec->next; + for (s = abfd->sections, i = 1; i < sym->n_scnum; i++) + s = s->next; - osect_vma = sec->output_section->vma; + osect_vma = s->output_section->vma; } *addendp -= osect_vma; @@ -711,14 +718,9 @@ coff_amd64_is_local_label_name (bfd *abfd, const char *name) #endif /* TARGET_UNDERSCORE */ -#ifdef PE -#undef bfd_pe_print_pdata -#define bfd_pe_print_pdata _bfd_pex64_print_pdata -#else /* PE */ #ifndef bfd_pe_print_pdata #define bfd_pe_print_pdata NULL #endif -#endif /* PE */ #include "coffcode.h" @@ -728,6 +730,9 @@ coff_amd64_is_local_label_name (bfd *abfd, const char *name) #define amd64coff_object_p coff_object_p #endif +#define _bfd_generic_find_nearest_line_discriminator \ + coff_find_nearest_line_discriminator + const bfd_target #ifdef TARGET_SYM TARGET_SYM = @@ -746,13 +751,13 @@ const bfd_target (HAS_RELOC | EXEC_P | /* Object flags. */ HAS_LINENO | HAS_DEBUG | - HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED), + HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED | BFD_COMPRESS | BFD_DECOMPRESS), (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* Section flags. */ #if defined(COFF_WITH_PE) - | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY + | SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_READONLY | SEC_DEBUGGING #endif - | SEC_CODE | SEC_DATA), + | SEC_CODE | SEC_DATA | SEC_EXCLUDE ), #ifdef TARGET_UNDERSCORE TARGET_UNDERSCORE, /* Leading underscore. */ @@ -761,6 +766,7 @@ const bfd_target #endif '/', /* Ar_pad_char. */ 15, /* Ar_max_namelen. */ + 0, /* match priority. */ bfd_getl64, bfd_getl_signed_64, bfd_putl64, bfd_getl32, bfd_getl_signed_32, bfd_putl32,