aboutsummaryrefslogtreecommitdiff
path: root/bfd
AgeCommit message (Collapse)AuthorFilesLines
2018-09-29Automatic date update in version.inGDB Administrator1-1/+1
2018-09-28bfd: Use elfclass instead of bed->s->elfclassH.J. Lu2-2/+7
elfclass has been set to bed->s->elfclass earlier. * elf-properties.c (_bfd_elf_link_setup_gnu_properties): Use elfclass instead of bed->s->elfclass.
2018-09-27RISC-V: Pc-rel to gp-rel relaxation function cleanup.Jim Wilson2-42/+32
bfd/ * elfnn-riscv.c (riscv_init_pcgp_relocs): Add explanatory comment. (riscv_free_pcgp_relocs, riscv_record_pcgp_reloc): Likewise. (riscv_find_pcgp_hi_reloc, riscv_reocrd_pcgp_lo_reloc): Likewise. (riscv_find_pcgp_lo_reloc): Likewise. (riscv_delete_pcgp_hi_reloc, riscv_use_pcgp_hi_reloc): Delete. (riscv_delete_pcgp_lo_reloc): Likewise. (_bfd_riscv_relax_pc): Don't call riscv_use_pcgp_hi_reloc. Replace calls to riscv_delete_pcgp_lo_reloc and riscv_delete_pcgp_hi_reloc with TRUE. Mark abfd arg as ATTRIBUTE_UNUSED.
2018-09-28Automatic date update in version.inGDB Administrator1-1/+1
2018-09-27Automatic date update in version.inGDB Administrator1-1/+1
2018-09-26elf32-nds32: Remove elf32_nds32_allocate_dynrelocsSimon Marchi1-13/+0
It is unused, removing it fixes this error when building with clang: /home/emaisin/src/binutils-gdb/bfd/elf32-nds32.c:3172:1: error: unused function 'elf32_nds32_allocate_dynrelocs' [-Werror,-Wunused-function] elf32_nds32_allocate_dynrelocs (struct bfd_link_info *info, asection *sreloc, ^ 1 error generated. gcc only reports the error if you remove "inline". I don't know if this is actually a mistake and it should actually be used though. gdb/ChangeLog: * elf32-nds32.c (elf32_nds32_allocate_dynrelocs): Remove.
2018-09-26Automatic date update in version.inGDB Administrator1-1/+1
2018-09-25RISC-V: Give error for RVE PLTs.Jim Wilson2-8/+46
bfd/ * elfnn-riscv.c (riscv_make_plt_header): New arg output_bfd. Change return type to bfd_boolean. If EF_RISCV_RVE call _bfd_error_handler and return FALSE. Return TRUE at end. (riscv_make_plt_entry): Likewise. (riscv_elf_finish_dynamic_symbol): Update call to riscv_make_plt_entry. (riscv_elf_finish_dynamic_sections): Update call to riscv_make_plt_header.
2018-09-25Automatic date update in version.inGDB Administrator1-1/+1
2018-09-24RISC-V: For PCREL_LO12, fix addend handling in auipc lookup.Jim Wilson2-2/+11
bfd/ * elfnn-riscv.c (_bfd_riscv_relax_pc) <R_RISCV_PCREL_LO12_I>: New local hi_sec_off which is symbol address with addend subtracted. Use in riscv_find_pcgp_hi_reloc and riscv_record_pcgp_lo_reloc calls.
2018-09-24RISC-V: Allow pcrel_lo addends, error on addend overflow.Jim Wilson2-11/+26
bfd/ * elfnn-riscv.c (riscv_resolve_pcrel_lo_relocs): Add check for reloc overflow with addend. Use reloc_dangerous instead of reloc_overflow. Add strings for the two errors handled here. (riscv_elf_relocate_section) In case R_RISCV_PCREL_LO12_I, rewrite comment. Only give error with addend when used with section symbol. In case bfd_reloc_dangerous, update error string. ld/ * testsuite/ld-riscv-elf/ld-riscv-elf.exp: Run pcrel-lo-addend-2. * testsuite/ld-riscv/elf/ld-riscv-elf/pcrel-lo-addend-2.d: New. * testsuite/ld-riscv/elf/ld-riscv-elf/pcrel-lo-addend-2.s: New. * testsuite/ld-riscv/elf/ld-riscv-elf/pcrel-lo-addend.d: Update name and error string.
2018-09-24Fix PR gdb/20948: --write option to GDB causes segmentation faultJozef Lawrynowicz2-0/+18
When opening a BFD for update, as gdb --write does, modifications to anything but the contents of sections is restricted. Do not try to write back any ELF headers in this case. bfd/ChangeLog 2018-09-24 Jozef Lawrynowicz <jozef.l@mittosystems.com> PR gdb/20948 * elf.c (_bfd_elf_write_object_contents): Return from function early if abfd->direction == both_direction. gdb/testsuite/ChangeLog 2018-09-24 Jozef Lawrynowicz <jozef.l@mittosystems.com> PR gdb/20948 * gdb.base/write_mem.exp: New test. * gdb.base/write_mem.c: Likewise.
2018-09-24Automatic date update in version.inGDB Administrator1-1/+1
2018-09-23Automatic date update in version.inGDB Administrator1-1/+1
2018-09-22Automatic date update in version.inGDB Administrator1-1/+1
2018-09-21elf32-nds32: Don't define fls if it is provided by the systemSimon Marchi5-2/+14
The fls function already exists on macOS and FreeBSD (and probably others), leading to this error: /Users/simark/src/binutils-gdb/bfd/elf32-nds32.c:5074:1: error: static declaration of 'fls' follows non-static declaration fls (register unsigned int x) ^ /usr/include/strings.h:87:6: note: previous declaration is here int fls(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); ^ Add a configure-time check for it, and only define it if the system doesn't provide it. bfd/ChangeLog: * configure.ac: Check for fls. * elf32-nds32.c (fls): Only define if !HAVE_FLS. * config.in: Re-generate. * configure: Re-generate.
2018-09-21Automatic date update in version.inGDB Administrator1-1/+1
2018-09-20RS6000/BFD: Remove dead duplicate `config.bfd' target matchersMaciej W. Rozycki2-2/+7
Remove duplicate `rs6000-*-aix5.[01]' and `rs6000-*-aix[5-9]*' target configuration selectors meant to correspond to `powerpc64-*-aix5.[01]' and `powerpc64-*-aix[5-9]*' respectively for the purpose of BFD target vector selection in `config.bfd'. These selectors were added with commit 9a9e2ca33263 ("rs6000 xcoff bfd config"), <https://sourceware.org/ml/binutils/2010-12/msg00372.html>, and have been dead right from the beginning, because they appear twice each in the case statement, which means the earlier instance of each takes precedence and the other one is ignored. Here ones that alias to `powerpc-*-aix5.[01]' and `powerpc-*-aix[5-9]*' respectively immediately above are used instead. bfd/ * config.bfd <rs6000-*-aix5.[01], rs6000-*-aix[5-9]*>: Remove duplicate `case' selectors.
2018-09-20Andes Technology has good news for you, we plan to update the nds32 port of ↵Nick Clifton6-3252/+4820
binutils on upstream! We have not only removed all unsupported and obsolete code, but also supported lost of new features, including better link-time relaxations and TLS implementations. Besides, the files generated by the newly assembler and linker usually get higher performance and more optimized code size. ld * emultempl/nds32elf.em (hyper_relax): New variable. (nds32_elf_create_output_section_statements): the parameters of bfd_elf32_nds32_set_target_option (PARSE_AND_LIST_PROLOGUE, PARSE_AND_LIST_OPTIONS, PARSE_AND_LIST_ARGS_CASES): Add new option --mhyper-relax. * emultempl/nds32elf.em (nds32_elf_after_open): Updated. * emultempl/nds32elf.em (tls_desc_trampoline): New variable. * (nds32_elf_create_output_section_statements): Updated. * (nds32_elf_after_parse): Disable relaxations when PIC is enable. * (PARSE_AND_LIST_PROLOGUE, PARSE_AND_LIST_OPTIONS, PARSE_AND_LIST_ARGS_CASES): Add new option --m[no-]tlsdesc-trampoline. include * elf/nds32.h: Remove the unused target features. * dis-asm.h (disassemble_init_nds32): Declared. * elf/nds32.h (E_NDS32_NULL): Removed. (E_NDS32_HAS_DSP_INST, E_NDS32_HAS_ZOL): New. * opcode/nds32.h: Ident. (N32_SUB6, INSN_LW): New macros. (enum n32_opcodes): Updated. * elf/nds32.h: Doc fixes. * elf/nds32.h: Add R_NDS32_LSI. * elf/nds32.h: Add new relocations for TLS. gas * config/tc-nds32.c: Remove the unused target features. (nds32_relax_relocs, md_pseudo_table, nds32_elf_record_fixup_exp, nds32_set_elf_flags_by_insn, nds32_insert_relax_entry, nds32_apply_fix): Likewise. (nds32_no_ex9_begin): Removed. * config/tc-nds32.c (add_mapping_symbol_for_align, make_mapping_symbol, add_mapping_symbol): New functions. * config/tc-nds32.h (enum mstate): New. (nds32_segment_info_type): Likewise. * configure.ac (--enable-dsp-ext, --enable-zol-ext): New options. * config.in: Regenerated. * configure: Regenerated. * config/tc-nds32.c (nds32_dx_regs): Set the value according to the configuration. (nds32_perf_ext, nds32_perf_ext2, nds32_string_ext, nds32_audio_ext): Likewise. (nds32_dsp_ext): New variable. Set the value according to the configuration. (nds32_zol_ext): Likewise. (asm_desc, nds32_pseudo_opcode_table): Make them static. (nds32_set_elf_flags_by_insn): Updated. (nds32_check_insn_available): Updated. (nds32_str_tolower): New function. * config/tc-nds32.c (relax_table): Updated. (md_begin): Updated. (md_assemble): Use XNEW macro to allocate space for `insn.info', and then remember to free it. (md_section_align): Cast (-1) to ValueT. (nds32_get_align): Cast (~0U) to addressT. (nds32_relax_branch_instructions): Updated. (md_convert_frag): Add new local variable `final_r_type'. (invalid_prev_frag): Add new bfd_boolean parameter `relax'. All callers changed. * config/tc-nds32.c (struct nds32_relocs_pattern): Add `insn' field. (struct nds32_hint_map): Add `option_list' field. (struct suffix_name, suffix_table): Remove the unused `pic' field. (do_pseudo_b, do_pseudo_bal): Remove the suffix checking. (do_pseudo_la_internal, do_pseudo_pushpopm): Indent. (relax_hint_bias, relax_hint_id_current): New static variables. (reset_bias, relax_hint_begin): New variables. (nds_itoa): New function. (CLEAN_REG, GET_OPCODE): New macros. (struct relax_hint_id): New. (nds32_relax_hint): For .relax_hint directive, we can use `begin' and `end' to mark the relax pattern without giving exactly id number. (nds32_elf_append_relax_relocs): Handle the case that the .relax_hint directives are attached to pseudo instruction. (nds32_elf_save_pseudo_pattern): Change the second parameter from instruction's opcode to byte code. (nds32_elf_build_relax_relation): Add new bfd_boolean parameter `pseudo_hint'. (nds32_lookup_pseudo_opcode): Fix the overflow issue. (enum nds32_insn_type): Add N32_RELAX_ALU1 and N32_RELAX_16BIT. (nds32_elf_record_fixup_exp, relax_ls_table, hint_map, nds32_find_reloc_table, nds32_match_hint_insn, nds32_parse_name): Updated. * config/tc-nds32.h (MAX_RELAX_NUM): Extend it to 6. (enum nds32_relax_hint_type): Merge NDS32_RELAX_HINT_LA and NDS32_RELAX_HINT_LS into NDS32_RELAX_HINT_LALS. Add NDS32_RELAX_HINT_LA_PLT, NDS32_RELAX_HINT_LA_GOT and NDS32_RELAX_HINT_LA_GOTOFF. * config/tc-nds32.h (relax_ls_table): Add floating load/store to gp relax pattern. (hint_map, nds32_find_reloc_table): Likewise. * configure.ac: Define NDS32_LINUX_TOOLCHAIN. * configure: Regenerated. * config.in: Regenerated. * config/tc-nds32.h (enum nds32_ramp): Updated. (enum nds32_relax_hint_type): Likewise. * config/tc-nds32.c: Include "errno.h" and "limits.h". (relax_ls_table): Add TLS relax patterns. (nds32_elf_append_relax_relocs): Attach BFD_RELOC_NDS32_GROUP on each instructions of TLS patterns. (nds32_elf_record_fixup_exp): Updated. (nds32_apply_fix): Likewise. (suffix_table): Add TLSDESC suffix. binutils* testsuite/binutils-all/objcopy.exp: Set the unsupported reloc number from 215 to 255 for NDS32. bfd * elf32-nds32.c (nds32_elf_relax_loadstore): Remove the unused target features. (bfd_elf32_nds32_set_target_option): Remove the unused parameters. (nds32_elf_relax_piclo12, nds32_elf_relax_letlslo12, nds32_elf_relax_letlsadd, nds32_elf_relax_letlsls, nds32_elf_relax_pltgot_suff, nds32_elf_relax_got_suff nds32_elf_relax_gotoff_suff, calculate_plt_memory_address, calculate_plt_offset, calculate_got_memory_address, nds32_elf_check_dup_relocs): Removed. All callers changed. * elf32-nds32.h: Remove the unused macros and defines. (elf_nds32_link_hash_table): Remove the unused variable. (bfd_elf32_nds32_set_target_option): Update prototype. (nds32_elf_ex9_init): Removed. * elf32-nds32.c (nds32_convert_32_to_16): Updated. * elf32-nds32.c (HOWTO2, HOWTO3): Define new HOWTO macros to initialize array nds32_elf_howto_table in any order without lots of EMPTY_HOWTO. (nds32_reloc_map): Updated. * reloc.c: Add BFD_RELOC_NDS32_LSI. * bfd-in2.h: Regenerated. * bfd/libbfd.h: Regenerated. * elf32-nds32.c (nds32_elf_relax_howto_table): Add R_NDS32_LSI. (nds32_reloc_map): Likewise. (nds32_elf_relax_flsi): New function. (nds32_elf_relax_section): Support floating load/store relaxation. * elf32-nds32.c (NDS32_GUARD_SEC_P, elf32_nds32_local_gp_offset): New macro. (struct elf_nds32_link_hash_entry): New `offset_to_gp' field. (struct elf_nds32_obj_tdata): New `offset_to_gp' and `hdr_size' fields. (elf32_nds32_allocate_local_sym_info, nds32_elf_relax_guard, nds32_elf_is_target_special_symbol, nds32_elf_maybe_function_sym): New functions. (nds32_info_to_howto_rel): Add BFD_ASSERT. (bfd_elf32_bfd_reloc_type_table_lookup, nds32_elf_link_hash_newfunc, nds32_elf_link_hash_table_create, nds32_elf_relocate_section, nds32_elf_relax_loadstore, nds32_elf_relax_lo12, nds32_relax_adjust_label, bfd_elf32_nds32_set_target_option, nds32_fag_mark_relax): Updated. (nds32_elf_final_sda_base): Improve it to find the better gp value. (insert_nds32_elf_blank): Must consider `len' when inserting blanks. * elf32-nds32.h (bfd_elf32_nds32_set_target_option): Update prototype. (struct elf_nds32_link_hash_table): Add new variable `hyper_relax'. * elf32-nds32.c (elf32_nds32_allocate_dynrelocs): New function. (create_got_section): Likewise. (allocate_dynrelocs, nds32_elf_size_dynamic_sections, nds32_elf_relocate_section, nds32_elf_finish_dynamic_symbol): Updated. (nds32_elf_check_relocs): Fix the issue that the shared library may has TEXTREL entry in the dynamic section. (nds32_elf_create_dynamic_sections): Enable to call readonly_dynrelocs since the TEXTREL issue is fixed in the nds32_elf_check_relocs. (nds32_elf_finish_dynamic_sections): Update and add DT_RELASZ dynamic entry. (calculate_offset): Remove the unused parameter `pic_ext_target' and related codes. All callers changed. (elf_backend_dtrel_excludes_plt): Disable it temporarily since it will cause some errors for our test cases. * elf32-nds32.c (nds32_elf_merge_private_bfd_data): Allow to link the generic object. * reloc.c: Add TLS relocations. * libbfd.h: Regenerated. * bfd-in2.h: Regenerated. * elf32-nds32.h (struct section_id_list_t): New. (elf32_nds32_lookup_section_id, elf32_nds32_check_relax_group, elf32_nds32_unify_relax_group, nds32_elf_unify_tls_model): New prototypes. (elf32_nds32_compute_jump_table_size, elf32_nds32_local_tlsdesc_gotent): New macro. (nds32_insertion_sort, bfd_elf32_nds32_set_target_option, elf_nds32_link_hash_table): Updated. * elf32-nds32.c (enum elf_nds32_tls_type): New. (struct elf32_nds32_relax_group_t, struct relax_group_list_t): New. (elf32_nds32_add_dynreloc, patch_tls_desc_to_ie, get_tls_type, fls, ones32, list_insert, list_insert_sibling, dump_chain, elf32_nds32_check_relax_group, elf32_nds32_lookup_section_id, elf32_nds32_unify_relax_group, nds32_elf_unify_tls_model): New functions. (elf_nds32_obj_tdata): Add new fields. (elf32_nds32_relax_group_ptr, nds32_elf_local_tlsdesc_gotent): New macros. (nds32_elf_howto_table): Add TLS relocations. (nds32_reloc_map): Likewise. (nds32_elf_copy_indirect_symbol, nds32_elf_size_dynamic_sections, nds32_elf_finish_dynamic_symbol, elf32_nds32_allocate_local_sym_info, nds32_elf_relocate_section, bfd_elf32_nds32_set_target_option, nds32_elf_check_relocs, allocate_dynrelocs): Updated. (nds32_elf_relax_section): Call nds32_elf_unify_tls_model. (dtpoff_base): Rename it to `gottpof' and then update it. opcodes * nds32-asm.c (operand_fields): Remove the unused fields. (nds32_opcodes): Remove the unused instructions. * nds32-dis.c (nds32_ex9_info): Removed. (nds32_parse_opcode): Updated. (print_insn_nds32): Likewise. * nds32-asm.c (config.h, stdlib.h, string.h): New includes. (LEX_SET_FIELD, LEX_GET_FIELD): Update defines. (nds32_asm_init, build_operand_hash_table, build_keyword_hash_table, build_opcode_hash_table): New functions. (nds32_keyword_table, nds32_keyword_count_table, nds32_field_table, nds32_opcode_table): New. (hw_ktabs): Declare it to a pointer rather than an array. (build_hash_table): Removed. * nds32-asm.h (enum): Add SYN_INPUT, SYN_OUTPUT, SYN_LOPT, SYN_ROPT and upadte HW_GPR and HW_INT. * nds32-dis.c (keywords): Remove const. (match_field): New function. (nds32_parse_opcode): Updated. * disassemble.c (disassemble_init_for_target): Add disassemble_init_nds32. * nds32-dis.c (eum map_type): New. (nds32_private_data): Likewise. (get_mapping_symbol_type, is_mapping_symbol, nds32_symbol_is_valid, nds32_add_opcode_hash_table, disassemble_init_nds32): New functions. (print_insn_nds32): Updated. * nds32-asm.c (parse_aext_reg): Add new parameter. (parse_re, parse_re2, parse_aext_reg): Only reduced registers are allowed to use. All callers changed. * nds32-asm.c (keyword_usr, keyword_sr): Updated. (operand_fields): Add new fields. (nds32_opcodes): Add new instructions. (keyword_aridxi_mx): New keyword. * nds32-asm.h (enum): Add NASM_ATTR_DSP_ISAEXT, HW_AEXT_ARIDXI_MX and NASM_ATTR_ZOL. (ALU2_1, ALU2_2, ALU2_3): New macros. * nds32-dis.c (nds32_filter_unknown_insn): Updated.
2018-09-20PR23685, buffer overflowAlan Modra2-5/+12
PR 23685 * peXXigen.c (pe_print_edata): Correct export address table overflow checks. Check dataoff against section size too.
2018-09-20Bug 23686, two segment faults in nmAlan Modra3-7/+33
Fixes the bugs exposed by the testcases in the PR, plus two more bugs I noticed when looking at _bfd_stab_section_find_nearest_line. PR 23686 * dwarf2.c (read_section): Error when attempting to malloc "(bfd_size_type) -1". * syms.c (_bfd_stab_section_find_nearest_line): Bounds check function_name. Bounds check reloc address. Formatting. Ensure .stabstr zero terminated.
2018-09-20Automatic date update in version.inGDB Administrator1-1/+1
2018-09-19Automatic date update in version.inGDB Administrator1-1/+1
2018-09-18Add a warning to the bfd library for when it encounters an ELF file with an ↵Nick Clifton2-0/+14
invalid section size. PR 23657 * elfcode.h (elf_swap_shdr_in): Generate a warning message if an ELF section has contents and size larger than the file size.
2018-09-18Automatic date update in version.inGDB Administrator1-1/+1
2018-09-17S/390: Prevent GOT access rewrite for certain symbolsAndreas Krebbel1-2/+18
When dereferencing a GOT slot with lgrl or lg we rewrite this using larl to get rid of the extra memory access. However, we cannot do this for: - symbols marked for absolute addressing - symbols at odd addresses (larl can handle only even addresses) Fixed with the attached patch. bfd/ChangeLog: 2018-09-17 Andreas Krebbel <krebbel@linux.ibm.com> * elf64-s390.c (elf_s390_relocate_section): Prevent rewriting of GOT accesses with larl for ABS or misaligned symbols. ld/ChangeLog: 2018-09-17 Andreas Krebbel <krebbel@linux.ibm.com> * testsuite/ld-s390/gotreloc-1.s: Add tests for ABS and misaligned symbol. Move variables into data section. Make bar 8 bytes wide. * testsuite/ld-s390/gotreloc-1.ver: Make misaligned_sym resolve locally. * testsuite/ld-s390/gotreloc_31-1.dd: Adjust patterns. * testsuite/ld-s390/gotreloc_64-norelro-1.dd: Likewise. * testsuite/ld-s390/gotreloc_64-relro-1.dd: Likewise.
2018-09-17Automatic date update in version.inGDB Administrator1-1/+1
2018-09-16S12Z: Remove diagnostic printf statement.John Darrington1-2/+0
* bfd/elf32-s12z.c (bfd_elf32_bfd_reloc_name_lookup): Remove diagnostic printf (artifact from debugging)
2018-09-16S12Z: Set the source mask value of all howtos to zero.John Darrington1-4/+4
Thanks to Alan Modra for this hint. * bfd/elf32-s12z.c (elf_s12z_howto_table): set all src_mask members to zero.
2018-09-16Automatic date update in version.inGDB Administrator1-1/+1
2018-09-15Automatic date update in version.inGDB Administrator1-1/+1
2018-09-14PR ld/21375: MIPS: Fix non-zero run-time value for undefined weaksMaciej W. Rozycki6-42/+271
We have an issue in the MIPS backend, with the handling of undefined hidden and internal weak symbols. References to such symbols are supposed to resolve to 0 according to the ELF gABI[1]: "Unresolved weak symbols have a zero value." and the 64-bit MIPS psABI[2]: "If a symbol with one of these [hidden or internal] attributes has no definition within the executable/DSO being linked, then it must be resolved to allocated space if common, resolved to zero if weak, or an error reported otherwise." however if a GOT relocation is used, then a local GOT entry is created and used to satisfy the reference. Such an entry is then (in DSO and PIE binaries) subject to the usual load-time relocation, which means a non-zero value will be returned if the base address is non-zero. This will defeat the usual run-time sequence like: void a (void) __attribute__ ((visibility ("hidden"), weak)); void x (void) { if (a) a (); } This can be reproduced with this simple code: $ cat libtest.c extern int a __attribute__ ((visibility ("hidden"), weak)); int * x (void) { return &a; } $ cat test.c int *x (void); int main (void) { printf ("a: %p\n", x ()); return 0; } $ gcc -shared -fPIC -o libtest.so libtest.c $ gcc -o test test.c -Wl,-rpath,$(pwd) libtest.so $ ./test a: 0x77184000 $ The usual approach targets take is making all the steps required to assign a GOT entry for the symbol referred, and then leave its contents at zero with no dynamic relocation attached, therefore ensuring that the value does not change at load time. However this is not going to work with the implicitly relocated GOT the MIPS psABI specifies[3]: "The dynamic linker relocates the global offset table by first adding the difference between the base where the shared object is loaded and the value of the dynamic tag DT_MIPS_BASE_ADDRESS to all local global offset table entries." and we cannot therefore use the local GOT part. And we cannot offhand use the global part either, as the symbol would then have to be exported and possibly wrongly preempt symbols in other modules involved in the dynamic load, because as per the ELF gABI[1] we are not allowed to enter a hidden or internal symbol into the dynamic symbol table (and then use its associated GOT entry): "A hidden symbol contained in a relocatable object must be either removed or converted to STB_LOCAL binding by the link-editor when the relocatable object is included in an executable file or shared object." and: "An internal symbol contained in a relocatable object must be either removed or converted to STB_LOCAL binding by the link-editor when the relocatable object is included in an executable file or shared object." So we have to choose something else. Our choice is further limited by the need for the reference associated with the GOT relocation to stay within the signed 16-bit limit from the GOT pointer base register, while being compliant with the ELF gABI and the MIPS psABI. However as Alan Modra has observed[4] one possibility is to edit (relax) the code such that the GOT reference is removed altogether. Based on these observations then modify MIPS BFD linker backend code to: 1. Interpret code associated with GOT relocations and relax the usual LW or LD instructions into a corresponding immediate load operation that places the value of 0 in the intended register, while leaving the GOT entry allocated and initialized as usually. 2. Leave any other instructions associated with GOT relocations in place and instead redirect the reference to a global GOT entry associated with a special `__gnu_absolute_zero' symbol created for this purpose, whose value is 0, SHN_ABS section marks it absolute, binding is global and export class protected, ensuring that the locally provided value is always used at load time, and that the value is not relocated by the dynamic loader. 3. Adjust any high-part GOT relocation used, typically associated with a LUI instruction, accordingly, so that run-time consistency is maintained, either by resolving to the original entry if the instruction associated with the corresponding low-part GOT relocation has been relaxed to an immediate load (in which case the value loaded with LUI will be overwritten), or by also redirecting the reference to `__gnu_absolute_zero' to complete the GOT access sequence if that symbol has been used. 4. Add a target `elf_backend_hide_symbol' hook, for the three MIPS ABIs, which prevents the `__gnu_absolute_zero' symbol from being forced local, to ensure that the redirection works and the symbol remains global/protected with existing linker scripts unchanged. 5. Observing the issue with handling SHN_ABS symbols in the GNU dynamic loader, covered by glibc PR 19818, set the EI_ABIVERSION field in the ELF file header produced to 4 (ABI_ABSOLUTE) if `__gnu_absolute_zero' symbol has been produced and the target configured indicates the GNU operating system, so that broken versions of the GNU dynamic loader gracefully reject the file in loading rather than going astray. Keep EI_ABIVERSION at the original value for other operating systems or if no `__gnu_absolute_zero' symbol has been made. The name of the special `__gnu_absolute_zero' has no meaning other than how a human reader can interpret it, as it is ignored in dynamic loading in the handling of the scenarios concerned. This is because the symbol resolves locally, and it's only the symbol's attributes that matter so that the associated GOT entry remains unchanged at load time. Therefore the name is somewhat arbitrary, observing however the need to use the name space reserved for the system so that it does not conflict with a possible user symbol, and hence the leading underscore, and also the `gnu' infix to denote a GNU feature. Other implementations wishing to address the problem in a similar way may choose a different name and have the solution still work, possibly with a mixture of modules used in a dynamic having symbols of different names provided, which will however not interact with each other due to the protected export class. The symbol can be referred explicitly, however the name is an internal implementation detail rather than a part of the ABI, and therefore no specific semantics is guaranteed. One limitation of this change is that if `__gnu_absolute_zero' has been already defined, then we do not wipe the old definition and all kinds of odd behavior can result. This is however like with other symbols we internally define, such as `_GLOBAL_OFFSET_TABLE_' or `__rld_map', and therefore left as a possible future enhancement. As an optimization the relaxation of LW and LD instructions to a load of immediate zero is always made, even SVR4 PIC code for code that will end up in a regular (non-PIE) executable, because there is a cache advantage with the avoidance of a load from the GOT, even if it is otherwise guaranteed to remain zero. It does not reliably happen though, due to a symbol exportation issue affecting executables, covered by PR ld/21805. One existing test case needs to be updated, as it triggers relaxation introduced with this change and consequently linker output does not match expectations anymore. As we want to keep the original issue covered with the test case modify it then to use the LWL instruction in place of LW, and adjust the output expected accordingly. References: [1] "System V Application Binary Interface - DRAFT - 19 October 2010", The SCO Group, Section "Symbol Table", <http://www.sco.com/developers/gabi/2012-12-31/ch4.symtab.html> [2] "64-bit ELF Object File Specification, Draft Version 2.5", MIPS Technologies / Silicon Graphics Computer Systems, Order Number 007-4658-001, Section 2.5 "Symbol Table", p. 22, <http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf> [3] "SYSTEM V APPLICATION BINARY INTERFACE, MIPS RISC Processor Supplement, 3rd Edition", Section "Global Offset Table", p. 5-10, <http://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf> [4] "Undo dynamic symbol state after regular object sym type mismatch", <https://sourceware.org/ml/binutils/2017-07/msg00265.html> bfd/ PR ld/21375 * elfxx-mips.h (_bfd_mips_elf_hide_symbol): New prototype. (_bfd_mips_elf_linker_flags): Update prototype. * elf32-mips.c (elf_backend_hide_symbol): New macro. * elf64-mips.c (elf_backend_hide_symbol): Likewise. * elfn32-mips.c (elf_backend_hide_symbol): Likewise. * elfxx-mips.c (mips_elf_link_hash_table): Add `use_absolute_zero' and `gnu_target' members. (mips_elf_record_global_got_symbol): Call `_bfd_mips_elf_hide_symbol' rather than `_bfd_elf_link_hash_hide_symbol'. (mips_use_local_got_p): Return FALSE if the symbol is absolute. (mips_elf_obtain_contents): Reorder function. (mips_elf_nullify_got_load): New function. (mips_elf_calculate_relocation): Add `contents' parameter. Nullify GOT loads or if it is not possible, then redirect GOT relocations to the `__gnu_absolute_zero' symbol, for references that are supposed to resolve to zero. (mips_elf_define_absolute_zero): New function. (_bfd_mips_elf_check_relocs): Prepare for arrangements made in `mips_elf_calculate_relocation' for references made via the GOT that are supposed to resolve to zero. (_bfd_mips_elf_hide_symbol): New function. (_bfd_mips_elf_linker_flags): Add the `gnu_target' parameter, set the `gnu_target' member of the MIPS hash table. (MIPS_LIBC_ABI_ABSOLUTE): New enumeration constant. (_bfd_mips_post_process_headers): Use it. ld/ PR ld/21375 * emultempl/mipself.em: Set `gnu_target' according to ${target}. (mips_create_output_section_statements): Update call to `_bfd_mips_elf_linker_flags'. * testsuite/ld-mips-elf/pr21334.s: Use LWL rather than LW. * testsuite/ld-mips-elf/pr21334.dd: Update accordingly.
2018-09-14MIPS/BFD: Factor out relocated field storingMaciej W. Rozycki2-4/+21
Move code used to store the contents of a relocated field in output into a separate function, `mips_elf_store_contents', complementing existing `mips_elf_obtain_contents'. bfd/ * elfxx-mips.c (mips_elf_store_contents): New function... (mips_elf_perform_relocation): ... factored out from here.
2018-09-14csky: Support PC relative diff relocationLifang Xia2-1/+12
Define DIFF_EXPR_OK to Support PC relative diff relocation, and add CKCORE_PCREL32 relocation process bfd/ * elf32-csky.c (csky_elf_howto_table): Fill special_function of R_CKCORE_PCREL32. (csky_elf_relocate_section): Add R_CKCORE_PCREL32 process. gas/ * config/tc-csky.c (md_apply_fix): Transmit BFD_RELOC_32_PCREL to BFD_RELOC_CKCORE_PCREL32. (tc_gen_reloc): Trasmit BFD_RELOC_CKCORE_ADDR32 to BFD_RELOC_CKCORE_PCREL32 while pc-relative. * config/tc-csky.h (DIFF_EXPR_OK): Define to enable PC relative diff relocs.
2018-09-14PR23425, unresolved symbol diagnosticAlan Modra3-2/+25
dwarf2.c code reasonably assumes that debug info is local to a file, an assumption now violated by gcc, resulting in "DWARF error: invalid abstract instance DIE ref" or wrong details when attempting to print linker error messages with file, function and line reported. This is because find_abstract_instance is only prepared to handle DW_FORM_ref_addr when the .debug_info section referenced is in the current file. When that isn't the case, relocations to access another file's .debug_info will typically be against a symbol defined at the start of that .debug_info section, plus an addend. Since the dwarf2.c code only considers the current file's debug info, that symbol will be undefined, resolving to zero. In effect the ref_addr will wrongly resolve to the current file's .debug_info. This patch avoids the problem by treating relocations in debug sections against undefined symbols in a similar manner to the way relocations against symbols defined in discarded sections are resolved. They result in a zero value (except in .debug_ranges) regardless of the addend. PR 23425 * reloc.c (bfd_generic_get_relocated_section_contents): Zero reloc fields in debug sections when reloc is against an undefined symbol and called from bfd_simple_get_relocated_section_contents or similar. * dwarf2.c (find_abstract_instance): Return true for zero offset DW_FORM_ref_addr without returning values.
2018-09-14Automatic date update in version.inGDB Administrator1-1/+1
2018-09-13Automatic date update in version.inGDB Administrator1-1/+1
2018-09-12Automatic date update in version.inGDB Administrator1-1/+1
2018-09-11Automatic date update in version.inGDB Administrator1-1/+1
2018-09-10Automatic date update in version.inGDB Administrator1-1/+1
2018-09-09Automatic date update in version.inGDB Administrator1-1/+1
2018-09-08Automatic date update in version.inGDB Administrator1-1/+1
2018-09-07Automatic date update in version.inGDB Administrator1-1/+1
2018-09-06PR23570, AVR .noinit section defaults to PROGBITSAlan Modra2-0/+13
Revert commit 8744470deab and instead use the standard special_sections support. PR 23570 bfd/ * elf32-avr.c (elf_avr_special_sections): New. (elf_backend_special_sections): Define. gas/ * config/tc-avr.c: Revert 2018-09-03 change.
2018-09-06Automatic date update in version.inGDB Administrator1-1/+1
2018-09-05Automatic date update in version.inGDB Administrator1-1/+1
2018-09-04bfd, sparc: avoid duplicated error messages on invalid relocations.Jose E. Marchesi2-2/+6
This patch avoids a duplicated error message when an invalid relocation number is read from an object file in sparc-* ELF targets: $ strip -g test.o strip: test.o: unsupported relocation type 0xd7 strip: test.o: unsupported relocation type 0xd7 strip: test.o: bad value Tested in x86_64-linux-gnu, sparc64-linux-gnu and sparc-linux-gnu targets. bfd/ChangeLog: 2018-09-04 Jose E. Marchesi <jose.marchesi@oracle.com> * elfxx-sparc.c (_bfd_sparc_elf_info_to_howto): Do not issue an error when an invalid relocation is passed; this is already done by `_bfd_sparc_elf_info_to_howto_ptr'.
2018-09-04bfd, sparc: issue an error when reading relocations with invalid symbol ↵Jose E. Marchesi2-5/+19
references. The function `elf64_sparc_slurp_one_reloc_table' in elf64-sparc.c currently checks that the symbol indexes read in the r_sym fields of relocations are in range. This is done for both dynamic and non-dynamic symbols. This avoids subsequent invalid memory accesses. However, no error is issued to the user. This patch makes BFD to issue an error when the read symbol index is out of range, following the same behavior implemented in both the generic ELF routines and other ELF backends (such as mips64). Tested in x86_64-linux-gnu, sparc64-linux-gnu, and --enable-targets=all. 2018-09-04 Jose E. Marchesi <jose.marchesi@oracle.com> * elf64-sparc.c (elf64_sparc_slurp_one_reloc_table): Issue an error when an invalid symbol index is retrieved in ELF64_R_SYM of a relocation seen in an input file.
2018-09-04Automatic date update in version.inGDB Administrator1-1/+1
2018-09-03PR23595, simple objcopy of executable failure for msp430-elfJozef Lawrynowicz2-2/+23
VMA of the first section in the segment containing the ELF file header (and possibly section headers too) can't be used to reliably find the size of the headers plus padding. What's really needed is sh_offset of the first section assuming it has contents (vma does have a relationship to sh_offset, but is only guaranteed in demand paged executables). If the first section is SHT_NOBITS and it hasn't been converted to have file contents by the existence of a following SHT_PROGBITS section in the same segment, the sh_offset value also isn't reliable. PR 23595 elf.c (copy_elf_program_header): When first segment contains only the headers and SHT_NOBITS sections, use segment p_filesz to calculate header and padding size. Use filepos of the first section otherwise.