diff options
| author | Khem Raj <raj.khem@gmail.com> | 2012-09-23 19:46:17 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-09-24 11:36:27 +0100 |
| commit | ecbe671de1553956f83798e1c6fa3ec2fc6a7b4e (patch) | |
| tree | 748ee581f9192d014f47e3aec960191f54217645 | |
| parent | 55c4d3c55e4c3a7c2cda6d006cf7b78567bd3298 (diff) | |
| download | openembedded-core-ecbe671de1553956f83798e1c6fa3ec2fc6a7b4e.tar.gz openembedded-core-ecbe671de1553956f83798e1c6fa3ec2fc6a7b4e.tar.bz2 openembedded-core-ecbe671de1553956f83798e1c6fa3ec2fc6a7b4e.zip | |
binutils-2.22: Disable recent gold backports from 2.22 branch
This patch has been causing some regressions on gold.
e.g. systemd based images segfault and uclibc based images
dont boot. There has been few other reports on the mailing
list. Considering this lets withdraw this patch.
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
| -rw-r--r-- | meta/recipes-devtools/binutils/binutils-2.22.inc | 3 | ||||
| -rw-r--r-- | meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch | 1944 |
2 files changed, 1 insertions, 1946 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.22.inc b/meta/recipes-devtools/binutils/binutils-2.22.inc index 42dc6b78b5..9697242379 100644 --- a/meta/recipes-devtools/binutils/binutils-2.22.inc +++ b/meta/recipes-devtools/binutils/binutils-2.22.inc @@ -1,4 +1,4 @@ -PR = "r16" +PR = "r17" LIC_FILES_CHKSUM="\ file://src-release;endline=17;md5=4830a9ef968f3b18dd5e9f2c00db2d35\ @@ -38,7 +38,6 @@ SRC_URI = "\ file://0035-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \ file://0036-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \ file://0037-2011-12-19-Chung-Lin-Tang-cltang-codesourcery.com.patch \ - file://0038-Copy-from-mainline-to-binutils-2.22-branch.patch \ file://0039-emulparams-elf32bmip.sh-OTHER_SECTIONS-Put-.mdebug.-.patch \ file://0052-gas.patch \ file://0055-Remove-ABI_64_P-check-on-R_X86_64_PCXX.patch \ diff --git a/meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch b/meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch deleted file mode 100644 index 453ef2211c..0000000000 --- a/meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch +++ /dev/null @@ -1,1944 +0,0 @@ -Upstream-Status: Backport - -From 624da0376264205e399bc14fe2fa7b6fa659d0ee Mon Sep 17 00:00:00 2001 -From: Ian Lance Taylor <ian@airs.com> -Date: Mon, 19 Dec 2011 21:14:39 +0000 -Subject: [PATCH 038/262] Copy from mainline to binutils 2.22 branch: - - 2011-12-17 Cary Coutant <ccoutant@google.com> - - * dwarf_reader.cc (Sized_dwarf_line_info::read_lines): Add casts. - * resolve.cc (Symbol_table::resolve): Likewise. - * i386.cc (Target_i386::do_code_fill): Use char constants for nop - arrays. - * x86_64.cc (Target_x86_64::do_code_fill): Likewise. - - 2011-10-31 Cary Coutant <ccoutant@google.com> - - PR gold/13023 - * expression.cc (Expression::eval_with_dot): Add - is_section_dot_assignment parameter. - (Expression::eval_maybe_dot): Likewise. Adjust value when rhs is - absolute and assigning to dot within a section. - * script-sections.cc - (Output_section_element_assignment::set_section_addresses): Pass - dot_section to set_if_absolute. - (Output_section_element_dot_assignment::finalize_symbols): Pass TRUE - as is_section_dot_assignment flag to eval_with_dot. - (Output_section_element_dot_assignment::set_section_addresses): - Likewise. - * script.cc (Symbol_assignment::set_if_absolute): Add dot_section - parameter. Also set value if relative to dot_section; set the - symbol's output_section. - * script.h (Expression::eval_with_dot): Add is_section_dot_assignment - parameter. Adjust all callers. - (Expression::eval_maybe_dot): Likewise. - (Symbol_assignment::set_if_absolute): Add dot_section parameter. - Adjust all callers. - * testsuite/script_test_2.t: Test assignment of an absolute value - to dot within an output section element. - - 2011-10-31 Cary Coutant <ccoutant@google.com> - - * options.h (class General_options): Add --[no-]gnu-unique options. - * symtab.cc (Symbol_table::sized_write_globals): Convert - STB_GNU_UNIQUE to STB_GLOBAL if --no-gnu-unique. - - 2011-10-31 Cary Coutant <ccoutant@google.com> - - PR gold/13359 - * i386.cc (Target_i386::Relocate::relocate_tls): Remove - unnecessary assertion. - * x86_64.cc (Target_x86_64::Relocate::relocate_tls): Likewise. - - 2011-10-31 Sriraman Tallam <tmsriram@google.com> - - * symtab.h (Symbol_table::gc_mark_symbol_for_shlib): Rename to - gc_mark_symbol. - * symtab.cc (Symbol_table::gc_mark_symbol_for_shlib): Rename to - gc_mark_symbol. - Change to just keep the section associated with symbol. - (Symbol_table::add_from_relobj): Mark symbols as not garbage when - they are externally visible and --export-dynamic is turned on. - (Symbol_table::gc_mark_dyn_syms): Call gc_mark_symbol. - - 2011-10-19 Ian Lance Taylor <iant@google.com> - - PR gold/13163 - * script-sections.cc - (Output_section_element_dot_assignment::needs_output_section): New - function. - - 2011-10-19 Ian Lance Taylor <iant@google.com> - - PR gold/13204 - * layout.cc (Layout::segment_precedes): Don't assert failure if a - --section-start option was seen. - * options.h (General_options::any_section_start): New function. - - 2011-10-18 Cary Coutant <ccoutant@google.com> - - * output.cc (posix_fallocate): Return 0 on success, errno on failure. - (Output_file::map_no_anonymous): Check for non-zero - return code from posix_fallocate. - - 2011-10-17 Cary Coutant <ccoutant@google.com> - - PR gold/13245 - * plugin.cc (is_visible_from_outside): Check for symbols - referenced from dynamic objects. - * resolve.cc (Symbol_table::resolve): Don't count references - from dynamic objects as references from real ELF files. - * testsuite/plugin_test_2.sh: Adjust expected result. - - 2011-10-17 Cary Coutant <ccoutant@google.com> - - * readsyms.cc (Read_symbols::run): Don't queue an unblocker - task for members of lib groups. - - 2011-10-17 Cary Coutant <ccoutant@google.com> - - PR gold/13288 - * fileread.cc (File_read::find_view): Add assert. - (File_read::make_view): Move bounds check (replace with assert)... - (File_read::find_or_make_view): ... to here. - - 2011-10-12 Cary Coutant <ccoutant@google.com> - - * output.cc (Output_file::open_base_file): Handle case where - ::read returns less than requested size. - - 2011-10-10 Cary Coutant <ccoutant@google.com> - - * incremental.cc (Sized_relobj_incr::Sized_relobj_incr): - Initialize defined_count_. - (Sized_relobj_incr::do_add_symbols): Count defined symbols. - (Sized_relobj_incr::do_get_global_symbol_counts): Rewrite. - (Sized_incr_dynobj::Sized_incr_dynobj): Initialize defined_count_. - (Sized_incr_dynobj::do_add_symbols): Count defined symbols. - (Sized_incr_dynobj::do_get_global_symbol_counts): Rewrite. - * incremental.h (Sized_relobj_incr::defined_count_): New data - member. - (Sized_incr_dynobj::defined_count_): New data member. - * plugin.cc (Sized_pluginobj::do_get_global_symbol_counts): - Return zeroes instead of internal error. - - 2011-10-10 Cary Coutant <ccoutant@google.com> - - PR gold/13249 - * output.cc (Output_reloc::Output_reloc): Add use_plt_offset flag. - (Output_reloc::symbol_value): Return PLT offset if flag is set. - * output.h (class Output_reloc): Add use_plt_offset flag. - (Output_reloc::type_): Adjust size of bit field. - (Output_reloc::use_plt_offset_): New bit field. - (class Output_data_reloc): Adjust all calls to Output_reloc_type. - (Output_data_reloc::add_local_relative): (RELA only) Add use_plt_offset - flag. Adjust all callers. - * x86_64.cc (Target_x86_64::Scan::local): Check for IFUNC when - creating RELATIVE relocations. - - 2011-10-03 Diego Novillo <dnovillo@google.com> - - * options.cc (parse_uint): Fix dereference of RETVAL. - - 2011-09-29 Cary Coutant <ccoutant@google.com> - - * incremental.cc (Sized_incremental_binary::do_process_got_plt): - Check for NULL. - * symtab.cc (Symbol_table::add_from_relobj): Ignore version - symbols during incremental update. - (Symbol_table::add_from_dynobj): Likewise. - - 2011-09-26 Cary Coutant <ccoutant@google.com> - - * gold.cc (queue_initial_tasks): Move option checks ... - * options.cc (General_options::finalize): ... to here. Disable - some options; make others fatal. - - 2011-09-23 Simon Baldwin <simonb@google.com> - - * configure.ac: Add new --with-gold-ldadd and --with-gold-ldflags - configuration options. - * configure: Regenerate. - * Makefile.am: Handle GOLD_LDADD and GOLD_LDFLAGS. - * Makefile.in: Regenerate. - * testsuite/Makefile.in: Regenerate. ---- - gold/ChangeLog | 163 +++++++++++++++++++++++++++++++++++++++ - gold/dwarf_reader.cc | 8 +- - gold/expression.cc | 45 +++++++---- - gold/fileread.cc | 27 ++++--- - gold/gold.cc | 55 +++++-------- - gold/i386.cc | 87 +++++++++++---------- - gold/incremental.cc | 50 +++++++++--- - gold/incremental.h | 4 + - gold/layout.cc | 5 +- - gold/options.cc | 33 +++++++- - gold/options.h | 9 +++ - gold/output.cc | 78 ++++++++++++------- - gold/output.h | 64 +++++++++------ - gold/plugin.cc | 18 +++-- - gold/powerpc.cc | 4 +- - gold/readsyms.cc | 6 +- - gold/resolve.cc | 6 +- - gold/script-sections.cc | 47 +++++++---- - gold/script.cc | 17 ++-- - gold/script.h | 24 ++++-- - gold/sparc.cc | 4 +- - gold/symtab.cc | 65 +++++++++------- - gold/symtab.h | 5 +- - gold/testsuite/Makefile.in | 2 + - gold/testsuite/plugin_test_2.sh | 2 +- - gold/testsuite/script_test_2.t | 2 +- - gold/x86_64.cc | 99 ++++++++++++------------ - 27 files changed, 636 insertions(+), 293 deletions(-) - -diff --git a/gold/dwarf_reader.cc b/gold/dwarf_reader.cc -index 3dc33e4..2b47a28 100644 ---- a/gold/dwarf_reader.cc -+++ b/gold/dwarf_reader.cc -@@ -1,6 +1,6 @@ - // dwarf_reader.cc -- parse dwarf2/3 debug information - --// Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc. -+// Copyright 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. - // Written by Ian Lance Taylor <iant@google.com>. - - // This file is part of gold. -@@ -491,8 +491,10 @@ Sized_dwarf_line_info<size, big_endian>::read_lines(unsigned const char* lineptr - && (shndx == -1U || lsm.shndx == -1U || shndx == lsm.shndx)) - { - Offset_to_lineno_entry entry -- = { lsm.address, this->current_header_index_, -- lsm.file_num, true, lsm.line_num }; -+ = { static_cast<off_t>(lsm.address), -+ this->current_header_index_, -+ static_cast<unsigned int>(lsm.file_num), -+ true, lsm.line_num }; - std::vector<Offset_to_lineno_entry>& - map(this->line_number_map_[lsm.shndx]); - // If we see two consecutive entries with the same -diff --git a/gold/expression.cc b/gold/expression.cc -index e527b5e..e31c151 100644 ---- a/gold/expression.cc -+++ b/gold/expression.cc -@@ -1,6 +1,6 @@ - // expression.cc -- expressions in linker scripts for gold - --// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. -+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. - // Written by Ian Lance Taylor <iant@google.com>. - - // This file is part of gold. -@@ -77,7 +77,7 @@ Expression::eval(const Symbol_table* symtab, const Layout* layout, - bool check_assertions) - { - return this->eval_maybe_dot(symtab, layout, check_assertions, -- false, 0, NULL, NULL, NULL); -+ false, 0, NULL, NULL, NULL, false); - } - - // Evaluate an expression which may refer to the dot symbol. -@@ -87,11 +87,13 @@ Expression::eval_with_dot(const Symbol_table* symtab, const Layout* layout, - bool check_assertions, uint64_t dot_value, - Output_section* dot_section, - Output_section** result_section_pointer, -- uint64_t* result_alignment_pointer) -+ uint64_t* result_alignment_pointer, -+ bool is_section_dot_assignment) - { - return this->eval_maybe_dot(symtab, layout, check_assertions, true, - dot_value, dot_section, result_section_pointer, -- result_alignment_pointer); -+ result_alignment_pointer, -+ is_section_dot_assignment); - } - - // Evaluate an expression which may or may not refer to the dot -@@ -102,7 +104,8 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout, - bool check_assertions, bool is_dot_available, - uint64_t dot_value, Output_section* dot_section, - Output_section** result_section_pointer, -- uint64_t* result_alignment_pointer) -+ uint64_t* result_alignment_pointer, -+ bool is_section_dot_assignment) - { - Expression_eval_info eei; - eei.symtab = symtab; -@@ -113,14 +116,24 @@ Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout, - eei.dot_section = dot_section; - - // We assume the value is absolute, and only set this to a section -- // if we find a section relative reference. -+ // if we find a section-relative reference. - if (result_section_pointer != NULL) - *result_section_pointer = NULL; - eei.result_section_pointer = result_section_pointer; - - eei.result_alignment_pointer = result_alignment_pointer; - -- return this->value(&eei); -+ uint64_t val = this->value(&eei); -+ -+ // If this is an assignment to dot within a section, and the value -+ // is absolute, treat it as a section-relative offset. -+ if (is_section_dot_assignment && *result_section_pointer == NULL) -+ { -+ gold_assert(dot_section != NULL); -+ val += dot_section->address(); -+ *result_section_pointer = dot_section; -+ } -+ return val; - } - - // A number. -@@ -257,7 +270,8 @@ class Unary_expression : public Expression - eei->dot_value, - eei->dot_section, - arg_section_pointer, -- eei->result_alignment_pointer); -+ eei->result_alignment_pointer, -+ false); - } - - void -@@ -336,7 +350,8 @@ class Binary_expression : public Expression - eei->dot_value, - eei->dot_section, - section_pointer, -- alignment_pointer); -+ alignment_pointer, -+ false); - } - - uint64_t -@@ -350,7 +365,8 @@ class Binary_expression : public Expression - eei->dot_value, - eei->dot_section, - section_pointer, -- alignment_pointer); -+ alignment_pointer, -+ false); - } - - void -@@ -500,7 +516,8 @@ class Trinary_expression : public Expression - eei->dot_value, - eei->dot_section, - section_pointer, -- NULL); -+ NULL, -+ false); - } - - uint64_t -@@ -514,7 +531,8 @@ class Trinary_expression : public Expression - eei->dot_value, - eei->dot_section, - section_pointer, -- alignment_pointer); -+ alignment_pointer, -+ false); - } - - uint64_t -@@ -528,7 +546,8 @@ class Trinary_expression : public Expression - eei->dot_value, - eei->dot_section, - section_pointer, -- alignment_pointer); -+ alignment_pointer, -+ false); - } - - void -diff --git a/gold/fileread.cc b/gold/fileread.cc -index 80ddfbc..c5dc320 100644 ---- a/gold/fileread.cc -+++ b/gold/fileread.cc -@@ -329,6 +329,10 @@ inline File_read::View* - File_read::find_view(off_t start, section_size_type size, - unsigned int byteshift, File_read::View** vshifted) const - { -+ gold_assert(start <= this->size_ -+ && (static_cast<unsigned long long>(size) -+ <= static_cast<unsigned long long>(this->size_ - start))); -+ - if (vshifted != NULL) - *vshifted = NULL; - -@@ -456,16 +460,9 @@ File_read::make_view(off_t start, section_size_type size, - unsigned int byteshift, bool cache) - { - gold_assert(size > 0); -- -- // Check that start and end of the view are within the file. -- if (start > this->size_ -- || (static_cast<unsigned long long>(size) -- > static_cast<unsigned long long>(this->size_ - start))) -- gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds " -- "size of file; the file may be corrupt"), -- this->filename().c_str(), -- static_cast<long long>(size), -- static_cast<long long>(start)); -+ gold_assert(start <= this->size_ -+ && (static_cast<unsigned long long>(size) -+ <= static_cast<unsigned long long>(this->size_ - start))); - - off_t poff = File_read::page_offset(start); - -@@ -523,6 +520,16 @@ File_read::View* - File_read::find_or_make_view(off_t offset, off_t start, - section_size_type size, bool aligned, bool cache) - { -+ // Check that start and end of the view are within the file. -+ if (start > this->size_ -+ || (static_cast<unsigned long long>(size) -+ > static_cast<unsigned long long>(this->size_ - start))) -+ gold_fatal(_("%s: attempt to map %lld bytes at offset %lld exceeds " -+ "size of file; the file may be corrupt"), -+ this->filename().c_str(), -+ static_cast<long long>(size), -+ static_cast<long long>(start)); -+ - unsigned int byteshift; - if (offset == 0) - byteshift = 0; -diff --git a/gold/gold.cc b/gold/gold.cc -index 12f25b7..693ff79 100644 ---- a/gold/gold.cc -+++ b/gold/gold.cc -@@ -197,46 +197,29 @@ queue_initial_tasks(const General_options& options, - // For incremental links, the base output file. - Incremental_binary* ibase = NULL; - -- if (parameters->incremental()) -- { -- if (options.relocatable()) -- gold_error(_("incremental linking is incompatible with -r")); -- if (options.emit_relocs()) -- gold_error(_("incremental linking is incompatible with --emit-relocs")); -- if (options.gc_sections()) -- gold_error(_("incremental linking is incompatible with --gc-sections")); -- if (options.icf_enabled()) -- gold_error(_("incremental linking is incompatible with --icf")); -- if (options.has_plugins()) -- gold_error(_("incremental linking is incompatible with --plugin")); -- if (strcmp(options.compress_debug_sections(), "none") != 0) -- gold_error(_("incremental linking is incompatible with " -- "--compress-debug-sections")); -- -- if (parameters->incremental_update()) -+ if (parameters->incremental_update()) -+ { -+ Output_file* of = new Output_file(options.output_file_name()); -+ if (of->open_base_file(options.incremental_base(), true)) - { -- Output_file* of = new Output_file(options.output_file_name()); -- if (of->open_base_file(options.incremental_base(), true)) -- { -- ibase = open_incremental_binary(of); -- if (ibase != NULL -- && ibase->check_inputs(cmdline, layout->incremental_inputs())) -- ibase->init_layout(layout); -- else -- { -- delete ibase; -- ibase = NULL; -- of->close(); -- } -- } -- if (ibase == NULL) -+ ibase = open_incremental_binary(of); -+ if (ibase != NULL -+ && ibase->check_inputs(cmdline, layout->incremental_inputs())) -+ ibase->init_layout(layout); -+ else - { -- if (set_parameters_incremental_full()) -- gold_info(_("linking with --incremental-full")); -- else -- gold_fallback(_("restart link with --incremental-full")); -+ delete ibase; -+ ibase = NULL; -+ of->close(); - } - } -+ if (ibase == NULL) -+ { -+ if (set_parameters_incremental_full()) -+ gold_info(_("linking with --incremental-full")); -+ else -+ gold_fallback(_("restart link with --incremental-full")); -+ } - } - - // Read the input files. We have to add the symbols to the symbol -diff --git a/gold/i386.cc b/gold/i386.cc -index 445bc68..efb6248 100644 ---- a/gold/i386.cc -+++ b/gold/i386.cc -@@ -2709,12 +2709,6 @@ Target_i386::Relocate::relocate_tls(const Relocate_info<32, false>* relinfo, - } - if (optimized_type == tls::TLSOPT_TO_IE) - { -- if (tls_segment == NULL) -- { -- gold_assert(parameters->errors()->error_count() > 0 -- || issue_undefined_symbol_error(gsym)); -- return; -- } - this->tls_gd_to_ie(relinfo, relnum, tls_segment, rel, r_type, - got_offset, view, view_size); - break; -@@ -3480,42 +3474,51 @@ Target_i386::do_code_fill(section_size_type length) const - } - - // Nop sequences of various lengths. -- const char nop1[1] = { 0x90 }; // nop -- const char nop2[2] = { 0x66, 0x90 }; // xchg %ax %ax -- const char nop3[3] = { 0x8d, 0x76, 0x00 }; // leal 0(%esi),%esi -- const char nop4[4] = { 0x8d, 0x74, 0x26, 0x00}; // leal 0(%esi,1),%esi -- const char nop5[5] = { 0x90, 0x8d, 0x74, 0x26, // nop -- 0x00 }; // leal 0(%esi,1),%esi -- const char nop6[6] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi -- 0x00, 0x00 }; -- const char nop7[7] = { 0x8d, 0xb4, 0x26, 0x00, // leal 0L(%esi,1),%esi -- 0x00, 0x00, 0x00 }; -- const char nop8[8] = { 0x90, 0x8d, 0xb4, 0x26, // nop -- 0x00, 0x00, 0x00, 0x00 }; // leal 0L(%esi,1),%esi -- const char nop9[9] = { 0x89, 0xf6, 0x8d, 0xbc, // movl %esi,%esi -- 0x27, 0x00, 0x00, 0x00, // leal 0L(%edi,1),%edi -- 0x00 }; -- const char nop10[10] = { 0x8d, 0x76, 0x00, 0x8d, // leal 0(%esi),%esi -- 0xbc, 0x27, 0x00, 0x00, // leal 0L(%edi,1),%edi -- 0x00, 0x00 }; -- const char nop11[11] = { 0x8d, 0x74, 0x26, 0x00, // leal 0(%esi,1),%esi -- 0x8d, 0xbc, 0x27, 0x00, // leal 0L(%edi,1),%edi -- 0x00, 0x00, 0x00 }; -- const char nop12[12] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi -- 0x00, 0x00, 0x8d, 0xbf, // leal 0L(%edi),%edi -- 0x00, 0x00, 0x00, 0x00 }; -- const char nop13[13] = { 0x8d, 0xb6, 0x00, 0x00, // leal 0L(%esi),%esi -- 0x00, 0x00, 0x8d, 0xbc, // leal 0L(%edi,1),%edi -- 0x27, 0x00, 0x00, 0x00, -- 0x00 }; -- const char nop14[14] = { 0x8d, 0xb4, 0x26, 0x00, // leal 0L(%esi,1),%esi -- 0x00, 0x00, 0x00, 0x8d, // leal 0L(%edi,1),%edi -- 0xbc, 0x27, 0x00, 0x00, -- 0x00, 0x00 }; -- const char nop15[15] = { 0xeb, 0x0d, 0x90, 0x90, // jmp .+15 -- 0x90, 0x90, 0x90, 0x90, // nop,nop,nop,... -- 0x90, 0x90, 0x90, 0x90, -- 0x90, 0x90, 0x90 }; -+ const char nop1[1] = { '\x90' }; // nop -+ const char nop2[2] = { '\x66', '\x90' }; // xchg %ax %ax -+ const char nop3[3] = { '\x8d', '\x76', '\x00' }; // leal 0(%esi),%esi -+ const char nop4[4] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi -+ '\x00'}; -+ const char nop5[5] = { '\x90', '\x8d', '\x74', // nop -+ '\x26', '\x00' }; // leal 0(%esi,1),%esi -+ const char nop6[6] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi -+ '\x00', '\x00', '\x00' }; -+ const char nop7[7] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi -+ '\x00', '\x00', '\x00', -+ '\x00' }; -+ const char nop8[8] = { '\x90', '\x8d', '\xb4', // nop -+ '\x26', '\x00', '\x00', // leal 0L(%esi,1),%esi -+ '\x00', '\x00' }; -+ const char nop9[9] = { '\x89', '\xf6', '\x8d', // movl %esi,%esi -+ '\xbc', '\x27', '\x00', // leal 0L(%edi,1),%edi -+ '\x00', '\x00', '\x00' }; -+ const char nop10[10] = { '\x8d', '\x76', '\x00', // leal 0(%esi),%esi -+ '\x8d', '\xbc', '\x27', // leal 0L(%edi,1),%edi -+ '\x00', '\x00', '\x00', -+ '\x00' }; -+ const char nop11[11] = { '\x8d', '\x74', '\x26', // leal 0(%esi,1),%esi -+ '\x00', '\x8d', '\xbc', // leal 0L(%edi,1),%edi -+ '\x27', '\x00', '\x00', -+ '\x00', '\x00' }; -+ const char nop12[12] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi -+ '\x00', '\x00', '\x00', // leal 0L(%edi),%edi -+ '\x8d', '\xbf', '\x00', -+ '\x00', '\x00', '\x00' }; -+ const char nop13[13] = { '\x8d', '\xb6', '\x00', // leal 0L(%esi),%esi -+ '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi -+ '\x8d', '\xbc', '\x27', -+ '\x00', '\x00', '\x00', -+ '\x00' }; -+ const char nop14[14] = { '\x8d', '\xb4', '\x26', // leal 0L(%esi,1),%esi -+ '\x00', '\x00', '\x00', // leal 0L(%edi,1),%edi -+ '\x00', '\x8d', '\xbc', -+ '\x27', '\x00', '\x00', -+ '\x00', '\x00' }; -+ const char nop15[15] = { '\xeb', '\x0d', '\x90', // jmp .+15 -+ '\x90', '\x90', '\x90', // nop,nop,nop,... -+ '\x90', '\x90', '\x90', -+ '\x90', '\x90', '\x90', -+ '\x90', '\x90', '\x90' }; - - const char* nops[16] = { - NULL, -diff --git a/gold/incremental.cc b/gold/incremental.cc -index b422827..75e44c5 100644 ---- a/gold/incremental.cc -+++ b/gold/incremental.cc -@@ -685,7 +685,7 @@ Sized_incremental_binary<size, big_endian>::do_process_got_plt( - gold_assert(plt_desc >= first_global && plt_desc < symtab_count); - Symbol* sym = this->global_symbol(plt_desc - first_global); - // Add the PLT entry only if the symbol is still referenced. -- if (sym->in_reg()) -+ if (sym != NULL && sym->in_reg()) - { - gold_debug(DEBUG_INCREMENTAL, - "PLT entry %d: %s", -@@ -1966,8 +1966,9 @@ Sized_relobj_incr<size, big_endian>::Sized_relobj_incr( - input_reader_(ibase->inputs_reader().input_file(input_file_index)), - local_symbol_count_(0), output_local_dynsym_count_(0), - local_symbol_index_(0), local_symbol_offset_(0), local_dynsym_offset_(0), -- symbols_(), incr_reloc_offset_(-1U), incr_reloc_count_(0), -- incr_reloc_output_index_(0), incr_relocs_(NULL), local_symbols_() -+ symbols_(), defined_count_(0), incr_reloc_offset_(-1U), -+ incr_reloc_count_(0), incr_reloc_output_index_(0), incr_relocs_(NULL), -+ local_symbols_() - { - if (this->input_reader_.is_in_system_directory()) - this->set_is_in_system_directory(); -@@ -2120,6 +2121,9 @@ Sized_relobj_incr<size, big_endian>::do_add_symbols( - - Symbol* res = symtab->add_from_incrobj(this, name, NULL, &sym); - -+ if (shndx != elfcpp::SHN_UNDEF) -+ ++this->defined_count_; -+ - // If this is a linker-defined symbol that hasn't yet been defined, - // define it now. - if (input_shndx == -1U && !res->is_defined()) -@@ -2283,9 +2287,21 @@ Sized_relobj_incr<size, big_endian>::do_initialize_xindex() - template<int size, bool big_endian> - void - Sized_relobj_incr<size, big_endian>::do_get_global_symbol_counts( -- const Symbol_table*, size_t*, size_t*) const --{ -- gold_unreachable(); -+ const Symbol_table*, -+ size_t* defined, -+ size_t* used) const -+{ -+ *defined = this->defined_count_; -+ size_t count = 0; -+ for (typename Symbols::const_iterator p = this->symbols_.begin(); -+ p != this->symbols_.end(); -+ ++p) -+ if (*p != NULL -+ && (*p)->source() == Symbol::FROM_OBJECT -+ && (*p)->object() == this -+ && (*p)->is_defined()) -+ ++count; -+ *used = count; - } - - // Read the relocs. -@@ -2579,7 +2595,7 @@ Sized_incr_dynobj<size, big_endian>::Sized_incr_dynobj( - : Dynobj(name, NULL), ibase_(ibase), - input_file_index_(input_file_index), - input_reader_(ibase->inputs_reader().input_file(input_file_index)), -- symbols_() -+ symbols_(), defined_count_(0) - { - if (this->input_reader_.is_in_system_directory()) - this->set_is_in_system_directory(); -@@ -2677,6 +2693,7 @@ Sized_incr_dynobj<size, big_endian>::do_add_symbols( - // is meaningless, as long as it's not SHN_UNDEF. - shndx = 1; - v = gsym.get_st_value(); -+ ++this->defined_count_; - } - - osym.put_st_name(0); -@@ -2845,9 +2862,22 @@ Sized_incr_dynobj<size, big_endian>::do_initialize_xindex() - template<int size, bool big_endian> - void - Sized_incr_dynobj<size, big_endian>::do_get_global_symbol_counts( -- const Symbol_table*, size_t*, size_t*) const --{ -- gold_unreachable(); -+ const Symbol_table*, -+ size_t* defined, -+ size_t* used) const -+{ -+ *defined = this->defined_count_; -+ size_t count = 0; -+ for (typename Symbols::const_iterator p = this->symbols_.begin(); -+ p != this->symbols_.end(); -+ ++p) -+ if (*p != NULL -+ && (*p)->source() == Symbol::FROM_OBJECT -+ && (*p)->object() == this -+ && (*p)->is_defined() -+ && (*p)->dynsym_index() != -1U) -+ ++count; -+ *used = count; - } - - // Allocate an incremental object of the appropriate size and endianness. -diff --git a/gold/incremental.h b/gold/incremental.h -index e6732df..56fc52b 100644 ---- a/gold/incremental.h -+++ b/gold/incremental.h -@@ -1996,6 +1996,8 @@ class Sized_relobj_incr : public Sized_relobj<size, big_endian> - unsigned int local_dynsym_offset_; - // The entries in the symbol table for the external symbols. - Symbols symbols_; -+ // Number of symbols defined in object file itself. -+ size_t defined_count_; - // The offset of the first incremental relocation for this object. - unsigned int incr_reloc_offset_; - // The number of incremental relocations for this object. -@@ -2127,6 +2129,8 @@ class Sized_incr_dynobj : public Dynobj - Input_entry_reader input_reader_; - // The entries in the symbol table for the external symbols. - Symbols symbols_; -+ // Number of symbols defined in object file itself. -+ size_t defined_count_; - }; - - // Allocate an incremental object of the appropriate size and endianness. -diff --git a/gold/layout.cc b/gold/layout.cc -index 1c32bcf..9d8a43a 100644 ---- a/gold/layout.cc -+++ b/gold/layout.cc -@@ -2975,8 +2975,9 @@ Layout::segment_precedes(const Output_segment* seg1, - - // We shouldn't get here--we shouldn't create segments which we - // can't distinguish. Unless of course we are using a weird linker -- // script. -- gold_assert(this->script_options_->saw_phdrs_clause()); -+ // script or overlapping --section-start options. -+ gold_assert(this->script_options_->saw_phdrs_clause() -+ || parameters->options().any_section_start()); - return false; - } - -diff --git a/gold/options.cc b/gold/options.cc -index be32645..dcf6ba7 100644 ---- a/gold/options.cc -+++ b/gold/options.cc -@@ -198,7 +198,7 @@ parse_uint(const char* option_name, const char* arg, int* retval) - { - char* endptr; - *retval = strtol(arg, &endptr, 0); -- if (*endptr != '\0' || retval < 0) -+ if (*endptr != '\0' || *retval < 0) - gold_fatal(_("%s: invalid option value (expected an integer): %s"), - option_name, arg); - } -@@ -1224,6 +1224,37 @@ General_options::finalize() - gold_fatal(_("Options --incremental-changed, --incremental-unchanged, " - "--incremental-unknown require the use of --incremental")); - -+ // Check for options that are not compatible with incremental linking. -+ // Where an option can be disabled without seriously changing the semantics -+ // of the link, we turn the option off; otherwise, we issue a fatal error. -+ -+ if (this->incremental_mode_ != INCREMENTAL_OFF) -+ { -+ if (this->relocatable()) -+ gold_fatal(_("incremental linking is not compatible with -r")); -+ if (this->emit_relocs()) -+ gold_fatal(_("incremental linking is not compatible with " -+ "--emit-relocs")); -+ if (this->has_plugins()) -+ gold_fatal(_("incremental linking is not compatible with --plugin")); -+ if (this->gc_sections()) -+ { -+ gold_warning(_("ignoring --gc-sections for an incremental link")); -+ this->set_gc_sections(false); -+ } -+ if (this->icf_enabled()) -+ { -+ gold_warning(_("ignoring --icf for an incremental link")); -+ this->set_icf_status(ICF_NONE); -+ } -+ if (strcmp(this->compress_debug_sections(), "none") != 0) -+ { -+ gold_warning(_("ignoring --compress-debug-sections for an " -+ "incremental link")); -+ this->set_compress_debug_sections("none"); -+ } -+ } -+ - // FIXME: we can/should be doing a lot more sanity checking here. - } - -diff --git a/gold/options.h b/gold/options.h -index 768df9c..8876a1e 100644 ---- a/gold/options.h -+++ b/gold/options.h -@@ -791,6 +791,10 @@ class General_options - DEFINE_bool(g, options::EXACTLY_ONE_DASH, '\0', false, - N_("Ignored"), NULL); - -+ DEFINE_bool(gnu_unique, options::TWO_DASHES, '\0', true, -+ N_("Enable STB_GNU_UNIQUE symbol binding (default)"), -+ N_("Disable STB_GNU_UNIQUE symbol binding")); -+ - DEFINE_string(soname, options::ONE_DASH, 'h', NULL, - N_("Set shared library name"), N_("FILENAME")); - -@@ -1385,6 +1389,11 @@ class General_options - bool - section_start(const char* secname, uint64_t* paddr) const; - -+ // Return whether any --section-start option was used. -+ bool -+ any_section_start() const -+ { return !this->section_starts_.empty(); } -+ - enum Fix_v4bx - { - // Leave original instruction. -diff --git a/gold/output.cc b/gold/output.cc -index 29d8e3d..a7e1e9a 100644 ---- a/gold/output.cc -+++ b/gold/output.cc -@@ -119,7 +119,9 @@ extern "C" void *gold_mremap(void *, size_t, size_t, int); - static int - posix_fallocate(int o, off_t offset, off_t len) - { -- return ftruncate(o, offset + len); -+ if (ftruncate(o, offset + len) < 0) -+ return errno; -+ return 0; - } - #endif // !defined(HAVE_POSIX_FALLOCATE) - -@@ -706,7 +708,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - bool is_symbolless) - : address_(address), local_sym_index_(GSYM_CODE), type_(type), - is_relative_(is_relative), is_symbolless_(is_symbolless), -- is_section_symbol_(false), shndx_(INVALID_CODE) -+ is_section_symbol_(false), use_plt_offset_(false), shndx_(INVALID_CODE) - { - // this->type_ is a bitfield; make sure TYPE fits. - gold_assert(this->type_ == type); -@@ -727,7 +729,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - bool is_symbolless) - : address_(address), local_sym_index_(GSYM_CODE), type_(type), - is_relative_(is_relative), is_symbolless_(is_symbolless), -- is_section_symbol_(false), shndx_(shndx) -+ is_section_symbol_(false), use_plt_offset_(false), shndx_(shndx) - { - gold_assert(shndx != INVALID_CODE); - // this->type_ is a bitfield; make sure TYPE fits. -@@ -749,10 +751,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - Address address, - bool is_relative, - bool is_symbolless, -- bool is_section_symbol) -+ bool is_section_symbol, -+ bool use_plt_offset) - : address_(address), local_sym_index_(local_sym_index), type_(type), - is_relative_(is_relative), is_symbolless_(is_symbolless), -- is_section_symbol_(is_section_symbol), shndx_(INVALID_CODE) -+ is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset), -+ shndx_(INVALID_CODE) - { - gold_assert(local_sym_index != GSYM_CODE - && local_sym_index != INVALID_CODE); -@@ -773,10 +777,12 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - Address address, - bool is_relative, - bool is_symbolless, -- bool is_section_symbol) -+ bool is_section_symbol, -+ bool use_plt_offset) - : address_(address), local_sym_index_(local_sym_index), type_(type), - is_relative_(is_relative), is_symbolless_(is_symbolless), -- is_section_symbol_(is_section_symbol), shndx_(shndx) -+ is_section_symbol_(is_section_symbol), use_plt_offset_(use_plt_offset), -+ shndx_(shndx) - { - gold_assert(local_sym_index != GSYM_CODE - && local_sym_index != INVALID_CODE); -@@ -799,7 +805,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - Address address) - : address_(address), local_sym_index_(SECTION_CODE), type_(type), - is_relative_(false), is_symbolless_(false), -- is_section_symbol_(true), shndx_(INVALID_CODE) -+ is_section_symbol_(true), use_plt_offset_(false), shndx_(INVALID_CODE) - { - // this->type_ is a bitfield; make sure TYPE fits. - gold_assert(this->type_ == type); -@@ -820,7 +826,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - Address address) - : address_(address), local_sym_index_(SECTION_CODE), type_(type), - is_relative_(false), is_symbolless_(false), -- is_section_symbol_(true), shndx_(shndx) -+ is_section_symbol_(true), use_plt_offset_(false), shndx_(shndx) - { - gold_assert(shndx != INVALID_CODE); - // this->type_ is a bitfield; make sure TYPE fits. -@@ -842,7 +848,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc( - Address addre |
