X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Felf32-m68k.c;h=10d2fcb286d7ec8f07e6ce5b41319683dfbb803b;hb=0e1862bb401f47716446aef143b2bf7a4563f541;hp=26fef9fcacb061d2326be1105e55c06df4c2d0a5;hpb=7bf52ea2ca60774385b8d2678729abb52572b594;p=binutils-gdb.git diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c index 26fef9fcacb..10d2fcb286d 100644 --- a/bfd/elf32-m68k.c +++ b/bfd/elf32-m68k.c @@ -1,7 +1,5 @@ /* 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, 2012 - Free Software Foundation, Inc. + Copyright (C) 1993-2015 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -33,7 +31,7 @@ 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_NONE, 0, 3, 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), HOWTO(R_68K_8, 0, 0, 8, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_8", FALSE, 0, 0x000000ff,FALSE), @@ -942,6 +940,23 @@ elf_m68k_link_hash_newfunc (struct bfd_hash_entry *entry, return ret; } +/* Destroy an m68k ELF linker hash table. */ + +static void +elf_m68k_link_hash_table_free (bfd *obfd) +{ + struct elf_m68k_link_hash_table *htab; + + htab = (struct elf_m68k_link_hash_table *) obfd->link.hash; + + if (htab->multi_got_.bfd2got != NULL) + { + htab_delete (htab->multi_got_.bfd2got); + htab->multi_got_.bfd2got = NULL; + } + _bfd_elf_link_hash_table_free (obfd); +} + /* Create an m68k ELF linker hash table. */ static struct bfd_link_hash_table * @@ -962,28 +977,13 @@ elf_m68k_link_hash_table_create (bfd *abfd) free (ret); return NULL; } + ret->root.root.hash_table_free = elf_m68k_link_hash_table_free; ret->multi_got_.global_symndx = 1; return &ret->root.root; } -/* Destruct local data. */ - -static void -elf_m68k_link_hash_table_free (struct bfd_link_hash_table *_htab) -{ - struct elf_m68k_link_hash_table *htab; - - htab = (struct elf_m68k_link_hash_table *) _htab; - - if (htab->multi_got_.bfd2got != NULL) - { - htab_delete (htab->multi_got_.bfd2got); - htab->multi_got_.bfd2got = NULL; - } -} - /* Set the right machine number. */ static bfd_boolean @@ -2232,7 +2232,7 @@ elf_m68k_partition_multi_got_2 (struct elf_m68k_partition_multi_got_arg *arg) arg->n_slots += arg->current_got->n_slots[R_32]; - if (!arg->info->shared) + if (!bfd_link_pic (arg->info)) /* If we are generating a shared object, we need to output a R_68K_RELATIVE reloc so that the dynamic linker can adjust this GOT entry. Overwise we @@ -2554,7 +2554,7 @@ elf_m68k_check_relocs (bfd *abfd, asection *sreloc; struct elf_m68k_got *got; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; dynobj = elf_hash_table (info)->dynobj; @@ -2583,6 +2583,10 @@ elf_m68k_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; + + /* 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)) @@ -2616,7 +2620,7 @@ elf_m68k_check_relocs (bfd *abfd, case R_68K_TLS_DTPREL32: if (ELF32_R_TYPE (rel->r_info) == R_68K_TLS_TPREL32 - && info->shared) + && bfd_link_pic (info)) /* Do the special chorus for libraries with static TLS. */ info->flags |= DF_STATIC_TLS; @@ -2637,7 +2641,7 @@ elf_m68k_check_relocs (bfd *abfd, } if (srelgot == NULL - && (h != NULL || info->shared)) + && (h != NULL || bfd_link_pic (info))) { srelgot = bfd_get_linker_section (dynobj, ".rela.got"); if (srelgot == NULL) @@ -2751,10 +2755,10 @@ elf_m68k_check_relocs (bfd *abfd, will be set later (it is never cleared). We account for that possibility below by storing information in the pcrel_relocs_copied field of the hash table entry. */ - if (!(info->shared + if (!(bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && h != NULL - && (!info->symbolic + && (!SYMBOLIC_BIND (info, h) || h->root.type == bfd_link_hash_defweak || !h->def_regular))) { @@ -2782,14 +2786,14 @@ elf_m68k_check_relocs (bfd *abfd, turns out to be a function defined by a dynamic object. */ h->plt.refcount++; - if (info->executable) + if (bfd_link_executable (info)) /* This symbol needs a non-GOT reference. */ h->non_got_ref = 1; } /* If we are creating a shared library, we need to copy the reloc into the shared library. */ - if (info->shared) + if (bfd_link_pic (info)) { /* When creating a shared object, we must copy these reloc types into the output file. We create a reloc @@ -2934,7 +2938,7 @@ elf_m68k_gc_sweep_hook (bfd *abfd, bfd *dynobj; struct elf_m68k_got *got; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; dynobj = elf_hash_table (info)->dynobj; @@ -3149,7 +3153,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info, location in the .plt. This is required to make function pointers compare as equal between the normal executable and the shared library. */ - if (!info->shared + if (!bfd_link_pic (info) && !h->def_regular) { h->root.u.def.section = s; @@ -3198,7 +3202,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info, only references to the symbol are via the global offset table. For such cases we need not do anything here; the relocations will be handled correctly by relocate_section. */ - if (info->shared) + if (bfd_link_pic (info)) return TRUE; /* If there are no references to this symbol that do not use the @@ -3233,7 +3237,7 @@ elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info, h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (h, s); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } /* Set the sizes of the dynamic sections. */ @@ -3253,7 +3257,7 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info)) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -3279,7 +3283,7 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, against symbols that have become local due to visibility changes. We allocated space for them in the check_relocs routine, but we will not fill them in in the relocate_section routine. */ - if (info->shared) + if (bfd_link_pic (info)) elf_link_hash_traverse (elf_hash_table (info), elf_m68k_discard_copies, info); @@ -3362,7 +3366,7 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, #define add_dynamic_entry(TAG, VAL) \ _bfd_elf_add_dynamic_entry (info, TAG, VAL) - if (!info->shared) + if (bfd_link_executable (info)) { if (!add_dynamic_entry (DT_DEBUG, 0)) return FALSE; @@ -3664,19 +3668,19 @@ elf_m68k_relocate_section (bfd *output_bfd, } else { - bfd_boolean warned; + bfd_boolean warned, ignored; 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 (info->relocatable) + if (bfd_link_relocatable (info)) continue; switch (r_type) @@ -3806,8 +3810,10 @@ elf_m68k_relocate_section (bfd *output_bfd, bfd_boolean dyn; dyn = elf_hash_table (info)->dynamic_sections_created; - if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) - || (info->shared + if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h) + || (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) || (ELF_ST_VISIBILITY (h->other) && h->root.type == bfd_link_hash_undefweak)) @@ -3837,7 +3843,7 @@ elf_m68k_relocate_section (bfd *output_bfd, else unresolved_reloc = FALSE; } - else if (info->shared) /* && h == NULL */ + else if (bfd_link_pic (info)) /* && h == NULL */ /* Process local symbol during dynamic link. */ { if (srela == NULL) @@ -3856,7 +3862,7 @@ elf_m68k_relocate_section (bfd *output_bfd, *off_ptr |= 1; } - else /* h == NULL && !info->shared */ + else /* h == NULL && !bfd_link_pic (info) */ { elf_m68k_init_got_entry_static (info, output_bfd, @@ -3910,7 +3916,7 @@ elf_m68k_relocate_section (bfd *output_bfd, case R_68K_TLS_LE32: case R_68K_TLS_LE16: case R_68K_TLS_LE8: - if (info->shared && !info->pie) + if (bfd_link_pic (info) && !bfd_link_pie (info)) { (*_bfd_error_handler) (_("%B(%A+0x%lx): R_68K_TLS_LE32 relocation not permitted " @@ -3983,7 +3989,7 @@ elf_m68k_relocate_section (bfd *output_bfd, case R_68K_PC8: case R_68K_PC16: case R_68K_PC32: - if (info->shared + if (bfd_link_pic (info) && r_symndx != STN_UNDEF && (input_section->flags & SEC_ALLOC) != 0 && (h == NULL @@ -4022,8 +4028,8 @@ elf_m68k_relocate_section (bfd *output_bfd, && (r_type == R_68K_PC8 || r_type == R_68K_PC16 || r_type == R_68K_PC32 - || !info->shared - || !info->symbolic + || !bfd_link_pic (info) + || !SYMBOLIC_BIND (info, h) || !h->def_regular)) { outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); @@ -4331,7 +4337,7 @@ elf_m68k_finish_dynamic_symbol (bfd *output_bfd, the symbol was forced to be local because of a version file. The entry in the global offset table already have been initialized in the relocate_section function. */ - if (info->shared + if (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h)) { bfd_vma relocation; @@ -4587,7 +4593,7 @@ bfd_m68k_elf32_create_embedded_relocs (abfd, info, datasec, relsec, errmsg) bfd_byte *p; bfd_size_type amt; - BFD_ASSERT (! info->relocatable); + BFD_ASSERT (! bfd_link_relocatable (info)); *errmsg = NULL; @@ -4736,7 +4742,9 @@ 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 (const Elf_Internal_Rela *rela) +elf32_m68k_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, + const asection *rel_sec ATTRIBUTE_UNUSED, + const Elf_Internal_Rela *rela) { switch ((int) ELF32_R_TYPE (rela->r_info)) { @@ -4776,10 +4784,10 @@ elf_m68k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) case 154: /* Linux/m68k */ /* pr_cursig */ - elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); + 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); + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 22); /* pr_reg */ offset = 70; @@ -4802,11 +4810,11 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return FALSE; case 124: /* Linux/m68k elf_prpsinfo. */ - elf_tdata (abfd)->core_pid + elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + 12); - elf_tdata (abfd)->core_program + elf_tdata (abfd)->core->program = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); - elf_tdata (abfd)->core_command + elf_tdata (abfd)->core->command = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); } @@ -4814,7 +4822,7 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 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; + char *command = elf_tdata (abfd)->core->command; int n = strlen (command); if (n > 0 && command[n - 1] == ' ') @@ -4824,7 +4832,28 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } -#define TARGET_BIG_SYM bfd_elf32_m68k_vec +/* Hook called by the linker routine which adds symbols from an object + file. */ + +static bfd_boolean +elf_m68k_add_symbol_hook (bfd *abfd, + struct bfd_link_info *info, + Elf_Internal_Sym *sym, + const char **namep ATTRIBUTE_UNUSED, + flagword *flagsp ATTRIBUTE_UNUSED, + asection **secp ATTRIBUTE_UNUSED, + bfd_vma *valp ATTRIBUTE_UNUSED) +{ + if ((ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE) + && (abfd->flags & DYNAMIC) == 0 + && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour) + elf_tdata (info->output_bfd)->has_gnu_symbols = elf_gnu_symbol_any; + + return TRUE; +} + +#define TARGET_BIG_SYM m68k_elf32_vec #define TARGET_BIG_NAME "elf32-m68k" #define ELF_MACHINE_CODE EM_68K #define ELF_MAXPAGESIZE 0x2000 @@ -4832,9 +4861,6 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) _bfd_elf_create_dynamic_sections #define bfd_elf32_bfd_link_hash_table_create \ elf_m68k_link_hash_table_create -/* ??? Should it be this macro or bfd_elfNN_bfd_link_hash_table_create? */ -#define bfd_elf32_bfd_link_hash_table_free \ - elf_m68k_link_hash_table_free #define bfd_elf32_bfd_final_link bfd_elf_final_link #define elf_backend_check_relocs elf_m68k_check_relocs @@ -4865,6 +4891,7 @@ elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) #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_add_symbol_hook elf_m68k_add_symbol_hook #define elf_backend_can_gc_sections 1 #define elf_backend_can_refcount 1