/* BFD back-end for AMD 64 COFF files.
- Copyright 2006, 2007 Free Software Foundation, Inc.
+ Copyright 2006, 2007, 2008, 2009, 2010, 2011
+ Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA.
Written by Kai Tietz, OneVision Software GmbH&CoKg. */
#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"
#include "coff/pe.h"
#include "libcoff.h"
#include "libiberty.h"
+#endif
#define BADMAG(x) AMD64BADMAG(x)
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 */
{
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)
{
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;
#endif /* TARGET_UNDERSCORE */
+#ifndef bfd_pe_print_pdata
+#define bfd_pe_print_pdata NULL
+#endif
+
#include "coffcode.h"
#ifdef PE
#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 =
(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. */
#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,