summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
Diffstat (limited to 'meta')
-rw-r--r--meta/recipes-devtools/binutils/binutils-2.22.inc3
-rw-r--r--meta/recipes-devtools/binutils/binutils/0038-Copy-from-mainline-to-binutils-2.22-branch.patch1944
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 address)
- : address_(address), local_sym_index_(0), type_(type),
- is_relative_(false), is_symbolless_(false),
-- 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);
-@@ -858,7 +864,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
- Address address)
- : address_(address), local_sym_index_(0), type_(type),
- is_relative_(false), is_symbolless_(false),
-- 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.
-@@ -877,7 +883,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Output_reloc(
- Address address)
- : address_(address), local_sym_index_(TARGET_CODE), type_(type),
- is_relative_(false), is_symbolless_(false),
-- 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);
-@@ -894,7 +900,7 @@ Output_reloc<elfcpp::SHT_REL, dynamic, size, big_endian>::Outp