X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-frv.c;h=971073cf78ba634c9be5e7a15bfd2f58c65f9e7a;hb=7a382c1c50fca0d4bc4c2e618ff6ac222c4e2137;hp=811d5f5b3ae41ccff1992a498872219a9eeaa9f5;hpb=261b8d0859fcd2ee7a43e1b3d2db6b2496bd6d61;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index 811d5f5b3a..971073cf78 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -1,6 +1,5 @@ /* FRV-specific support for 32-bit ELF. - Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 2002-2017 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -28,67 +27,18 @@ #include "hashtab.h" /* Forward declarations. */ -static bfd_reloc_status_type elf32_frv_relocate_lo16 - PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma)); -static bfd_reloc_status_type elf32_frv_relocate_hi16 - PARAMS ((bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma)); -static bfd_reloc_status_type elf32_frv_relocate_label24 - PARAMS ((bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_vma)); -static bfd_reloc_status_type elf32_frv_relocate_gprel12 - PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, - bfd_byte *, bfd_vma)); -static bfd_reloc_status_type elf32_frv_relocate_gprelu12 - PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, - bfd_byte *, bfd_vma)); -static bfd_reloc_status_type elf32_frv_relocate_gprello - PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, - bfd_byte *, bfd_vma)); -static bfd_reloc_status_type elf32_frv_relocate_gprelhi - PARAMS ((struct bfd_link_info *, bfd *, asection *, Elf_Internal_Rela *, - bfd_byte *, bfd_vma)); -static reloc_howto_type *frv_reloc_type_lookup - PARAMS ((bfd *, bfd_reloc_code_real_type)); -static void frv_info_to_howto_rela - PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); -static bfd_boolean elf32_frv_relocate_section - PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); -static bfd_boolean elf32_frv_add_symbol_hook - PARAMS (( bfd *, struct bfd_link_info *, Elf_Internal_Sym *, - const char **, flagword *, asection **, bfd_vma *)); -static bfd_reloc_status_type frv_final_link_relocate - PARAMS ((reloc_howto_type *, bfd *, asection *, bfd_byte *, - Elf_Internal_Rela *, bfd_vma)); -static bfd_boolean elf32_frv_check_relocs - PARAMS ((bfd *, struct bfd_link_info *, asection *, - const Elf_Internal_Rela *)); -static int elf32_frv_machine - PARAMS ((bfd *)); -static bfd_boolean elf32_frv_object_p - PARAMS ((bfd *)); -static bfd_boolean frv_elf_set_private_flags - PARAMS ((bfd *, flagword)); -static bfd_boolean frv_elf_copy_private_bfd_data - PARAMS ((bfd *, bfd *)); -static bfd_boolean frv_elf_merge_private_bfd_data - PARAMS ((bfd *, bfd *)); -static bfd_boolean frv_elf_print_private_bfd_data - PARAMS ((bfd *, PTR)); -static bfd_boolean elf32_frv_grok_prstatus (bfd * abfd, - Elf_Internal_Note * note); -static bfd_boolean elf32_frv_grok_psinfo (bfd * abfd, - Elf_Internal_Note * note); + static reloc_howto_type elf32_frv_howto_table [] = { /* This reloc does nothing. */ HOWTO (R_FRV_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 */ - complain_overflow_bitfield, /* complain_on_overflow */ + complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_FRV_NONE", /* name */ FALSE, /* partial_inplace */ @@ -846,8 +796,8 @@ static reloc_howto_type elf32_frv_rel_tlsoff_howto = -extern const bfd_target bfd_elf32_frvfdpic_vec; -#define IS_FDPIC(bfd) ((bfd)->xvec == &bfd_elf32_frvfdpic_vec) +extern const bfd_target frv_elf32_fdpic_vec; +#define IS_FDPIC(bfd) ((bfd)->xvec == &frv_elf32_fdpic_vec) /* An extension of the elf hash table data structure, containing some additional FRV-specific data. */ @@ -855,16 +805,8 @@ struct frvfdpic_elf_link_hash_table { struct elf_link_hash_table elf; - /* A pointer to the .got section. */ - asection *sgot; - /* A pointer to the .rel.got section. */ - asection *sgotrel; /* A pointer to the .rofixup section. */ asection *sgotfixup; - /* A pointer to the .plt section. */ - asection *splt; - /* A pointer to the .rel.plt section. */ - asection *spltrel; /* GOT base offset. */ bfd_vma got0; /* Location of the first non-lazy PLT entry, i.e., the number of @@ -887,15 +829,15 @@ struct frvfdpic_elf_link_hash_table == FRV_ELF_DATA ? ((struct frvfdpic_elf_link_hash_table *) ((p)->hash)) : NULL) #define frvfdpic_got_section(info) \ - (frvfdpic_hash_table (info)->sgot) + (frvfdpic_hash_table (info)->elf.sgot) #define frvfdpic_gotrel_section(info) \ - (frvfdpic_hash_table (info)->sgotrel) + (frvfdpic_hash_table (info)->elf.srelgot) #define frvfdpic_gotfixup_section(info) \ (frvfdpic_hash_table (info)->sgotfixup) #define frvfdpic_plt_section(info) \ - (frvfdpic_hash_table (info)->splt) + (frvfdpic_hash_table (info)->elf.splt) #define frvfdpic_pltrel_section(info) \ - (frvfdpic_hash_table (info)->spltrel) + (frvfdpic_hash_table (info)->elf.srelplt) #define frvfdpic_relocs_info(info) \ (frvfdpic_hash_table (info)->relocs_info) #define frvfdpic_got_initial_offset(info) \ @@ -1001,7 +943,7 @@ frvfdpic_elf_link_hash_table_create (bfd *abfd) struct frvfdpic_elf_link_hash_table *ret; bfd_size_type amt = sizeof (struct frvfdpic_elf_link_hash_table); - ret = bfd_zalloc (abfd, amt); + ret = bfd_zmalloc (amt); if (ret == NULL) return NULL; @@ -1434,7 +1376,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, /* If we're linking an executable at a fixed address, we can omit the dynamic relocation as long as the symbol is local to this module. */ - if (info->executable && !info->pie + if (bfd_link_pde (info) && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h))) { @@ -1489,7 +1431,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, if (entry->symndx == -1 && ! FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h) && FRVFDPIC_SYM_LOCAL (info, entry->d.h) - && !(info->executable && !info->pie)) + && !bfd_link_pde (info)) { reloc = R_FRV_FUNCDESC; idx = elf_section_data (entry->d.h->root.u.def.section @@ -1532,7 +1474,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, dynamic symbol entry for the got section, so idx will be zero, which means we can and should compute the address of the private descriptor ourselves. */ - if (info->executable && !info->pie + if (bfd_link_pde (info) && (entry->symndx != -1 || FRVFDPIC_FUNCDESC_LOCAL (info, entry->d.h))) { @@ -1595,7 +1537,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, /* If we're linking an executable at a fixed address, we can omit the dynamic relocation as long as the symbol is local to this module. */ - if (info->executable && !info->pie + if (bfd_link_pde (info) && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h))) { if (sec) @@ -1643,7 +1585,9 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, /* If we've omitted the dynamic relocation, just emit the fixed addresses of the symbol and of the local GOT base offset. */ - if (info->executable && !info->pie && sec && sec->output_section) + if (bfd_link_pde (info) + && sec + && sec->output_section) { lowword = ad; highword = frvfdpic_got_section (info)->output_section->vma @@ -1818,14 +1762,14 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, /* *ABS*+addend is special for TLS relocations, use only the addend. */ - if (info->executable + if (bfd_link_executable (info) && idx == 0 && (bfd_is_abs_section (sec) || bfd_is_und_section (sec))) ; /* If we're linking an executable, we can entirely omit the dynamic relocation if the symbol is local to this module. */ - else if (info->executable + else if (bfd_link_executable (info) && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h))) { @@ -1891,10 +1835,10 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, /* If we didn't set up a TLS offset entry, but we're linking an executable and the symbol binds locally, we can use the module offset in the TLS descriptor in relaxations. */ - if (info->executable && ! entry->tlsoff_entry) + if (bfd_link_executable (info) && ! entry->tlsoff_entry) entry->tlsoff_entry = entry->tlsdesc_entry + 4; - if (info->executable && !info->pie + if (bfd_link_pde (info) && ((idx == 0 && (bfd_is_abs_section (sec) || bfd_is_und_section (sec))) @@ -1993,7 +1937,7 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, bfd_byte *plt_code = frvfdpic_plt_section (info)->contents + entry->tlsplt_entry; - if (info->executable + if (bfd_link_executable (info) && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (info, entry->d.h))) { @@ -2176,14 +2120,12 @@ _frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry, /* Handle an FRV small data reloc. */ static bfd_reloc_status_type -elf32_frv_relocate_gprel12 (info, input_bfd, input_section, relocation, - contents, value) - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - Elf_Internal_Rela *relocation; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_gprel12 (struct bfd_link_info *info, + bfd *input_bfd, + asection *input_section, + Elf_Internal_Rela *relocation, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; bfd_vma gp; @@ -2215,14 +2157,12 @@ elf32_frv_relocate_gprel12 (info, input_bfd, input_section, relocation, /* Handle an FRV small data reloc. for the u12 field. */ static bfd_reloc_status_type -elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, relocation, - contents, value) - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - Elf_Internal_Rela *relocation; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_gprelu12 (struct bfd_link_info *info, + bfd *input_bfd, + asection *input_section, + Elf_Internal_Rela *relocation, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; bfd_vma gp; @@ -2257,11 +2197,10 @@ elf32_frv_relocate_gprelu12 (info, input_bfd, input_section, relocation, /* Handle an FRV ELF HI16 reloc. */ static bfd_reloc_status_type -elf32_frv_relocate_hi16 (input_bfd, relhi, contents, value) - bfd *input_bfd; - Elf_Internal_Rela *relhi; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_hi16 (bfd *input_bfd, + Elf_Internal_Rela *relhi, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; @@ -2280,11 +2219,10 @@ elf32_frv_relocate_hi16 (input_bfd, relhi, contents, value) } static bfd_reloc_status_type -elf32_frv_relocate_lo16 (input_bfd, rello, contents, value) - bfd *input_bfd; - Elf_Internal_Rela *rello; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_lo16 (bfd *input_bfd, + Elf_Internal_Rela *rello, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; @@ -2305,12 +2243,11 @@ elf32_frv_relocate_lo16 (input_bfd, rello, contents, value) /* Perform the relocation for the CALL label24 instruction. */ static bfd_reloc_status_type -elf32_frv_relocate_label24 (input_bfd, input_section, rello, contents, value) - bfd *input_bfd; - asection *input_section; - Elf_Internal_Rela *rello; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_label24 (bfd *input_bfd, + asection *input_section, + Elf_Internal_Rela *rello, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; bfd_vma label6; @@ -2348,14 +2285,12 @@ elf32_frv_relocate_label24 (input_bfd, input_section, rello, contents, value) } static bfd_reloc_status_type -elf32_frv_relocate_gprelhi (info, input_bfd, input_section, relocation, - contents, value) - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - Elf_Internal_Rela *relocation; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_gprelhi (struct bfd_link_info *info, + bfd *input_bfd, + asection *input_section, + Elf_Internal_Rela *relocation, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; bfd_vma gp; @@ -2383,14 +2318,12 @@ elf32_frv_relocate_gprelhi (info, input_bfd, input_section, relocation, } static bfd_reloc_status_type -elf32_frv_relocate_gprello (info, input_bfd, input_section, relocation, - contents, value) - struct bfd_link_info *info; - bfd *input_bfd; - asection *input_section; - Elf_Internal_Rela *relocation; - bfd_byte *contents; - bfd_vma value; +elf32_frv_relocate_gprello (struct bfd_link_info *info, + bfd *input_bfd, + asection *input_section, + Elf_Internal_Rela *relocation, + bfd_byte *contents, + bfd_vma value) { bfd_vma insn; bfd_vma gp; @@ -2419,9 +2352,8 @@ elf32_frv_relocate_gprello (info, input_bfd, input_section, relocation, } static reloc_howto_type * -frv_reloc_type_lookup (abfd, code) - bfd *abfd ATTRIBUTE_UNUSED; - bfd_reloc_code_real_type code; +frv_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, + bfd_reloc_code_real_type code) { switch (code) { @@ -2601,10 +2533,9 @@ frv_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name) /* Set the howto pointer for an FRV ELF reloc. */ static void -frv_info_to_howto_rela (abfd, cache_ptr, dst) - bfd *abfd ATTRIBUTE_UNUSED; - arelent *cache_ptr; - Elf_Internal_Rela *dst; +frv_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, + arelent *cache_ptr, + Elf_Internal_Rela *dst) { unsigned int r_type; @@ -2620,6 +2551,12 @@ frv_info_to_howto_rela (abfd, cache_ptr, dst) break; default: + if (r_type >= (unsigned int) R_FRV_max) + { + /* xgettext:c-format */ + _bfd_error_handler (_("%B: invalid FRV reloc number: %d"), abfd, r_type); + r_type = 0; + } cache_ptr->howto = & elf32_frv_howto_table [r_type]; break; } @@ -2665,14 +2602,12 @@ frvfdpic_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, routines, but a few relocs, we have to do them ourselves. */ static bfd_reloc_status_type -frv_final_link_relocate (howto, input_bfd, input_section, contents, rel, - relocation) - reloc_howto_type *howto; - bfd *input_bfd; - asection *input_section; - bfd_byte *contents; - Elf_Internal_Rela *rel; - bfd_vma relocation; +frv_final_link_relocate (reloc_howto_type *howto, + bfd *input_bfd, + asection *input_section, + bfd_byte *contents, + Elf_Internal_Rela *rel, + bfd_vma relocation) { return _bfd_final_link_relocate (howto, input_bfd, input_section, contents, rel->r_offset, relocation, @@ -2711,16 +2646,14 @@ frv_final_link_relocate (howto, input_bfd, input_section, contents, rel, accordingly. */ static bfd_boolean -elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, - contents, relocs, local_syms, local_sections) - bfd *output_bfd ATTRIBUTE_UNUSED; - 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; +elf32_frv_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, + 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_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; @@ -2728,7 +2661,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, Elf_Internal_Rela *relend; unsigned isec_segment, got_segment, plt_segment, gprel_segment, tls_segment, check_segment[2]; - int silence_segment_error = !(info->shared || info->pie); + int silence_segment_error = !bfd_link_pic (info); unsigned long insn; symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr; @@ -2770,7 +2703,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, struct elf_link_hash_entry *h; bfd_vma relocation; bfd_reloc_status_type r; - const char * name = NULL; + const char *name; int r_type; asection *osec; struct frvfdpic_relocs_info *picrel; @@ -2796,32 +2729,27 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name); - name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name; + if (name == NULL || name[0] == 0) + name = bfd_section_name (input_bfd, sec); } else { - bfd_boolean warned; + bfd_boolean warned, ignored; bfd_boolean unresolved_reloc; 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); osec = sec; + name = h->root.root.string; } - if (sec != NULL && elf_discarded_section (sec)) - { - /* For relocs against symbols from removed linkonce sections, - or sections discarded by a linker script, we just want the - section contents zeroed. Avoid any special processing. */ - _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); - rel->r_info = 0; - rel->r_addend = 0; - continue; - } + 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; if (r_type != R_FRV_TLSMOFF @@ -2840,6 +2768,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, case R_FRV_32: if (! IS_FDPIC (output_bfd)) goto non_fdpic; + /* Fall through. */ case R_FRV_GOT12: case R_FRV_GOTHI: @@ -2889,8 +2818,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, osec, sym, rel->r_addend)) { - (*_bfd_error_handler) - (_("%B(%A+0x%x): relocation to `%s+%x' may have caused the error above"), + info->callbacks->einfo + /* xgettext:c-format */ + (_("%H: relocation to `%s+%v'" + " may have caused the error above\n"), input_bfd, input_section, rel->r_offset, name, rel->r_addend); return FALSE; } @@ -2900,11 +2831,15 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, default: non_fdpic: picrel = NULL; - if (h && ! FRVFDPIC_SYM_LOCAL (info, h)) + if (h + && ! FRVFDPIC_SYM_LOCAL (info, h) + && _bfd_elf_section_offset (output_bfd, info, input_section, + rel->r_offset) != (bfd_vma) -1) { - info->callbacks->warning - (info, _("relocation references symbol not defined in the module"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: relocation references symbol" + " not defined in the module\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } break; @@ -2942,10 +2877,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, { #define LOCAL_EXEC_P(info, picrel) \ - ((info)->executable \ + (bfd_link_executable (info) \ && (picrel->symndx != -1 || FRVFDPIC_SYM_LOCAL ((info), (picrel)->d.h))) #define INITIAL_EXEC_P(info, picrel) \ - (((info)->executable || (info)->flags & DF_STATIC_TLS) \ + ((bfd_link_executable (info)|| (info)->flags & DF_STATIC_TLS) \ && (picrel)->tlsoff_entry) #define IN_RANGE_FOR_OFST12_P(value) \ @@ -2977,10 +2912,9 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a call instruction? */ if ((insn & (unsigned long)0x01fc0000) != 0x003c0000) { - r = info->callbacks->warning - (info, - _("R_FRV_GETTLSOFF not applied to a call instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GETTLSOFF not applied to a call instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3019,10 +2953,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this an lddi instruction? */ if ((insn & (unsigned long)0x01fc0000) != 0x00cc0000) { - r = info->callbacks->warning - (info, - _("R_FRV_GOTTLSDESC12 not applied to an lddi instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GOTTLSDESC12" + " not applied to an lddi instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3090,10 +3024,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a sethi instruction? */ if ((insn & (unsigned long)0x01ff0000) != 0x00f80000) { - r = info->callbacks->warning - (info, - _("R_FRV_GOTTLSDESCHI not applied to a sethi instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GOTTLSDESCHI" + " not applied to a sethi instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3127,11 +3061,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a setlo or setlos instruction? */ if ((insn & (unsigned long)0x01f70000) != 0x00f40000) { - r = info->callbacks->warning - (info, - _("R_FRV_GOTTLSDESCLO" - " not applied to a setlo or setlos instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GOTTLSDESCLO" + " not applied to a setlo or setlos instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3175,10 +3108,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this an ldd instruction? */ if ((insn & (unsigned long)0x01fc0fc0) != 0x00080140) { - r = info->callbacks->warning - (info, - _("R_FRV_TLSDESC_RELAX not applied to an ldd instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_TLSDESC_RELAX" + " not applied to an ldd instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3259,11 +3192,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a calll or callil instruction? */ if ((insn & (unsigned long)0x7ff80fc0) != 0x02300000) { - r = info->callbacks->warning - (info, - _("R_FRV_GETTLSOFF_RELAX" - " not applied to a calll instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GETTLSOFF_RELAX" + " not applied to a calll instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3314,10 +3246,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this an ldi instruction? */ if ((insn & (unsigned long)0x01fc0000) != 0x00c80000) { - r = info->callbacks->warning - (info, - _("R_FRV_GOTTLSOFF12 not applied to an ldi instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GOTTLSOFF12" + " not applied to an ldi instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3344,10 +3276,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a sethi instruction? */ if ((insn & (unsigned long)0x01ff0000) != 0x00f80000) { - r = info->callbacks->warning - (info, - _("R_FRV_GOTTLSOFFHI not applied to a sethi instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GOTTLSOFFHI" + " not applied to a sethi instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3373,11 +3305,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a setlo or setlos instruction? */ if ((insn & (unsigned long)0x01f70000) != 0x00f40000) { - r = info->callbacks->warning - (info, - _("R_FRV_GOTTLSOFFLO" - " not applied to a setlo or setlos instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_GOTTLSOFFLO" + " not applied to a setlo or setlos instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3404,10 +3335,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this an ld instruction? */ if ((insn & (unsigned long)0x01fc0fc0) != 0x00080100) { - r = info->callbacks->warning - (info, - _("R_FRV_TLSOFF_RELAX not applied to an ld instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_TLSOFF_RELAX" + " not applied to an ld instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3433,7 +3364,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, with ldi @(grB, #gottlsoff12(symbol+offset), grC. Preserve the packing bit. */ insn = (insn & (unsigned long)0xfe03f000) - | (unsigned long)0x00c80000;; + | (unsigned long)0x00c80000; bfd_put_32 (input_bfd, insn, contents + rel->r_offset); r_type = R_FRV_GOTTLSOFF12; @@ -3449,10 +3380,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a sethi instruction? */ if ((insn & (unsigned long)0x01ff0000) != 0x00f80000) { - r = info->callbacks->warning - (info, - _("R_FRV_TLSMOFFHI not applied to a sethi instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_TLSMOFFHI" + " not applied to a sethi instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3476,11 +3407,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* Is this a setlo or setlos instruction? */ if ((insn & (unsigned long)0x01f70000) != 0x00f40000) { - r = info->callbacks->warning - (info, - _("R_FRV_TLSMOFFLO" - " not applied to a setlo or setlos instruction"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("R_FRV_TLSMOFFLO" + " not applied to a setlo or setlos instruction\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3587,7 +3517,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, section+offset. */ if (h && ! FRVFDPIC_FUNCDESC_LOCAL (info, h) && FRVFDPIC_SYM_LOCAL (info, h) - && !(info->executable && !info->pie)) + && !bfd_link_pde (info)) { dynindx = elf_section_data (h->root.u.def.section ->output_section)->dynindx; @@ -3598,9 +3528,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, { if (addend) { - info->callbacks->warning - (info, _("R_FRV_FUNCDESC references dynamic symbol with nonzero addend"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_FUNCDESC references dynamic symbol" + " with nonzero addend\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } dynindx = h->dynindx; @@ -3624,7 +3555,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, dynamic symbol entry for the got section, so idx will be zero, which means we can and should compute the address of the private descriptor ourselves. */ - if (info->executable && !info->pie + if (bfd_link_pde (info) && (!h || FRVFDPIC_FUNCDESC_LOCAL (info, h))) { addend += frvfdpic_got_section (info)->output_section->vma; @@ -3638,10 +3569,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, input_section ->output_section)) { - info->callbacks->warning - (info, - _("cannot emit fixups in read-only section"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: cannot emit fixups" + " in read-only section\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3669,10 +3600,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, input_section ->output_section)) { - info->callbacks->warning - (info, - _("cannot emit dynamic relocations in read-only section"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: cannot emit dynamic relocations" + " in read-only section\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3718,9 +3649,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, { if (addend && r_type == R_FRV_FUNCDESC_VALUE) { - info->callbacks->warning - (info, _("R_FRV_FUNCDESC_VALUE references dynamic symbol with nonzero addend"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: R_FRV_FUNCDESC_VALUE" + " references dynamic symbol with nonzero addend\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } dynindx = h->dynindx; @@ -3745,7 +3677,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, can omit the dynamic relocation as long as the symbol is defined in the current link unit (which is implied by its output section not being NULL). */ - if (info->executable && !info->pie + if (bfd_link_pde (info) && (!h || FRVFDPIC_SYM_LOCAL (info, h))) { if (osec) @@ -3759,10 +3691,9 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, input_section ->output_section)) { - info->callbacks->warning - (info, - _("cannot emit fixups in read-only section"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: cannot emit fixups in read-only section\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } if (!h || h->root.type != bfd_link_hash_undefweak) @@ -3803,10 +3734,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, input_section ->output_section)) { - info->callbacks->warning - (info, - _("cannot emit dynamic relocations in read-only section"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + (_("%H: cannot emit dynamic relocations" + " in read-only section\n"), + input_bfd, input_section, rel->r_offset); return FALSE; } @@ -3835,7 +3766,7 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, /* If we've omitted the dynamic relocation, just emit the fixed addresses of the symbol and of the local GOT base offset. */ - if (info->executable && !info->pie + if (bfd_link_pde (info) && (!h || FRVFDPIC_SYM_LOCAL (info, h))) bfd_put_32 (output_bfd, frvfdpic_got_section (info)->output_section->vma @@ -3962,10 +3893,10 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, if (silence_segment_error == 1) silence_segment_error = (strlen (input_bfd->filename) == 6 - && strcmp (input_bfd->filename, "crt0.o") == 0) + && filename_cmp (input_bfd->filename, "crt0.o") == 0) || (strlen (input_bfd->filename) > 6 - && strcmp (input_bfd->filename - + strlen (input_bfd->filename) - 7, + && filename_cmp (input_bfd->filename + + strlen (input_bfd->filename) - 7, "/crt0.o") == 0) ? -1 : 0; if (!silence_segment_error @@ -3974,18 +3905,12 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, && !(picrel && picrel->symndx == -1 && picrel->d.h->root.type == bfd_link_hash_undefined)) { - if (info->shared || info->pie) - (*_bfd_error_handler) - (_("%B(%A+0x%lx): reloc against `%s': %s"), - input_bfd, input_section, (long)rel->r_offset, name, - _("relocation references a different segment")); - else - info->callbacks->warning - (info, - _("relocation references a different segment"), - name, input_bfd, input_section, rel->r_offset); + info->callbacks->einfo + /* xgettext:c-format */ + (_("%H: reloc against `%s' references a different segment\n"), + input_bfd, input_section, rel->r_offset, name); } - if (!silence_segment_error && (info->shared || info->pie)) + if (!silence_segment_error && bfd_link_pic (info)) return FALSE; elf_elfheader (output_bfd)->e_flags |= EF_FRV_PIC; } @@ -4102,13 +4027,13 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, switch (r) { case bfd_reloc_overflow: - r = info->callbacks->reloc_overflow + (*info->callbacks->reloc_overflow) (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_offset); break; case bfd_reloc_undefined: - r = info->callbacks->undefined_symbol + (*info->callbacks->undefined_symbol) (info, name, input_bfd, input_section, rel->r_offset, TRUE); break; @@ -4131,14 +4056,12 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section, if (msg) { - (*_bfd_error_handler) - (_("%B(%A+0x%lx): reloc against `%s': %s"), - input_bfd, input_section, (long)rel->r_offset, name, msg); + info->callbacks->einfo + /* xgettext:c-format */ + (_("%H: reloc against `%s': %s\n"), + input_bfd, input_section, rel->r_offset, name, msg); return FALSE; } - - if (! r) - return FALSE; } } @@ -4170,17 +4093,16 @@ elf32_frv_gc_mark_hook (asection *sec, file. We use it to put .comm items in .scomm, and not .comm. */ static bfd_boolean -elf32_frv_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp) - bfd *abfd; - struct bfd_link_info *info; - Elf_Internal_Sym *sym; - const char **namep ATTRIBUTE_UNUSED; - flagword *flagsp ATTRIBUTE_UNUSED; - asection **secp; - bfd_vma *valp; +elf32_frv_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, + bfd_vma *valp) { if (sym->st_shndx == SHN_COMMON - && !info->relocatable + && !bfd_link_relocatable (info) && (int)sym->st_size <= (int)bfd_get_gp_size (abfd)) { /* Common symbols less than or equal to -G nn bytes are @@ -4245,8 +4167,8 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) int offset; /* This function may be called more than once. */ - s = bfd_get_section_by_name (abfd, ".got"); - if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0) + s = elf_hash_table (info)->sgot; + if (s != NULL) return TRUE; /* Machine specific: although pointers are 32-bits wide, we want the @@ -4259,19 +4181,12 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) | SEC_LINKER_CREATED); pltflags = flags; - s = bfd_make_section_with_flags (abfd, ".got", flags); + s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); + elf_hash_table (info)->sgot = s; if (s == NULL || !bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; - if (bed->want_got_plt) - { - s = bfd_make_section_with_flags (abfd, ".got.plt", flags); - if (s == NULL - || !bfd_set_section_alignment (abfd, s, ptralign)) - return FALSE; - } - if (bed->want_got_sym) { /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got @@ -4296,7 +4211,6 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) data for the got. */ if (IS_FDPIC (abfd)) { - frvfdpic_got_section (info) = s; frvfdpic_relocs_info (info) = htab_try_create (1, frvfdpic_relocs_info_hash, frvfdpic_relocs_info_eq, @@ -4304,17 +4218,16 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) if (! frvfdpic_relocs_info (info)) return FALSE; - s = bfd_make_section_with_flags (abfd, ".rel.got", - (flags | SEC_READONLY)); + s = bfd_make_section_anyway_with_flags (abfd, ".rel.got", + (flags | SEC_READONLY)); + elf_hash_table (info)->srelgot = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, 2)) return FALSE; - frvfdpic_gotrel_section (info) = s; - /* Machine-specific. */ - s = bfd_make_section_with_flags (abfd, ".rofixup", - (flags | SEC_READONLY)); + s = bfd_make_section_anyway_with_flags (abfd, ".rofixup", + (flags | SEC_READONLY)); if (s == NULL || ! bfd_set_section_alignment (abfd, s, 2)) return FALSE; @@ -4362,7 +4275,7 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) if (bed->plt_readonly) pltflags |= SEC_READONLY; - s = bfd_make_section_with_flags (abfd, ".plt", pltflags); + s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); if (s == NULL || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) return FALSE; @@ -4381,8 +4294,8 @@ _frv_create_got_section (bfd *abfd, struct bfd_link_info *info) } /* FRV-specific: we want rel relocations for the plt. */ - s = bfd_make_section_with_flags (abfd, ".rel.plt", - flags | SEC_READONLY); + s = bfd_make_section_anyway_with_flags (abfd, ".rel.plt", + flags | SEC_READONLY); if (s == NULL || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) return FALSE; @@ -4429,8 +4342,8 @@ elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) image and use a R_*_COPY reloc to tell the dynamic linker to initialize them at run time. The linker script puts the .dynbss section into the .bss section of the final image. */ - s = bfd_make_section_with_flags (abfd, ".dynbss", - SEC_ALLOC | SEC_LINKER_CREATED); + s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", + SEC_ALLOC | SEC_LINKER_CREATED); if (s == NULL) return FALSE; @@ -4445,12 +4358,12 @@ elf32_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) be needed, we can discard it later. We will never need this section when generating a shared object, since they do not use copy relocs. */ - if (! info->shared) + if (! bfd_link_pic (info)) { - s = bfd_make_section_with_flags (abfd, - (bed->default_use_rela_p - ? ".rela.bss" : ".rel.bss"), - flags | SEC_READONLY); + s = bfd_make_section_anyway_with_flags (abfd, + (bed->default_use_rela_p + ? ".rela.bss" : ".rel.bss"), + flags | SEC_READONLY); if (s == NULL || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) return FALSE; @@ -4582,7 +4495,7 @@ _frvfdpic_count_relocs_fixups (struct frvfdpic_relocs_info *entry, { bfd_vma relocs = 0, fixups = 0, tlsrets = 0; - if (!dinfo->info->executable || dinfo->info->pie) + if (!bfd_link_pde (dinfo->info)) { relocs = entry->relocs32 + entry->relocsfd + entry->relocsfdv + entry->relocstlsd; @@ -4594,7 +4507,7 @@ _frvfdpic_count_relocs_fixups (struct frvfdpic_relocs_info *entry, emit dynamic relocations even for local symbols, because we don't know the module id the library is going to get at run-time, nor its TLS base offset. */ - if (!dinfo->info->executable + if (!bfd_link_executable (dinfo->info) || (entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))) relocs += entry->relocstlsoff; @@ -4653,7 +4566,7 @@ _frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry, { bfd_boolean changed = ! relaxing; - BFD_ASSERT (dinfo->info->executable + BFD_ASSERT (bfd_link_executable (dinfo->info) || (dinfo->info->flags & DF_STATIC_TLS)); if (entry->tlsdesc12 || entry->tlsdesclos || entry->tlsdeschilo) @@ -4672,7 +4585,7 @@ _frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry, to GOTTLSOFF, we must keep the GOT entry in range. We know it has to fit because we'll be trading the 4 words of hte TLS descriptor for a single word in the same range. */ - if (! dinfo->info->executable + if (! bfd_link_executable (dinfo->info) || (entry->symndx == -1 && ! FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h))) { @@ -4696,7 +4609,7 @@ _frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry, do better than this. */ if ((entry->tlsplt || entry->tlsoff12 || entry->tlsofflos || entry->tlsoffhilo) - && dinfo->info->executable && relaxing + && bfd_link_executable (dinfo->info) && relaxing && ((entry->symndx == -1 && FRVFDPIC_SYM_LOCAL (dinfo->info, entry->d.h) /* The above may hold for an undefweak TLS symbol, so make @@ -4712,7 +4625,7 @@ _frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry, + 32768) < (bfd_vma)65536)) || (entry->symndx != -1 && (elf_hash_table (dinfo->info)->tls_sec->size - + abs (entry->addend) < 32768 + FRVFDPIC_TLS_BIAS)))) + + entry->addend < 32768 + FRVFDPIC_TLS_BIAS)))) { if (! changed) { @@ -4769,7 +4682,8 @@ _frvfdpic_count_got_plt_entries (void **entryp, void *dinfo_) _frvfdpic_count_nontls_entries (entry, dinfo); - if (dinfo->info->executable || (dinfo->info->flags & DF_STATIC_TLS)) + if (bfd_link_executable (dinfo->info) + || (dinfo->info->flags & DF_STATIC_TLS)) _frvfdpic_relax_tls_entries (entry, dinfo, FALSE); else { @@ -5162,7 +5076,7 @@ _frvfdpic_assign_plt_entries (void **entryp, void *info_) entry->tlsplt_entry = frvfdpic_plt_section (dinfo->g.info)->size; - if (dinfo->g.info->executable + if (bfd_link_executable (dinfo->g.info) && (entry->symndx != -1 || FRVFDPIC_SYM_LOCAL (dinfo->g.info, entry->d.h))) { @@ -5513,9 +5427,9 @@ elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd, 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) && !info->nointerp) { - 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 = (bfd_byte *) ELF_DYNAMIC_INTERPRETER; @@ -5572,36 +5486,10 @@ static bfd_boolean elf32_frvfdpic_always_size_sections (bfd *output_bfd, struct bfd_link_info *info) { - if (!info->relocatable) - { - struct elf_link_hash_entry *h; - - /* Force a PT_GNU_STACK segment to be created. */ - if (! elf_tdata (output_bfd)->stack_flags) - elf_tdata (output_bfd)->stack_flags = PF_R | PF_W | PF_X; - - /* Define __stacksize if it's not defined yet. */ - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize", - FALSE, FALSE, FALSE); - if (! h || h->root.type != bfd_link_hash_defined - || h->type != STT_OBJECT - || !h->def_regular) - { - struct bfd_link_hash_entry *bh = NULL; - - if (!(_bfd_generic_link_add_one_symbol - (info, output_bfd, "__stacksize", - BSF_GLOBAL, bfd_abs_section_ptr, DEFAULT_STACK_SIZE, - (const char *) NULL, FALSE, - get_elf_backend_data (output_bfd)->collect, &bh))) - return FALSE; - - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - /* This one must NOT be hidden. */ - } - } + if (!bfd_link_relocatable (info) + && !bfd_elf_stack_segment_size (output_bfd, info, + "__stacksize", DEFAULT_STACK_SIZE)) + return FALSE; return TRUE; } @@ -5611,7 +5499,7 @@ elf32_frvfdpic_always_size_sections (bfd *output_bfd, static bfd_boolean _frvfdpic_check_discarded_relocs (bfd *abfd, asection *sec, struct bfd_link_info *info, - + bfd_boolean *changed) { Elf_Internal_Shdr *symtab_hdr; @@ -5692,7 +5580,7 @@ frvfdpic_elf_discard_info (bfd *ibfd, /* Account for relaxation of .eh_frame section. */ for (s = ibfd->sections; s; s = s->next) - if (s->sec_info_type == ELF_INFO_TYPE_EH_FRAME) + if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME) { if (!_frvfdpic_check_discarded_relocs (ibfd, s, info, &changed)) return FALSE; @@ -5740,7 +5628,7 @@ elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, { struct _frvfdpic_dynamic_got_plt_info gpinfo; - if (info->relocatable) + if (bfd_link_relocatable (info)) (*info->callbacks->einfo) (_("%P%F: --relax and -r may not be used together\n")); @@ -5753,7 +5641,7 @@ elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, /* We can only relax when linking the main executable or a library that can't be dlopened. */ - if (! info->executable && ! (info->flags & DF_STATIC_TLS)) + if (! bfd_link_executable (info) && ! (info->flags & DF_STATIC_TLS)) return TRUE; /* If there isn't a TLS section for this binary, we can't do @@ -5798,51 +5686,6 @@ elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, return TRUE; } -static bfd_boolean -elf32_frvfdpic_modify_program_headers (bfd *output_bfd, - struct bfd_link_info *info) -{ - struct elf_obj_tdata *tdata = elf_tdata (output_bfd); - struct elf_segment_map *m; - Elf_Internal_Phdr *p; - - /* objcopy and strip preserve what's already there using - elf32_frvfdpic_copy_private_bfd_data (). */ - if (! info) - return TRUE; - - for (p = tdata->phdr, m = tdata->segment_map; m != NULL; m = m->next, p++) - if (m->p_type == PT_GNU_STACK) - break; - - if (m) - { - struct elf_link_hash_entry *h; - - /* Obtain the pointer to the __stacksize symbol. */ - h = elf_link_hash_lookup (elf_hash_table (info), "__stacksize", - FALSE, FALSE, FALSE); - if (h) - { - 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; - BFD_ASSERT (h->root.type == bfd_link_hash_defined); - } - - /* Set the header p_memsz from the symbol value. We - intentionally ignore the symbol section. */ - if (h && h->root.type == bfd_link_hash_defined) - p->p_memsz = h->root.u.def.value; - else - p->p_memsz = DEFAULT_STACK_SIZE; - - p->p_align = 8; - } - - return TRUE; -} - /* Fill in code and data in dynamic sections. */ static bfd_boolean @@ -5887,8 +5730,8 @@ elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd, != (frvfdpic_gotfixup_section (info)->reloc_count * 4)) { error: - (*_bfd_error_handler) - ("LINKER BUG: .rofixup section size mismatch"); + info->callbacks->einfo + ("LINKER BUG: .rofixup section size mismatch\n"); return FALSE; } @@ -5896,7 +5739,8 @@ elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd, FALSE, FALSE, TRUE); if (hend && (hend->type == bfd_link_hash_defined - || hend->type == bfd_link_hash_defweak)) + || hend->type == bfd_link_hash_defweak) + && hend->u.def.section->output_section != NULL) { bfd_vma value = frvfdpic_gotfixup_section (info)->output_section->vma @@ -5923,7 +5767,7 @@ elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd, Elf32_External_Dyn * dyncon; Elf32_External_Dyn * dynconend; - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); + sdyn = bfd_get_linker_section (dynobj, ".dynamic"); BFD_ASSERT (sdyn != NULL); @@ -6160,11 +6004,10 @@ frvfdpic_elf_encode_eh_address (bfd *abfd, Given infinite time and money... :-) */ static bfd_boolean -elf32_frv_check_relocs (abfd, info, sec, relocs) - bfd *abfd; - struct bfd_link_info *info; - asection *sec; - const Elf_Internal_Rela *relocs; +elf32_frv_check_relocs (bfd *abfd, + struct bfd_link_info *info, + asection *sec, + const Elf_Internal_Rela *relocs) { Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; @@ -6173,7 +6016,7 @@ elf32_frv_check_relocs (abfd, info, sec, relocs) bfd *dynobj; struct frvfdpic_relocs_info *picrel; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; @@ -6195,6 +6038,10 @@ elf32_frv_check_relocs (abfd, info, sec, relocs) 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_regular = 1; } switch (ELF32_R_TYPE (rel->r_info)) @@ -6406,8 +6253,9 @@ elf32_frv_check_relocs (abfd, info, sec, relocs) default: bad_reloc: - (*_bfd_error_handler) - (_("%B: unsupported relocation type %i"), + info->callbacks->einfo + /* xgettext:c-format */ + (_("%B: unsupported relocation type %i\n"), abfd, ELF32_R_TYPE (rel->r_info)); return FALSE; } @@ -6420,8 +6268,7 @@ elf32_frv_check_relocs (abfd, info, sec, relocs) /* Return the machine subcode from the ELF e_flags header. */ static int -elf32_frv_machine (abfd) - bfd *abfd; +elf32_frv_machine (bfd *abfd) { switch (elf_elfheader (abfd)->e_flags & EF_FRV_CPU_MASK) { @@ -6442,8 +6289,7 @@ elf32_frv_machine (abfd) /* Set the right machine number for a FRV ELF file. */ static bfd_boolean -elf32_frv_object_p (abfd) - bfd *abfd; +elf32_frv_object_p (bfd *abfd) { bfd_default_set_arch_mach (abfd, bfd_arch_frv, elf32_frv_machine (abfd)); return (((elf_elfheader (abfd)->e_flags & EF_FRV_FDPIC) != 0) @@ -6453,38 +6299,13 @@ elf32_frv_object_p (abfd) /* Function to set the ELF flag bits. */ static bfd_boolean -frv_elf_set_private_flags (abfd, flags) - bfd *abfd; - flagword flags; +frv_elf_set_private_flags (bfd *abfd, flagword flags) { elf_elfheader (abfd)->e_flags = flags; elf_flags_init (abfd) = TRUE; return TRUE; } -/* Copy backend specific data from one object module to another. */ - -static bfd_boolean -frv_elf_copy_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; -{ - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - BFD_ASSERT (!elf_flags_init (obfd) - || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags); - - elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; - elf_flags_init (obfd) = TRUE; - - /* Copy object attributes. */ - _bfd_elf_copy_obj_attributes (ibfd, obfd); - - return TRUE; -} - /* Return true if the architecture described by elf header flag EXTENSION is an extension of the architecture described by BASE. */ @@ -6512,58 +6333,13 @@ frv_elf_arch_extension_p (flagword base, flagword extension) return FALSE; } -static bfd_boolean -elf32_frvfdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd) -{ - unsigned i; - - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - if (! frv_elf_copy_private_bfd_data (ibfd, obfd)) - return FALSE; - - if (! elf_tdata (ibfd) || ! elf_tdata (ibfd)->phdr - || ! elf_tdata (obfd) || ! elf_tdata (obfd)->phdr) - return TRUE; - - /* Copy the stack size. */ - for (i = 0; i < elf_elfheader (ibfd)->e_phnum; i++) - if (elf_tdata (ibfd)->phdr[i].p_type == PT_GNU_STACK) - { - Elf_Internal_Phdr *iphdr = &elf_tdata (ibfd)->phdr[i]; - - for (i = 0; i < elf_elfheader (obfd)->e_phnum; i++) - if (elf_tdata (obfd)->phdr[i].p_type == PT_GNU_STACK) - { - memcpy (&elf_tdata (obfd)->phdr[i], iphdr, sizeof (*iphdr)); - - /* Rewrite the phdrs, since we're only called after they - were first written. */ - if (bfd_seek (obfd, (bfd_signed_vma) get_elf_backend_data (obfd) - ->s->sizeof_ehdr, SEEK_SET) != 0 - || get_elf_backend_data (obfd)->s - ->write_out_phdrs (obfd, elf_tdata (obfd)->phdr, - elf_elfheader (obfd)->e_phnum) != 0) - return FALSE; - break; - } - - break; - } - - return TRUE; -} - /* Merge backend specific data from an object file to the output object file when linking. */ static bfd_boolean -frv_elf_merge_private_bfd_data (ibfd, obfd) - bfd *ibfd; - bfd *obfd; +frv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { + bfd *obfd = info->output_bfd; flagword old_flags, old_partial; flagword new_flags, new_partial; bfd_boolean error = FALSE; @@ -6578,9 +6354,10 @@ frv_elf_merge_private_bfd_data (ibfd, obfd) new_flags &= ~EF_FRV_PIC; #ifdef DEBUG - (*_bfd_error_handler) ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s", - old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no", - bfd_get_filename (ibfd)); + _bfd_error_handler + ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %s", + old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no", + bfd_get_filename (ibfd)); #endif if (!elf_flags_init (obfd)) /* First call, no flags set. */ @@ -6728,10 +6505,11 @@ frv_elf_merge_private_bfd_data (ibfd, obfd) old_flags &= ~ EF_FRV_PIC_FLAGS; #ifndef FRV_NO_PIC_ERROR error = TRUE; - (*_bfd_error_handler) - (_("%s: compiled with %s and linked with modules that use non-pic relocations"), - bfd_get_filename (ibfd), - (new_flags & EF_FRV_BIGPIC) ? "-fPIC" : "-fpic"); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: compiled with %s and linked with modules" + " that use non-pic relocations"), + ibfd, (new_flags & EF_FRV_BIGPIC) ? "-fPIC" : "-fpic"); #endif } } @@ -6781,9 +6559,10 @@ frv_elf_merge_private_bfd_data (ibfd, obfd) if (new_opt[0]) { error = TRUE; - (*_bfd_error_handler) - (_("%s: compiled with %s and linked with modules compiled with %s"), - bfd_get_filename (ibfd), new_opt, old_opt); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: compiled with %s and linked with modules compiled with %s"), + ibfd, new_opt, old_opt); } /* Warn about any other mismatches */ @@ -6793,9 +6572,11 @@ frv_elf_merge_private_bfd_data (ibfd, obfd) { old_flags |= new_partial; error = TRUE; - (*_bfd_error_handler) - (_("%s: uses different unknown e_flags (0x%lx) fields than previous modules (0x%lx)"), - bfd_get_filename (ibfd), (long)new_partial, (long)old_partial); + _bfd_error_handler + /* xgettext:c-format */ + (_("%B: uses different unknown e_flags (%#x) fields" + " than previous modules (%#x)"), + ibfd, new_partial, old_partial); } } @@ -6814,13 +6595,13 @@ frv_elf_merge_private_bfd_data (ibfd, obfd) { error = TRUE; if (IS_FDPIC (obfd)) - (*_bfd_error_handler) - (_("%s: cannot link non-fdpic object file into fdpic executable"), - bfd_get_filename (ibfd)); + _bfd_error_handler + (_("%B: cannot link non-fdpic object file into fdpic executable"), + ibfd); else - (*_bfd_error_handler) - (_("%s: cannot link fdpic object file into non-fdpic executable"), - bfd_get_filename (ibfd)); + _bfd_error_handler + (_("%B: cannot link fdpic object file into non-fdpic executable"), + ibfd); } if (error) @@ -6830,10 +6611,8 @@ frv_elf_merge_private_bfd_data (ibfd, obfd) } -bfd_boolean -frv_elf_print_private_bfd_data (abfd, ptr) - bfd *abfd; - PTR ptr; +static bfd_boolean +frv_elf_print_private_bfd_data (bfd *abfd, void * ptr) { FILE *file = (FILE *) ptr; flagword flags; @@ -6930,12 +6709,12 @@ elf32_frv_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) hardcoded offsets and sizes listed below (and contained within this lexical block) refer to fields in the target's elf_prstatus struct. */ - case 268: + case 268: /* `pr_cursig' is at offset 12. */ - 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' is at offset 24. */ - elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24); + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24); /* `pr_reg' is at offset 72. */ offset = 72; @@ -6946,7 +6725,7 @@ elf32_frv_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) and `pr_interp_fdpic_loadmap', both of which (by design) immediately follow `pr_reg'. This will allow these fields to be viewed by GDB as registers. - + `pr_reg' is 184 bytes long. `pr_exec_fdpic_loadmap' and `pr_interp_fdpic_loadmap' are 4 bytes each. */ raw_size = 184 + 4 + 4; @@ -6971,11 +6750,11 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) case 124: /* `pr_fname' is found at offset 28 and is 16 bytes long. */ - elf_tdata (abfd)->core_program + elf_tdata (abfd)->core->program = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); /* `pr_psargs' is found at offset 44 and is 80 bytes long. */ - elf_tdata (abfd)->core_command + elf_tdata (abfd)->core->command = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); } @@ -6984,7 +6763,7 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) 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 (0 < n && command[n - 1] == ' ') @@ -6994,10 +6773,11 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) return TRUE; } #define ELF_ARCH bfd_arch_frv +#define ELF_TARGET_ID FRV_ELF_DATA #define ELF_MACHINE_CODE EM_CYGNUS_FRV #define ELF_MAXPAGESIZE 0x1000 -#define TARGET_BIG_SYM bfd_elf32_frv_vec +#define TARGET_BIG_SYM frv_elf32_vec #define TARGET_BIG_NAME "elf32-frv" #define elf_info_to_howto frv_info_to_howto_rela @@ -7007,13 +6787,13 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) #define elf_backend_object_p elf32_frv_object_p #define elf_backend_add_symbol_hook elf32_frv_add_symbol_hook +#define elf_backend_stack_align 8 #define elf_backend_can_gc_sections 1 #define elf_backend_rela_normal 1 #define bfd_elf32_bfd_reloc_type_lookup frv_reloc_type_lookup #define bfd_elf32_bfd_reloc_name_lookup frv_reloc_name_lookup #define bfd_elf32_bfd_set_private_flags frv_elf_set_private_flags -#define bfd_elf32_bfd_copy_private_bfd_data frv_elf_copy_private_bfd_data #define bfd_elf32_bfd_merge_private_bfd_data frv_elf_merge_private_bfd_data #define bfd_elf32_bfd_print_private_bfd_data frv_elf_print_private_bfd_data @@ -7036,7 +6816,7 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) #define ELF_MAXPAGESIZE 0x4000 #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_frvfdpic_vec +#define TARGET_BIG_SYM frv_elf32_fdpic_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-frvfdpic" #undef elf32_bed @@ -7051,12 +6831,6 @@ elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) #undef elf_backend_always_size_sections #define elf_backend_always_size_sections \ elf32_frvfdpic_always_size_sections -#undef elf_backend_modify_program_headers -#define elf_backend_modify_program_headers \ - elf32_frvfdpic_modify_program_headers -#undef bfd_elf32_bfd_copy_private_bfd_data -#define bfd_elf32_bfd_copy_private_bfd_data \ - elf32_frvfdpic_copy_private_bfd_data #undef elf_backend_create_dynamic_sections #define elf_backend_create_dynamic_sections \