From: Matthias Klose Date: Tue, 17 Oct 2017 09:29:33 +0000 (+0100) Subject: branch-updates X-Git-Tag: archive/raspbian/2.29.1-5+rpi1^2~24 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c2f0dd8e17899a412e9e7d6fdb1a50da844a5df5;p=binutils.git branch-updates # DP: updates from the binutils-2.29 branch # git diff d1a6e7195b9bb0255fa77588985b969ad8aaacf5 8afa21fd199dc1c10a1ea8fb01c71a24ddb15ae4 Gbp-Pq: Name branch-updates.diff --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 417ed273a..cd0a8f24d 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,49 @@ +2017-10-05 Alan Modra + + * elflink.c (elf_link_input_bfd): Correct ctor/dtor in init_array/ + fini_array error value. + +2017-10-04 Pavel I. Kryukov + + PR 22245 + * bfd.c (bfd_set_error): Avoid UB on passing arg to va_start that + undergoes default promotion. + * bfd-in2.h: Regenerate. + +2017-09-28 Alan Modra + + PR 22220 + * elflink.c (_bfd_elf_merge_symbol): Set non_ir_ref_dynamic in + a case where plugin_notice isn't called. + +2017-09-26 H.J. Lu + + PR ld/22199 + * elf64-x86-64.c (elf_x86_64_finish_dynamic_symbol): Don't pass + output_bfd to info->callbacks->minfo. + +2017-09-22 H.J. Lu + + PR binutils/22170 + * elf32-i386.c (elf_i386_get_synthetic_symtab): Guard against + corrupted PLT. + * elf64-x86-64.c (elf_x86_64_get_synthetic_symtab): Likewise. + +2017-09-22 H.J. Lu + + PR binutils/22163 + * elf32-i386.c (elf_i386_get_synthetic_symtab): Also return -1 + if bfd_canonicalize_dynamic_reloc returns 0. + * elf64-x86-64.c (elf_x86_64_get_synthetic_symtab): Likewise. + +2017-09-21 Nick Clifton + + * development.sh (development): Revert previous delta. + +2017-09-20 Nick Clifton + + * development.sh (development): Set to false. + 2017-09-19 Nick Clifton 2.29.1 Release diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 1343780c8..0dba68b1e 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -7053,7 +7053,7 @@ bfd_error_type; bfd_error_type bfd_get_error (void); -void bfd_set_error (bfd_error_type error_tag, ...); +void bfd_set_error (int error_tag, ...); const char *bfd_errmsg (bfd_error_type error_tag); diff --git a/bfd/bfd.c b/bfd/bfd.c index 665f18255..5da1a6fd5 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -497,7 +497,7 @@ FUNCTION bfd_set_error SYNOPSIS - void bfd_set_error (bfd_error_type error_tag, ...); + void bfd_set_error (int error_tag, ...); DESCRIPTION Set the BFD error condition to be @var{error_tag}. @@ -507,7 +507,7 @@ DESCRIPTION */ void -bfd_set_error (bfd_error_type error_tag, ...) +bfd_set_error (int error_tag, ...) { bfd_error = error_tag; if (error_tag == bfd_error_on_input) diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 5c1c3ff79..ba50c93f3 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -6342,7 +6342,7 @@ elf_i386_get_synthetic_symtab (bfd *abfd, dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf, dynsyms); - if (dynrelcount < 0) + if (dynrelcount <= 0) return -1; /* Sort the relocs by address. */ @@ -6616,6 +6616,10 @@ bad_return: size += sizeof ("+0x") - 1 + 8; n++; s++; + /* There should be only one entry in PLT for a given + symbol. Set howto to NULL after processing a PLT + entry to guard against corrupted PLT. */ + p->howto = NULL; } offset += plt_entry_size; } diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 80dd791d2..1f6dfb89b 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -6133,7 +6133,6 @@ elf_x86_64_finish_dynamic_symbol (bfd *output_bfd, if (SYMBOL_REFERENCES_LOCAL (info, h)) { info->callbacks->minfo (_("Local IFUNC function `%s' in %B\n"), - output_bfd, h->root.root.string, h->root.u.def.section->owner); @@ -6717,7 +6716,7 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd, dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf, dynsyms); - if (dynrelcount < 0) + if (dynrelcount <= 0) return -1; /* Sort the relocs by address. */ @@ -6970,6 +6969,10 @@ bad_return: size += sizeof ("+0x") - 1 + 8 + 8 * ABI_64_P (abfd); n++; s++; + /* There should be only one entry in PLT for a given + symbol. Set howto to NULL after processing a PLT + entry to guard against corrupted PLT. */ + p->howto = NULL; } offset += plt_entry_size; } diff --git a/bfd/elflink.c b/bfd/elflink.c index 02713a595..39d878c81 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -1234,6 +1234,16 @@ _bfd_elf_merge_symbol (bfd *abfd, olddyn = (oldsec->symbol->flags & BSF_DYNAMIC) != 0; } + /* Handle a case where plugin_notice won't be called and thus won't + set the non_ir_ref flags on the first pass over symbols. */ + if (oldbfd != NULL + && (oldbfd->flags & BFD_PLUGIN) != (abfd->flags & BFD_PLUGIN) + && newdyn != olddyn) + { + h->root.non_ir_ref_dynamic = TRUE; + hi->root.non_ir_ref_dynamic = TRUE; + } + /* NEWDEF and OLDDEF indicate whether the new or old symbol, respectively, appear to be a definition rather than reference. */ @@ -10429,7 +10439,7 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd) (_("error: %B: size of section %A is not " "multiple of address size"), input_bfd, o); - bfd_set_error (bfd_error_on_input); + bfd_set_error (bfd_error_bad_value); return FALSE; } o->flags |= SEC_ELF_REVERSE_COPY; diff --git a/bfd/version.h b/bfd/version.h index 3405e424f..61ec80f9e 100644 --- a/bfd/version.h +++ b/bfd/version.h @@ -1,4 +1,4 @@ -#define BFD_VERSION_DATE 20170919 +#define BFD_VERSION_DATE 20171017 #define BFD_VERSION @bfd_version@ #define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@ #define REPORT_BUGS_TO @report_bugs_to@ diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 84d3d7c1c..ffb34fbb7 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2017-09-21 Maciej W. Rozycki + + * readelf.c (get_machine_flags) : New case. + 2017-09-15 Nick Clifton 2.29.1 Release diff --git a/binutils/readelf.c b/binutils/readelf.c index fb16df8e2..41f128ed2 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -3325,6 +3325,7 @@ get_machine_flags (unsigned e_flags, unsigned e_machine) case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break; case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break; case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break; + case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break; case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break; case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break; case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break; diff --git a/gas/ChangeLog b/gas/ChangeLog index 42a676f59..9aa3dbca3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2017-09-21 Maciej W. Rozycki + + * testsuite/gas/mips/elf_mach_5900.d: New test. + * testsuite/gas/mips/mips.exp: Run it. + 2017-09-15 Nick Clifton 2.29.1 Release diff --git a/gas/testsuite/gas/mips/elf_mach_5900.d b/gas/testsuite/gas/mips/elf_mach_5900.d new file mode 100644 index 000000000..1df668e7e --- /dev/null +++ b/gas/testsuite/gas/mips/elf_mach_5900.d @@ -0,0 +1,22 @@ +#readelf: -Ah +#name: ELF R5900 markings +#as: -32 -march=r5900 +#source: empty.s + +ELF Header: +#... + Flags: +0x..92...., .*5900.* +#... + +MIPS ABI Flags Version: 0 + +ISA: MIPS3 +GPR size: 32 +CPR1 size: 32 +CPR2 size: 0 +FP ABI: .* +ISA Extension: Toshiba R5900 +ASEs: + None +FLAGS 1: .* +FLAGS 2: .* diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index c71dca435..25221ae2a 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -1149,6 +1149,7 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test "elf_ase_micromips-2" # Verify that machine markings are handled properly. + run_dump_test "elf_mach_5900" run_dump_test "elf_mach_interaptiv-mr2" run_dump_test "mips-gp32-fp32-pic" diff --git a/gold/ChangeLog b/gold/ChangeLog index 6071f8977..32c0e21f5 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,19 @@ +2017-09-28 Alan Modra + + * powerpc.cc (Target_powerpc<64,*>::powerpc_info): Set + is_default_stack_executable false. + +2017-08-03 James Clarke + + * options.h (General_options): Set a non-NULL second help string + argument for relax to allow --no-relax. + +2017-09-20 Alan Modra + + * powerpc.cc (Target_powerpc::Branch_info::make_stub): Put + stubs for ppc32 non-branch relocs in first stub table. + (Target_powerpc::Relocate::relocate): Resolve similarly. + 2017-09-19 Alan Modra * options.h (stub-group-multi): Default to true. Add diff --git a/gold/options.h b/gold/options.h index 576b2a3c5..4a802cf41 100644 --- a/gold/options.h +++ b/gold/options.h @@ -1164,7 +1164,8 @@ class General_options N_("Generate relocatable output"), NULL); DEFINE_bool(relax, options::TWO_DASHES, '\0', false, - N_("Relax branches on certain targets"), NULL); + N_("Relax branches on certain targets"), + N_("Do not relax branches")); DEFINE_string(retain_symbols_file, options::TWO_DASHES, '\0', NULL, N_("keep only symbols listed in this file"), N_("FILE")); diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 629da4f8a..22590c1e4 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -1618,7 +1618,7 @@ Target::Target_info Target_powerpc<64, true>::powerpc_info = false, // has_make_symbol true, // has_resolve false, // has_code_fill - true, // is_default_stack_executable + false, // is_default_stack_executable false, // can_icf_inline_merge_sections '\0', // wrap_char "/usr/lib/ld.so.1", // dynamic_linker @@ -1646,7 +1646,7 @@ Target::Target_info Target_powerpc<64, false>::powerpc_info = false, // has_make_symbol true, // has_resolve false, // has_code_fill - true, // is_default_stack_executable + false, // is_default_stack_executable false, // can_icf_inline_merge_sections '\0', // wrap_char "/usr/lib/ld.so.1", // dynamic_linker @@ -3065,11 +3065,17 @@ Target_powerpc::Branch_info::make_stub( target->glink_section()->add_global_entry(gsym); else { - if (stub_table == NULL) + if (stub_table == NULL + && !(size == 32 + && gsym != NULL + && !parameters->options().output_is_position_independent() + && !is_branch_reloc(this->r_type_))) stub_table = this->object_->stub_table(this->shndx_); if (stub_table == NULL) { - // This is a ref from a data section to an ifunc symbol. + // This is a ref from a data section to an ifunc symbol, + // or a non-branch reloc for which we always want to use + // one set of stubs for resolving function addresses. stub_table = ifunc_stub_table; } gold_assert(stub_table != NULL); @@ -8052,11 +8058,20 @@ Target_powerpc::Relocate::relocate( } else { - Stub_table* stub_table - = object->stub_table(relinfo->data_shndx); + Stub_table* stub_table = NULL; + if (target->stub_tables().size() == 1) + stub_table = target->stub_tables()[0]; + if (stub_table == NULL + && !(size == 32 + && gsym != NULL + && !parameters->options().output_is_position_independent() + && !is_branch_reloc(r_type))) + stub_table = object->stub_table(relinfo->data_shndx); if (stub_table == NULL) { - // This is a ref from a data section to an ifunc symbol. + // This is a ref from a data section to an ifunc symbol, + // or a non-branch reloc for which we always want to use + // one set of stubs for resolving function addresses. if (target->stub_tables().size() != 0) stub_table = target->stub_tables()[0]; } diff --git a/ld/ChangeLog b/ld/ChangeLog index 73e05b618..ba67e20bf 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2017-09-28 Alan Modra + + * testsuite/ld-plugin/pr22220.h, + * testsuite/ld-plugin/pr22220lib.cc, + * testsuite/ld-plugin/pr22220lib.ver, + * testsuite/ld-plugin/pr22220main.cc: New test. + * testsuite/ld-plugin/lto.exp: Run it. + 2017-09-19 Nick Clifton 2.29.1 Release diff --git a/ld/testsuite/ld-plugin/lto.exp b/ld/testsuite/ld-plugin/lto.exp index f0bc345f2..6b7ad536f 100644 --- a/ld/testsuite/ld-plugin/lto.exp +++ b/ld/testsuite/ld-plugin/lto.exp @@ -295,6 +295,12 @@ set lto_link_elf_tests [list \ [list "Build pr21382.so" \ "-shared" "-O2 -fpic" \ {pr21382b.c} {} "pr21382.so" "c"] \ + [list {Build pr22220lib.so} \ + {-shared -Wl,--version-script=pr22220lib.ver} {-fPIC} \ + {pr22220lib.cc} {} {pr22220lib.so} {c++}] \ + [list {Build pr22220main.o} \ + {} {-flto} \ + {pr22220main.cc} {} {} {c++}] \ ] # Check final symbols in executables. @@ -396,6 +402,12 @@ set lto_run_elf_shared_tests [list \ [list "Run pr21382" \ "-O2 -flto -fuse-linker-plugin -Wl,--as-needed tmpdir/pr21382a.o tmpdir/pr21382.so" "" \ {dummy.c} "pr21382.exe" "pass.out" "" "c"] \ + [list {pr22220a} \ + {-flto -fuse-linker-plugin tmpdir/pr22220main.o tmpdir/pr22220lib.so} {} \ + {dummy.c} {pr22220a.exe} {pass.out} {} {c++}] \ + [list {pr22220b} \ + {-flto -fuse-linker-plugin -Wl,--no-as-needed tmpdir/pr22220lib.so tmpdir/pr22220main.o} {} \ + {dummy.c} {pr22220b.exe} {pass.out} {} {c++}] \ ] # LTO run-time tests for ELF diff --git a/ld/testsuite/ld-plugin/pr22220.h b/ld/testsuite/ld-plugin/pr22220.h new file mode 100644 index 000000000..b15b45c08 --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22220.h @@ -0,0 +1,8 @@ +extern int doo(); + +inline int *goo() { + static int xyz; + return &xyz; +} + +int *boo(); diff --git a/ld/testsuite/ld-plugin/pr22220lib.cc b/ld/testsuite/ld-plugin/pr22220lib.cc new file mode 100644 index 000000000..771f44f7f --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22220lib.cc @@ -0,0 +1,6 @@ +#include "pr22220.h" + +int* boo() +{ + return goo (); +} diff --git a/ld/testsuite/ld-plugin/pr22220lib.ver b/ld/testsuite/ld-plugin/pr22220lib.ver new file mode 100644 index 000000000..6da7e1a2b --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22220lib.ver @@ -0,0 +1 @@ +BAR { global: *; }; diff --git a/ld/testsuite/ld-plugin/pr22220main.cc b/ld/testsuite/ld-plugin/pr22220main.cc new file mode 100644 index 000000000..38c206f7a --- /dev/null +++ b/ld/testsuite/ld-plugin/pr22220main.cc @@ -0,0 +1,12 @@ +#include +#include "pr22220.h" + +int main() +{ + if (boo() == goo()) + { + printf ("PASS\n"); + return 0; + } + return 1; +}