projects
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Introduce event_location_up
[binutils-gdb.git]
/
bfd
/
elf32-mcore.c
diff --git
a/bfd/elf32-mcore.c
b/bfd/elf32-mcore.c
index 9034671c6e06ae8d4ad02acda4225ef9fbd3dc7e..79c0da606ac7b75aeb8ed0241303cae09c7989ab 100644
(file)
--- a/
bfd/elf32-mcore.c
+++ b/
bfd/elf32-mcore.c
@@
-1,12
+1,11
@@
/* Motorola MCore specific support for 32-bit ELF
/* Motorola MCore specific support for 32-bit ELF
- Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
+ Copyright (C) 1994-2017 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
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,
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@
-16,14
+15,15
@@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
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. */
+
/* This file is based on a preliminary RCE ELF ABI. The
information may not match the final RCE ELF ABI. */
/* This file is based on a preliminary RCE ELF ABI. The
information may not match the final RCE ELF ABI. */
-#include "bfd.h"
#include "sysdep.h"
#include "sysdep.h"
+#include "bfd.h"
#include "bfdlink.h"
#include "libbfd.h"
#include "elf-bfd.h"
#include "bfdlink.h"
#include "libbfd.h"
#include "elf-bfd.h"
@@
-49,13
+49,14
@@
mcore_elf_set_private_flags (bfd * abfd, flagword flags)
object file when linking. */
static bfd_boolean
object file when linking. */
static bfd_boolean
-mcore_elf_merge_private_bfd_data (bfd *
ibfd, bfd * obfd
)
+mcore_elf_merge_private_bfd_data (bfd *
ibfd, struct bfd_link_info *info
)
{
{
+ bfd *obfd = info->output_bfd;
flagword old_flags;
flagword new_flags;
flagword old_flags;
flagword new_flags;
- /* Check if we have the same endianess. */
- if (! _bfd_generic_verify_endian_match (ibfd,
obfd
))
+ /* Check if we have the same endian
n
ess. */
+ if (! _bfd_generic_verify_endian_match (ibfd,
info
))
return FALSE;
if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
return FALSE;
if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour
@@
-88,13
+89,14
@@
static bfd_reloc_status_type
mcore_elf_unsupported_reloc (bfd * abfd,
arelent * reloc_entry,
asymbol * symbol ATTRIBUTE_UNUSED,
mcore_elf_unsupported_reloc (bfd * abfd,
arelent * reloc_entry,
asymbol * symbol ATTRIBUTE_UNUSED,
-
PTR
data ATTRIBUTE_UNUSED,
+
void *
data ATTRIBUTE_UNUSED,
asection * input_section ATTRIBUTE_UNUSED,
bfd * output_bfd ATTRIBUTE_UNUSED,
char ** error_message ATTRIBUTE_UNUSED)
{
BFD_ASSERT (reloc_entry->howto != (reloc_howto_type *)0);
asection * input_section ATTRIBUTE_UNUSED,
bfd * output_bfd ATTRIBUTE_UNUSED,
char ** error_message ATTRIBUTE_UNUSED)
{
BFD_ASSERT (reloc_entry->howto != (reloc_howto_type *)0);
+ /* xgettext:c-format */
_bfd_error_handler (_("%B: Relocation %s (%d) is not currently supported.\n"),
abfd,
reloc_entry->howto->name,
_bfd_error_handler (_("%B: Relocation %s (%d) is not currently supported.\n"),
abfd,
reloc_entry->howto->name,
@@
-110,11
+112,11
@@
static reloc_howto_type mcore_elf_howto_raw[] =
/* This reloc does nothing. */
HOWTO (R_MCORE_NONE, /* type */
0, /* rightshift */
/* This reloc does nothing. */
HOWTO (R_MCORE_NONE, /* type */
0, /* rightshift */
-
2
, /* size (0 = byte, 1 = short, 2 = long) */
-
32,
/* bitsize */
+
3
, /* size (0 = byte, 1 = short, 2 = long) */
+
0,
/* bitsize */
FALSE, /* pc_relative */
0, /* bitpos */
FALSE, /* pc_relative */
0, /* bitpos */
- complain_overflow_
bitfield
, /* complain_on_overflow */
+ complain_overflow_
dont
, /* complain_on_overflow */
NULL, /* special_function */
"R_MCORE_NONE", /* name */
FALSE, /* partial_inplace */
NULL, /* special_function */
"R_MCORE_NONE", /* name */
FALSE, /* partial_inplace */
@@
-317,6
+319,22
@@
mcore_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
return mcore_elf_howto_table [(int) mcore_reloc];
};
return mcore_elf_howto_table [(int) mcore_reloc];
};
+static reloc_howto_type *
+mcore_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+ const char *r_name)
+{
+ unsigned int i;
+
+ for (i = 0;
+ i < sizeof (mcore_elf_howto_raw) / sizeof (mcore_elf_howto_raw[0]);
+ i++)
+ if (mcore_elf_howto_raw[i].name != NULL
+ && strcasecmp (mcore_elf_howto_raw[i].name, r_name) == 0)
+ return &mcore_elf_howto_raw[i];
+
+ return NULL;
+}
+
/* Set the howto pointer for a RCE ELF reloc. */
static void
/* Set the howto pointer for a RCE ELF reloc. */
static void
@@
-324,13
+342,23
@@
mcore_elf_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
arelent * cache_ptr,
Elf_Internal_Rela * dst)
{
arelent * cache_ptr,
Elf_Internal_Rela * dst)
{
+ unsigned int r_type;
+
if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4])
/* Initialize howto table if needed. */
mcore_elf_howto_init ();
if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4])
/* Initialize howto table if needed. */
mcore_elf_howto_init ();
- BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_MCORE_max);
+ r_type = ELF32_R_TYPE (dst->r_info);
+ if (r_type >= R_MCORE_max)
+ {
+ /* xgettext:c-format */
+ _bfd_error_handler (_("%B: unrecognised MCore reloc number: %d"),
+ abfd, r_type);
+ bfd_set_error (bfd_error_bad_value);
+ r_type = R_MCORE_NONE;
+ }
- cache_ptr->howto = mcore_elf_howto_table [
ELF32_R_TYPE (dst->r_info)
];
+ cache_ptr->howto = mcore_elf_howto_table [
r_type
];
}
\f
/* The RELOCATE_SECTION function is called by the ELF backend linker
}
\f
/* The RELOCATE_SECTION function is called by the ELF backend linker
@@
-384,12
+412,9
@@
mcore_elf_relocate_section (bfd * output_bfd,
input_bfd,
input_section,
(long) input_section->reloc_count,
input_bfd,
input_section,
(long) input_section->reloc_count,
- (
info->relocatable
) ? " (relocatable)" : "");
+ (
bfd_link_relocatable (info)
) ? " (relocatable)" : "");
#endif
#endif
- if (info->relocatable)
- return TRUE;
-
if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4]) /* Initialize howto table if needed */
mcore_elf_howto_init ();
if (! mcore_elf_howto_table [R_MCORE_PCRELIMM8BY4]) /* Initialize howto table if needed */
mcore_elf_howto_init ();
@@
-411,6
+436,7
@@
mcore_elf_relocate_section (bfd * output_bfd,
if ((unsigned) r_type >= (unsigned) R_MCORE_max
|| ! mcore_elf_howto_table [(int)r_type])
{
if ((unsigned) r_type >= (unsigned) R_MCORE_max
|| ! mcore_elf_howto_table [(int)r_type])
{
+ /* xgettext:c-format */
_bfd_error_handler (_("%B: Unknown relocation type %d\n"),
input_bfd, (int) r_type);
_bfd_error_handler (_("%B: Unknown relocation type %d\n"),
input_bfd, (int) r_type);
@@
-425,6
+451,7
@@
mcore_elf_relocate_section (bfd * output_bfd,
/* Complain about known relocation that are not yet supported. */
if (howto->special_function == mcore_elf_unsupported_reloc)
{
/* Complain about known relocation that are not yet supported. */
if (howto->special_function == mcore_elf_unsupported_reloc)
{
+ /* xgettext:c-format */
_bfd_error_handler (_("%B: Relocation %s (%d) is not currently supported.\n"),
input_bfd,
howto->name,
_bfd_error_handler (_("%B: Relocation %s (%d) is not currently supported.\n"),
input_bfd,
howto->name,
@@
-444,14
+471,21
@@
mcore_elf_relocate_section (bfd * output_bfd,
}
else
{
}
else
{
- bfd_boolean unresolved_reloc, warned;
+ bfd_boolean unresolved_reloc, warned
, ignored
;
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
- unresolved_reloc, warned);
+ unresolved_reloc, warned
, ignored
);
}
}
+ if (sec != NULL && discarded_section (sec))
+ RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+ rel, 1, relend, howto, 0, contents);
+
+ if (bfd_link_relocatable (info))
+ continue;
+
switch (r_type)
{
default:
switch (r_type)
{
default:
@@
-566,18
+600,14
@@
mcore_elf_check_relocs (bfd * abfd,
{
Elf_Internal_Shdr * symtab_hdr;
struct elf_link_hash_entry ** sym_hashes;
{
Elf_Internal_Shdr * symtab_hdr;
struct elf_link_hash_entry ** sym_hashes;
- struct elf_link_hash_entry ** sym_hashes_end;
const Elf_Internal_Rela * rel;
const Elf_Internal_Rela * rel_end;
const Elf_Internal_Rela * rel;
const Elf_Internal_Rela * rel_end;
- if (
info->relocatable
)
+ if (
bfd_link_relocatable (info)
)
return TRUE;
symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (abfd);
return TRUE;
symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (abfd);
- sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
- if (!elf_bad_symtab (abfd))
- sym_hashes_end -= symtab_hdr->sh_info;
rel_end = relocs + sec->reloc_count;
rel_end = relocs + sec->reloc_count;
@@
-596,6
+626,10
@@
mcore_elf_check_relocs (bfd * abfd,
while (h->root.type == bfd_link_hash_indirect
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
while (h->root.type == bfd_link_hash_indirect
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ /* PR15323, ref flags aren't set for references in the same
+ object. */
+ h->root.non_ir_ref = 1;
}
switch (ELF32_R_TYPE (rel->r_info))
}
switch (ELF32_R_TYPE (rel->r_info))
@@
-610,7
+644,9
@@
mcore_elf_check_relocs (bfd * abfd,
/* This relocation describes which C++ vtable entries are actually
used. Record for later use during GC. */
case R_MCORE_GNU_VTENTRY:
/* This relocation describes which C++ vtable entries are actually
used. Record for later use during GC. */
case R_MCORE_GNU_VTENTRY:
- if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
+ BFD_ASSERT (h != NULL);
+ if (h != NULL
+ && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
return FALSE;
break;
}
return FALSE;
break;
}
@@
-626,9
+662,9
@@
static const struct bfd_elf_special_section mcore_elf_special_sections[]=
{ NULL, 0, 0, 0, 0 }
};
{ NULL, 0, 0, 0, 0 }
};
-#define TARGET_BIG_SYM
bfd_elf32_mcore_big
_vec
+#define TARGET_BIG_SYM
mcore_elf32_be
_vec
#define TARGET_BIG_NAME "elf32-mcore-big"
#define TARGET_BIG_NAME "elf32-mcore-big"
-#define TARGET_LITTLE_SYM
bfd_elf32_mcore_litt
le_vec
+#define TARGET_LITTLE_SYM
mcore_elf32_
le_vec
#define TARGET_LITTLE_NAME "elf32-mcore-little"
#define ELF_ARCH bfd_arch_mcore
#define TARGET_LITTLE_NAME "elf32-mcore-little"
#define ELF_ARCH bfd_arch_mcore
@@
-640,6
+676,7
@@
static const struct bfd_elf_special_section mcore_elf_special_sections[]=
#define bfd_elf32_bfd_merge_private_bfd_data mcore_elf_merge_private_bfd_data
#define bfd_elf32_bfd_set_private_flags mcore_elf_set_private_flags
#define bfd_elf32_bfd_reloc_type_lookup mcore_elf_reloc_type_lookup
#define bfd_elf32_bfd_merge_private_bfd_data mcore_elf_merge_private_bfd_data
#define bfd_elf32_bfd_set_private_flags mcore_elf_set_private_flags
#define bfd_elf32_bfd_reloc_type_lookup mcore_elf_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup mcore_elf_reloc_name_lookup
#define elf_backend_relocate_section mcore_elf_relocate_section
#define elf_backend_gc_mark_hook mcore_elf_gc_mark_hook
#define elf_backend_gc_sweep_hook mcore_elf_gc_sweep_hook
#define elf_backend_relocate_section mcore_elf_relocate_section
#define elf_backend_gc_mark_hook mcore_elf_gc_mark_hook
#define elf_backend_gc_sweep_hook mcore_elf_gc_sweep_hook