| Index: bfd/elf32-m68k.c
|
| diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c
|
| index bd660e9849e7380c556409abf28984a8feea284f..6946841e4458934fa8f032b60017717ade9b796d 100644
|
| --- a/bfd/elf32-m68k.c
|
| +++ b/bfd/elf32-m68k.c
|
| @@ -1,6 +1,6 @@
|
| /* Motorola 68k series support for 32-bit ELF
|
| Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
| - 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
| + 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
| Free Software Foundation, Inc.
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
| @@ -28,42 +28,11 @@
|
| #include "elf/m68k.h"
|
| #include "opcode/m68k.h"
|
|
|
| -static reloc_howto_type *reloc_type_lookup
|
| - PARAMS ((bfd *, bfd_reloc_code_real_type));
|
| -static void rtype_to_howto
|
| - PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
|
| -static struct bfd_hash_entry *elf_m68k_link_hash_newfunc
|
| - PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
|
| -static struct bfd_link_hash_table *elf_m68k_link_hash_table_create
|
| - PARAMS ((bfd *));
|
| -static bfd_boolean elf_m68k_check_relocs
|
| - PARAMS ((bfd *, struct bfd_link_info *, asection *,
|
| - const Elf_Internal_Rela *));
|
| -static bfd_boolean elf_m68k_adjust_dynamic_symbol
|
| - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
|
| -static bfd_boolean elf_m68k_size_dynamic_sections
|
| - PARAMS ((bfd *, struct bfd_link_info *));
|
| -static bfd_boolean elf_m68k_discard_copies
|
| - PARAMS ((struct elf_link_hash_entry *, PTR));
|
| -static bfd_boolean elf_m68k_relocate_section
|
| - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
|
| - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
|
| -static bfd_boolean elf_m68k_finish_dynamic_symbol
|
| - PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
|
| - Elf_Internal_Sym *));
|
| -static bfd_boolean elf_m68k_finish_dynamic_sections
|
| - PARAMS ((bfd *, struct bfd_link_info *));
|
| -
|
| -static bfd_boolean elf32_m68k_set_private_flags
|
| - PARAMS ((bfd *, flagword));
|
| -static bfd_boolean elf32_m68k_merge_private_bfd_data
|
| - PARAMS ((bfd *, bfd *));
|
| -static bfd_boolean elf32_m68k_print_private_bfd_data
|
| - PARAMS ((bfd *, PTR));
|
| -static enum elf_reloc_type_class elf32_m68k_reloc_type_class
|
| - PARAMS ((const Elf_Internal_Rela *));
|
| -
|
| -static reloc_howto_type howto_table[] = {
|
| +static bfd_boolean
|
| +elf_m68k_discard_copies (struct elf_link_hash_entry *, void *);
|
| +
|
| +static reloc_howto_type howto_table[] =
|
| +{
|
| HOWTO(R_68K_NONE, 0, 0, 0, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_NONE", FALSE, 0, 0x00000000,FALSE),
|
| HOWTO(R_68K_32, 0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32", FALSE, 0, 0xffffffff,FALSE),
|
| HOWTO(R_68K_16, 0, 1,16, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16", FALSE, 0, 0x0000ffff,FALSE),
|
| @@ -441,9 +410,8 @@ static const struct
|
| };
|
|
|
| static reloc_howto_type *
|
| -reloc_type_lookup (abfd, code)
|
| - bfd *abfd ATTRIBUTE_UNUSED;
|
| - bfd_reloc_code_real_type code;
|
| +reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
| + bfd_reloc_code_real_type code)
|
| {
|
| unsigned int i;
|
| for (i = 0; i < sizeof (reloc_map) / sizeof (reloc_map[0]); i++)
|
| @@ -1145,9 +1113,7 @@ elf_m68k_final_write_processing (bfd *abfd,
|
| /* Keep m68k-specific flags in the ELF header. */
|
|
|
| static bfd_boolean
|
| -elf32_m68k_set_private_flags (abfd, flags)
|
| - bfd *abfd;
|
| - flagword flags;
|
| +elf32_m68k_set_private_flags (bfd *abfd, flagword flags)
|
| {
|
| elf_elfheader (abfd)->e_flags = flags;
|
| elf_flags_init (abfd) = TRUE;
|
| @@ -1157,9 +1123,7 @@ elf32_m68k_set_private_flags (abfd, flags)
|
| /* Merge backend specific data from an object file to the output
|
| object file when linking. */
|
| static bfd_boolean
|
| -elf32_m68k_merge_private_bfd_data (ibfd, obfd)
|
| - bfd *ibfd;
|
| - bfd *obfd;
|
| +elf32_m68k_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
|
| {
|
| flagword out_flags;
|
| flagword in_flags;
|
| @@ -2468,7 +2432,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info)
|
| {
|
| asection *s;
|
|
|
| - s = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".got");
|
| + s = bfd_get_linker_section (elf_hash_table (info)->dynobj, ".got");
|
| if (s != NULL)
|
| s->size = arg_.offset;
|
| else
|
| @@ -2477,7 +2441,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info)
|
| BFD_ASSERT (arg_.slots_relas_diff <= arg_.n_slots);
|
| arg_.n_slots -= arg_.slots_relas_diff;
|
|
|
| - s = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".rela.got");
|
| + s = bfd_get_linker_section (elf_hash_table (info)->dynobj, ".rela.got");
|
| if (s != NULL)
|
| s->size = arg_.n_slots * sizeof (Elf32_External_Rela);
|
| else
|
| @@ -2581,11 +2545,10 @@ elf_m68k_copy_indirect_symbol (struct bfd_link_info *info,
|
| table. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_check_relocs (abfd, info, sec, relocs)
|
| - bfd *abfd;
|
| - struct bfd_link_info *info;
|
| - asection *sec;
|
| - const Elf_Internal_Rela *relocs;
|
| +elf_m68k_check_relocs (bfd *abfd,
|
| + struct bfd_link_info *info,
|
| + asection *sec,
|
| + const Elf_Internal_Rela *relocs)
|
| {
|
| bfd *dynobj;
|
| Elf_Internal_Shdr *symtab_hdr;
|
| @@ -2675,24 +2638,22 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
|
|
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| BFD_ASSERT (sgot != NULL);
|
| }
|
|
|
| if (srelgot == NULL
|
| && (h != NULL || info->shared))
|
| {
|
| - srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + srelgot = bfd_get_linker_section (dynobj, ".rela.got");
|
| if (srelgot == NULL)
|
| {
|
| - srelgot = bfd_make_section_with_flags (dynobj,
|
| - ".rela.got",
|
| - (SEC_ALLOC
|
| - | SEC_LOAD
|
| - | SEC_HAS_CONTENTS
|
| - | SEC_IN_MEMORY
|
| - | SEC_LINKER_CREATED
|
| - | SEC_READONLY));
|
| + flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
|
| + | SEC_IN_MEMORY | SEC_LINKER_CREATED
|
| + | SEC_READONLY);
|
| + srelgot = bfd_make_section_anyway_with_flags (dynobj,
|
| + ".rela.got",
|
| + flags);
|
| if (srelgot == NULL
|
| || !bfd_set_section_alignment (dynobj, srelgot, 2))
|
| return FALSE;
|
| @@ -2827,7 +2788,7 @@ elf_m68k_check_relocs (abfd, info, sec, relocs)
|
| turns out to be a function defined by a dynamic object. */
|
| h->plt.refcount++;
|
|
|
| - if (!info->shared)
|
| + if (info->executable)
|
| /* This symbol needs a non-GOT reference. */
|
| h->non_got_ref = 1;
|
| }
|
| @@ -3130,9 +3091,8 @@ elf_m68k_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| understand. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_adjust_dynamic_symbol (info, h)
|
| - struct bfd_link_info *info;
|
| - struct elf_link_hash_entry *h;
|
| +elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| + struct elf_link_hash_entry *h)
|
| {
|
| struct elf_m68k_link_hash_table *htab;
|
| bfd *dynobj;
|
| @@ -3182,7 +3142,7 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
| return FALSE;
|
| }
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".plt");
|
| + s = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (s != NULL);
|
|
|
| /* If this is the first .plt entry, make room for the special
|
| @@ -3209,12 +3169,12 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
|
|
| /* We also need to make an entry in the .got.plt section, which
|
| will be placed in the .got section by the linker script. */
|
| - s = bfd_get_section_by_name (dynobj, ".got.plt");
|
| + s = bfd_get_linker_section (dynobj, ".got.plt");
|
| BFD_ASSERT (s != NULL);
|
| s->size += 4;
|
|
|
| /* We also need to make an entry in the .rela.plt section. */
|
| - s = bfd_get_section_by_name (dynobj, ".rela.plt");
|
| + s = bfd_get_linker_section (dynobj, ".rela.plt");
|
| BFD_ASSERT (s != NULL);
|
| s->size += sizeof (Elf32_External_Rela);
|
|
|
| @@ -3252,13 +3212,6 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
| if (!h->non_got_ref)
|
| return TRUE;
|
|
|
| - if (h->size == 0)
|
| - {
|
| - (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
|
| - h->root.root.string);
|
| - return TRUE;
|
| - }
|
| -
|
| /* We must allocate the symbol in our .dynbss section, which will
|
| become part of the .bss section of the executable. There will be
|
| an entry for this symbol in the .dynsym section. The dynamic
|
| @@ -3269,18 +3222,18 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
| both the dynamic object and the regular object will refer to the
|
| same memory location for the variable. */
|
|
|
| - s = bfd_get_section_by_name (dynobj, ".dynbss");
|
| + s = bfd_get_linker_section (dynobj, ".dynbss");
|
| BFD_ASSERT (s != NULL);
|
|
|
| /* We must generate a R_68K_COPY reloc to tell the dynamic linker to
|
| copy the initial value out of the dynamic object and into the
|
| runtime process image. We need to remember the offset into the
|
| .rela.bss section we are going to use. */
|
| - if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
|
| + if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
|
| {
|
| asection *srel;
|
|
|
| - srel = bfd_get_section_by_name (dynobj, ".rela.bss");
|
| + srel = bfd_get_linker_section (dynobj, ".rela.bss");
|
| BFD_ASSERT (srel != NULL);
|
| srel->size += sizeof (Elf32_External_Rela);
|
| h->needs_copy = 1;
|
| @@ -3292,9 +3245,8 @@ elf_m68k_adjust_dynamic_symbol (info, h)
|
| /* Set the sizes of the dynamic sections. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_size_dynamic_sections (output_bfd, info)
|
| - bfd *output_bfd ATTRIBUTE_UNUSED;
|
| - struct bfd_link_info *info;
|
| +elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| + struct bfd_link_info *info)
|
| {
|
| bfd *dynobj;
|
| asection *s;
|
| @@ -3309,7 +3261,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
|
| /* Set the contents of the .interp section to the interpreter. */
|
| if (info->executable)
|
| {
|
| - s = bfd_get_section_by_name (dynobj, ".interp");
|
| + s = bfd_get_linker_section (dynobj, ".interp");
|
| BFD_ASSERT (s != NULL);
|
| s->size = sizeof ELF_DYNAMIC_INTERPRETER;
|
| s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
|
| @@ -3322,7 +3274,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
|
| not actually use these entries. Reset the size of .rela.got,
|
| which will cause it to get stripped from the output file
|
| below. */
|
| - s = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + s = bfd_get_linker_section (dynobj, ".rela.got");
|
| if (s != NULL)
|
| s->size = 0;
|
| }
|
| @@ -3336,7 +3288,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
|
| if (info->shared)
|
| elf_link_hash_traverse (elf_hash_table (info),
|
| elf_m68k_discard_copies,
|
| - (PTR) info);
|
| + info);
|
|
|
| /* The check_relocs and adjust_dynamic_symbol entry points have
|
| determined the sizes of the various dynamic sections. Allocate
|
| @@ -3464,9 +3416,8 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
|
| case. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_discard_copies (h, inf)
|
| - struct elf_link_hash_entry *h;
|
| - PTR inf;
|
| +elf_m68k_discard_copies (struct elf_link_hash_entry *h,
|
| + void * inf)
|
| {
|
| struct bfd_link_info *info = (struct bfd_link_info *) inf;
|
| struct elf_m68k_pcrel_relocs_copied *s;
|
| @@ -3486,6 +3437,18 @@ elf_m68k_discard_copies (h, inf)
|
| }
|
| }
|
|
|
| + /* Make sure undefined weak symbols are output as a dynamic symbol
|
| + in PIEs. */
|
| + if (h->non_got_ref
|
| + && h->root.type == bfd_link_hash_undefweak
|
| + && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|
| + && h->dynindx == -1
|
| + && !h->forced_local)
|
| + {
|
| + if (! bfd_elf_link_record_dynamic_symbol (info, h))
|
| + return FALSE;
|
| + }
|
| +
|
| return TRUE;
|
| }
|
|
|
| @@ -3639,16 +3602,14 @@ elf_m68k_init_got_entry_local_shared (struct bfd_link_info *info,
|
| /* Relocate an M68K ELF section. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
| - contents, relocs, local_syms, local_sections)
|
| - bfd *output_bfd;
|
| - struct bfd_link_info *info;
|
| - bfd *input_bfd;
|
| - asection *input_section;
|
| - bfd_byte *contents;
|
| - Elf_Internal_Rela *relocs;
|
| - Elf_Internal_Sym *local_syms;
|
| - asection **local_sections;
|
| +elf_m68k_relocate_section (bfd *output_bfd,
|
| + struct bfd_link_info *info,
|
| + bfd *input_bfd,
|
| + asection *input_section,
|
| + bfd_byte *contents,
|
| + Elf_Internal_Rela *relocs,
|
| + Elf_Internal_Sym *local_syms,
|
| + asection **local_sections)
|
| {
|
| bfd *dynobj;
|
| Elf_Internal_Shdr *symtab_hdr;
|
| @@ -3717,9 +3678,9 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
| unresolved_reloc, warned);
|
| }
|
|
|
| - if (sec != NULL && elf_discarded_section (sec))
|
| + if (sec != NULL && discarded_section (sec))
|
| RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
| - rel, relend, howto, contents);
|
| + rel, 1, relend, howto, 0, contents);
|
|
|
| if (info->relocatable)
|
| continue;
|
| @@ -3741,7 +3702,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
|
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
|
|
| if (sgot != NULL)
|
| sgot_output_offset = sgot->output_offset;
|
| @@ -3816,7 +3777,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
|
|
| if (sgot == NULL)
|
| {
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| BFD_ASSERT (sgot != NULL);
|
| }
|
|
|
| @@ -3887,7 +3848,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
| {
|
| if (srela == NULL)
|
| {
|
| - srela = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + srela = bfd_get_linker_section (dynobj, ".rela.got");
|
| BFD_ASSERT (srela != NULL);
|
| }
|
|
|
| @@ -3955,7 +3916,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
| case R_68K_TLS_LE32:
|
| case R_68K_TLS_LE16:
|
| case R_68K_TLS_LE8:
|
| - if (info->shared)
|
| + if (info->shared && !info->pie)
|
| {
|
| (*_bfd_error_handler)
|
| (_("%B(%A+0x%lx): R_68K_TLS_LE32 relocation not permitted "
|
| @@ -3991,7 +3952,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
|
|
| if (splt == NULL)
|
| {
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (splt != NULL);
|
| }
|
|
|
| @@ -4010,7 +3971,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section,
|
|
|
| if (splt == NULL)
|
| {
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (splt != NULL);
|
| }
|
|
|
| @@ -4264,11 +4225,10 @@ elf_m68k_install_pc32 (asection *sec, bfd_vma offset, bfd_vma value)
|
| dynamic sections here. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
| - bfd *output_bfd;
|
| - struct bfd_link_info *info;
|
| - struct elf_link_hash_entry *h;
|
| - Elf_Internal_Sym *sym;
|
| +elf_m68k_finish_dynamic_symbol (bfd *output_bfd,
|
| + struct bfd_link_info *info,
|
| + struct elf_link_hash_entry *h,
|
| + Elf_Internal_Sym *sym)
|
| {
|
| bfd *dynobj;
|
|
|
| @@ -4291,9 +4251,9 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
| BFD_ASSERT (h->dynindx != -1);
|
|
|
| plt_info = elf_m68k_hash_table (info)->plt_info;
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| - sgot = bfd_get_section_by_name (dynobj, ".got.plt");
|
| - srela = bfd_get_section_by_name (dynobj, ".rela.plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| + sgot = bfd_get_linker_section (dynobj, ".got.plt");
|
| + srela = bfd_get_linker_section (dynobj, ".rela.plt");
|
| BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
|
|
|
| /* Get the index in the procedure linkage table which
|
| @@ -4358,8 +4318,8 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
| /* This symbol has an entry in the global offset table. Set it
|
| up. */
|
|
|
| - sgot = bfd_get_section_by_name (dynobj, ".got");
|
| - srela = bfd_get_section_by_name (dynobj, ".rela.got");
|
| + sgot = bfd_get_linker_section (dynobj, ".got");
|
| + srela = bfd_get_linker_section (dynobj, ".rela.got");
|
| BFD_ASSERT (sgot != NULL && srela != NULL);
|
|
|
| got_entry = elf_m68k_hash_entry (h)->glist;
|
| @@ -4482,8 +4442,7 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
| && (h->root.type == bfd_link_hash_defined
|
| || h->root.type == bfd_link_hash_defweak));
|
|
|
| - s = bfd_get_section_by_name (h->root.u.def.section->owner,
|
| - ".rela.bss");
|
| + s = bfd_get_linker_section (dynobj, ".rela.bss");
|
| BFD_ASSERT (s != NULL);
|
|
|
| rela.r_offset = (h->root.u.def.value
|
| @@ -4495,20 +4454,13 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym)
|
| bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
|
| }
|
|
|
| - /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
|
| - if (strcmp (h->root.root.string, "_DYNAMIC") == 0
|
| - || h == elf_hash_table (info)->hgot)
|
| - sym->st_shndx = SHN_ABS;
|
| -
|
| return TRUE;
|
| }
|
|
|
| /* Finish up the dynamic sections. */
|
|
|
| static bfd_boolean
|
| -elf_m68k_finish_dynamic_sections (output_bfd, info)
|
| - bfd *output_bfd;
|
| - struct bfd_link_info *info;
|
| +elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| {
|
| bfd *dynobj;
|
| asection *sgot;
|
| @@ -4516,16 +4468,16 @@ elf_m68k_finish_dynamic_sections (output_bfd, info)
|
|
|
| dynobj = elf_hash_table (info)->dynobj;
|
|
|
| - sgot = bfd_get_section_by_name (dynobj, ".got.plt");
|
| + sgot = bfd_get_linker_section (dynobj, ".got.plt");
|
| BFD_ASSERT (sgot != NULL);
|
| - sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
|
| + sdyn = bfd_get_linker_section (dynobj, ".dynamic");
|
|
|
| if (elf_hash_table (info)->dynamic_sections_created)
|
| {
|
| asection *splt;
|
| Elf32_External_Dyn *dyncon, *dynconend;
|
|
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| BFD_ASSERT (splt != NULL && sdyn != NULL);
|
|
|
| dyncon = (Elf32_External_Dyn *) sdyn->contents;
|
| @@ -4652,7 +4604,7 @@ bfd_m68k_elf32_create_embedded_relocs (abfd, info, datasec, relsec, errmsg)
|
|
|
| /* Get a copy of the native relocations. */
|
| internal_relocs = (_bfd_elf_link_read_relocs
|
| - (abfd, datasec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
|
| + (abfd, datasec, NULL, (Elf_Internal_Rela *) NULL,
|
| info->keep_memory));
|
| if (internal_relocs == NULL)
|
| goto error_return;
|
| @@ -4790,8 +4742,7 @@ bfd_elf_m68k_set_target_options (struct bfd_link_info *info, int got_handling)
|
| }
|
|
|
| static enum elf_reloc_type_class
|
| -elf32_m68k_reloc_type_class (rela)
|
| - const Elf_Internal_Rela *rela;
|
| +elf32_m68k_reloc_type_class (const Elf_Internal_Rela *rela)
|
| {
|
| switch ((int) ELF32_R_TYPE (rela->r_info))
|
| {
|
| @@ -4816,6 +4767,69 @@ elf_m68k_plt_sym_val (bfd_vma i, const asection *plt,
|
| return plt->vma + (i + 1) * elf_m68k_get_plt_info (plt->owner)->size;
|
| }
|
|
|
| +/* Support for core dump NOTE sections. */
|
| +
|
| +static bfd_boolean
|
| +elf_m68k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
|
| +{
|
| + int offset;
|
| + size_t size;
|
| +
|
| + switch (note->descsz)
|
| + {
|
| + default:
|
| + return FALSE;
|
| +
|
| + case 154: /* Linux/m68k */
|
| + /* pr_cursig */
|
| + elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
|
| +
|
| + /* pr_pid */
|
| + elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 22);
|
| +
|
| + /* pr_reg */
|
| + offset = 70;
|
| + size = 80;
|
| +
|
| + break;
|
| + }
|
| +
|
| + /* Make a ".reg/999" section. */
|
| + return _bfd_elfcore_make_pseudosection (abfd, ".reg",
|
| + size, note->descpos + offset);
|
| +}
|
| +
|
| +static bfd_boolean
|
| +elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| +{
|
| + switch (note->descsz)
|
| + {
|
| + default:
|
| + return FALSE;
|
| +
|
| + case 124: /* Linux/m68k elf_prpsinfo. */
|
| + elf_tdata (abfd)->core_pid
|
| + = bfd_get_32 (abfd, note->descdata + 12);
|
| + elf_tdata (abfd)->core_program
|
| + = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
|
| + elf_tdata (abfd)->core_command
|
| + = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
|
| + }
|
| +
|
| + /* Note that for some reason, a spurious space is tacked
|
| + onto the end of the args in some (at least one anyway)
|
| + implementations, so strip it off if it exists. */
|
| + {
|
| + char *command = elf_tdata (abfd)->core_command;
|
| + int n = strlen (command);
|
| +
|
| + if (n > 0 && command[n - 1] == ' ')
|
| + command[n - 1] = '\0';
|
| + }
|
| +
|
| + return TRUE;
|
| +}
|
| +
|
| #define TARGET_BIG_SYM bfd_elf32_m68k_vec
|
| #define TARGET_BIG_NAME "elf32-m68k"
|
| #define ELF_MACHINE_CODE EM_68K
|
| @@ -4855,6 +4869,8 @@ elf_m68k_plt_sym_val (bfd_vma i, const asection *plt,
|
| #define elf_backend_reloc_type_class elf32_m68k_reloc_type_class
|
| #define elf_backend_plt_sym_val elf_m68k_plt_sym_val
|
| #define elf_backend_object_p elf32_m68k_object_p
|
| +#define elf_backend_grok_prstatus elf_m68k_grok_prstatus
|
| +#define elf_backend_grok_psinfo elf_m68k_grok_psinfo
|
|
|
| #define elf_backend_can_gc_sections 1
|
| #define elf_backend_can_refcount 1
|
|
|