aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2014-06-13Better overflow checking for powerpc32 relocationsAlan Modra2-159/+188
Similar to the powerpc64 patch, this improves overflow checking in elf32-ppc.c. Many reloc "howto" entries needed fixes, some just cosmetic. The patch also fixes the R_PPC_VLE_SDA21 reloc application code, which was horribly broken. In fact, it may still be broken since Power ISA 2.07 says e_li behaves as RT <- EXTS(li20 1:4 || li20 5:8 || li20 0 || li20 9:19) where li20 is a field taken from bits 17..20, 11..15, 21..31 of the instruction. Freescale VLEPEM says differently, and I assume correctly, that RT <- EXTS(li20 0:3 || li20 4:8 || li20 9:19) The VLE_SDA21 relocation description matches this too. Now the VLE_SDA21 relocation specifies in the case where e_addi16 is converted to e_li for symbols in .PPC.EMB.sdata0 or .PPC.EMB.sbss0 (no base register), that the field is restricted to 16 bits, with the sign bit being propagated to the top 4 bits. I don't see the sense in restricting the value like this, so have allowed the full 20 bit signed value. This of course is compatible with the reloc description in that values in the 16 bit signed range will result in exactly the same insn field as when the reloc description is followed to the letter. * elf32-ppc.c (ppc_elf_howto_raw): Correct overflow check for many relocations. Correct bitsize and rightshift too for a number of VLE relocs. Describe R_PPC_VLE_SDA21 and R_PPC_VLE_SDA21_LO. Correct dst_mask on R_PPC_VLE_SDA21_LO. (ppc_elf_vle_split16): Tidy, delete unnecessary prototype. (ppc_elf_relocate_section): Modify overflow test for 16-bit fields in instructions to signed/unsigned according to whether the field takes a signed or unsigned value. Tidy vle split16 code. Correct R_PPC_VLE_SDA21 and R_PPC_VLE_SDA21_LO handling.
2014-06-13Better overflow checking for powerpc64 relocationsAlan Modra4-38/+133
R_PPC64_ADDR16 is used in three contexts: - .short data relocation - 16-bit signed insn fields, eg. addi - 16-bit unsigned insn fields, eg. ori In the first case we want to allow both signed and unsigned 16-bit values, the latter two ought to error if the field exceeds the range of values allowed for 16-bit signed and unsigned integers respectively. These conflicting requirements meant that ld had to choose the least restrictive overflow checks, and thus it is possible to construct testcases where an addi field overflows but is not reported by ld. Many relocations dealing with 16-bit insn fields have this problem. What's more, some relocations that are only ever used for signed fields of instructions woodenly copied the lax overflow checking of R_PPC64_ADDR16. bfd/ * elf64-ppc.c (ppc64_elf_howto_raw): Use complain_overflow_signed for R_PPC64_ADDR14, R_PPC64_ADDR14_BRTAKEN, R_PPC64_ADDR14_BRNTAKEN, R_PPC64_SECTOFF, R_PPC64_ADDR16_DS, R_PPC64_SECTOFF_DS, R_PPC64_REL16 entries. Use complain_overflow_dont for R_PPC64_TOC. (ppc64_elf_relocate_section): Modify overflow test for 16-bit fields in instructions to signed/unsigned according to whether the field takes a signed or unsigned value. gold/ * powerpc.cc (Powerpc_relocate_functions::Overflow_check): Add CHECK_UNSIGNED, CHECK_LOW_INSN, CHECK_HIGH_INSN. (Powerpc_relocate_functions::has_overflow_unsigned): New function. (Powerpc_relocate_functions::has_overflow_bitfield, overflowed): Use the above. (Target_powerpc::Relocate::relocate): Correct overflow checking for a number of relocations. Modify overflow test for 16-bit fields in instructions to signed/unsigned according to whether the field takes a signed or unsigned value.
2014-06-13Control powerpc64-ld provision of register save/restoreAlan Modra5-3/+40
This patch allows the user to override powerpc64-ld's default for providing linker generated register save and restore functions as used by gcc -Os code. Normally these are not provided by ld -r, so Linux kernel modules have needed to include their own copies. bfd/ * elf64-ppc.h (struct ppc64_elf_params): Add save_restore_funcs. * elf64-ppc.c (ppc64_elf_func_desc_adjust): Use it to control provision of out-of-line register save/restore routines. ld/ * emultempl/ppc64elf.em (params): Init new field. (ppc_create_output_section_statements): Set params.save_restore_funcs default. (PARSE_AND_LIST_*): Add support for --save-restore-funcs and --no-save-restore-funcs.
2014-06-13Consolidate ppc64 ld/bfd communicationAlan Modra5-183/+199
Moves assorted variables used to communicate between ld and bfd into a struct, hooks it into the bfd link_hash_table early, and removes all other places where such variables were passed piecemeal. bfd/ * elf64-ppc.h (struct ppc64_elf_params): Define. (ppc64_elf_init_stub_bfd, ppc64_elf_edit_opd, ppc64_elf_tls_setup, ppc64_elf_setup_section_lists, ppc64_elf_size_stubs, ppc64_elf_build_stubs): Update prototype. * elf64-ppp.c (struct ppc_link_hash_table): Add params, delete other fields now in params. Adjust code throughout file. (ppc64_elf_init_stub_bfd): Delete "abfd" parameter, add "params". Save params pointer in htab. (ppc64_elf_edit_opd, ppc64_elf_tls_setup, ppc64_elf_setup_section_lists, ppc64_elf_size_stubs, ppc64_elf_build_stubs): Remove parameters now in "params". ld/ * emultemps/ppc64elf.em (params): New static struct replacing various other static vars. Adjust code throughout file.
2014-06-13PR15530, mark symbol in executables if it matches dynamic_listAlan Modra3-7/+20
For powerpc64 as HJ did earlier for other ELF targets, and a tidy. PR gold/15530 * elf64-ppc.c (ppc64_elf_gc_mark_dynamic_ref): Support --export-dynamic and --dynamic-list marking of symbols. * elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Reorder cheap tests first.
2014-06-13Mark symbol in executables if it matches dynamic_listH.J. Lu7-1/+41
bfd/ PR gold/16530 * elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Mark symbol in executables if it matches dynamic_list. ld/testsuite/ PR gold/16530 * ld-elf/dynamic-1.c: New file. * ld-elf/dynamic-1.rd: Likewise. * ld-elf/dynamic-1.syms: Likewise. * ld-elf/shared.exp (build_tests): Add dynamic-1.
2014-06-13Error on shared lib call to @local ifuncAlan Modra2-2/+30
On powerpc32, making ifuncs have non-default visibility in shared libraries or pies can result in runtime failures. The problem is that if gcc is told that a given function has non-default visibility, then calls to that function are assumed to be local (which is true) and thus need not go via a plt call stub (which is false for ifunc). If the caller has no other reason to set up the got pointer (r30), code won't be emitted to do so. However, a pic plt call stub makes use of r30 to load the plt entry. So a call to an ifunc, which always needs a plt entry, will fail. This patch makes ld emit an error for the problem case, and allows calls to non-default visibility ifuncs to work in normal executables. I also fix some cases where ifuncs fail when using the old bss-plt. * elf32-ppc.c (ppc_elf_check_relocs): For @local call to ifunc, error when shared and force a plt call otherwise. (ppc_elf_size_dynamic_sections): Don't emit DT_PPC_GOT unless plt_type == PLT_NEW. (ppc_elf_relocate_section): Add missing test to resolve ifuncs to the appropriate call stub.
2014-06-12daily updateAlan Modra1-1/+1
2014-06-11daily updateAlan Modra1-1/+1
2014-06-10daily updateAlan Modra1-1/+1
2014-06-09daily updateAlan Modra1-1/+1
2014-06-08daily updateAlan Modra1-1/+1
2014-06-07daily updateAlan Modra1-1/+1
2014-06-06daily updateAlan Modra1-1/+1
2014-06-05daily updateAlan Modra1-1/+1
2014-06-04daily updateAlan Modra1-1/+1
2014-06-03daily updateAlan Modra1-1/+1
2014-06-02daily updateAlan Modra1-1/+1
2014-06-01daily updateAlan Modra1-1/+1
2014-05-31daily updateAlan Modra1-1/+1
2014-05-30daily updateAlan Modra1-1/+1
2014-05-29daily updateAlan Modra1-1/+1
2014-05-28daily updateAlan Modra1-1/+1
2014-05-27Properly handle 64-bit GOT relocationsH.J. Lu2-2/+11
This patch fixes 2 issues: 1. Since the GOT offset is always negative, we need to use signed int to support 64-bit GOT relocations. 2. R_X86_64_PLTOFF64 uses the address of GLOBAL_OFFSET_TABLE, which is the address of the .got.plt section, not the .got section. PR gold/16945 * x86_64.cc (Target_x86_64::Relocate::relocate): Use signed int for got_offset. Properly get GOT address for R_X86_64_PLTOFF64.
2014-05-27daily updateAlan Modra1-1/+1
2014-05-26daily updateAlan Modra1-1/+1
2014-05-25daily updateAlan Modra1-1/+1
2014-05-24daily updateAlan Modra1-1/+1
2014-05-23daily updateAlan Modra1-1/+1
2014-05-22daily updateAlan Modra1-1/+1
2014-05-21daily updateAlan Modra1-1/+1
2014-05-20daily updateAlan Modra1-1/+1
2014-05-19daily updateAlan Modra1-1/+1
2014-05-18daily updateAlan Modra1-1/+1
2014-05-17daily updateAlan Modra1-1/+1
2014-05-16daily updateAlan Modra1-1/+1
2014-05-15daily updateAlan Modra1-1/+1
2014-05-14daily updateAlan Modra1-1/+1
2014-05-13daily updateAlan Modra1-1/+1
2014-05-12daily updateAlan Modra1-1/+1
2014-05-112014-05-11 Chung-Lin Tang <cltang@codesourcery.com>Chung-Lin Tang2-2/+10
Backport from master 2014-05-11 Chung-Lin Tang <cltang@codesourcery.com> * emulparams/nios2linux.sh (OTHER_GOT_SYMBOLS): Wrap _gp in HIDDEN(), and gp in PROVIDE_HIDDEN.
2014-05-11daily updateAlan Modra1-1/+1
2014-05-10daily updateAlan Modra1-1/+1
2014-05-09daily updateAlan Modra1-1/+1
2014-05-08daily updateAlan Modra1-1/+1
2014-05-07daily updateAlan Modra1-1/+1
2014-05-06Fix issue where first reserved word of GOT is not initialized if thereCary Coutant3-68/+167
is no PLT. gold/ PR gold/16900 * i386.cc (Output_data_got_plt_i386): New class. (Output_data_plt_i386::Output_data_plt_i386): Change type of got_plt parameter. Change all callers. (Output_data_plt_i386::layout_): Remove. (Output_data_plt_i386::got_plt_): Change type. (Target_i386::got_plt_): Change type. Change all references. (Target_i386::got_section): Create instance of new class. (Output_data_got_plt_i386::do_write): New function. * x86_64.cc (Output_data_got_plt_x86_64): New class. (Output_data_plt_x86_64::Output_data_plt_x86_64): Change type of got_plt parameter. Change all callers. (Output_data_plt_x86_64::layout_): Remove. (Output_data_plt_x86_64::got_plt_): Change type. (Target_x86_64::got_plt_): Change type. Change all references. (Target_x86_64::got_section): Create instance of new class. (Output_data_got_plt_x86_64::do_write): New function. (Output_data_plt_x86_64::do_write): Don't write reserved words in GOT. (Target_x86_64<size>::init_got_plt_for_update): Create instance of new class.
2014-05-06Fix handling of __ehdr_start when it cannot be defined.Cary Coutant13-37/+532
gold/ * defstd.cc (in_segment): Define __ehdr_start here... * layout.cc (Layout::finalize): ...Instead of here. Set the output segment when known. * resolve.cc (Symbol::override_base_with_special): Remember the original binding. * symtab.cc (Symbol::set_output_segment): New function. (Symbol::set_undefined): New function. * symtab.h (Symbol::is_weak_undefined): Check original undef binding. (Symbol::is_strong_undefined): New function. (Symbol::set_output_segment): New function. (Symbol::set_undefined): New function. * target-reloc.h (is_strong_undefined): Remove. (issue_undefined_symbol_error): Call Symbol::is_weak_undefined. Check for hidden undefs. (relocate_section): Call Symbol::is_strong_undefined. * testsuite/Makefile.am (ehdr_start_test_1) (ehdr_start_test_2, ehdr_start_test_3) (ehdr_start_test_4, ehdr_start_test_5): New test cases. * testsuite/Makefile.in: Regenerate. * testsuite/ehdr_start_def.cc: New source file. * testsuite/ehdr_start_test.cc: New source file. * testsuite/ehdr_start_test.t: New linker script. * testsuite/ehdr_start_test_4.sh: New shell script.
2014-05-06daily updateAlan Modra1-1/+1
2014-05-05daily updateAlan Modra1-1/+1