X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fcommon.cc;h=b1348ecfbc7f3396a77451a28af1d8192fdc0779;hb=de54374205650be71237ce51ef7981d30ddd78dc;hp=8346c0bf4229516690bcefc602e165516bfe5c67;hpb=93ceb76464b573cae4b2f94d3dd36665b3174628;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/common.cc b/gold/common.cc index 8346c0bf42..b1348ecfbc 100644 --- a/gold/common.cc +++ b/gold/common.cc @@ -1,6 +1,6 @@ // common.cc -- handle common symbols for gold -// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -88,16 +88,7 @@ bool Sort_commons::operator()(const Symbol* pa, const Symbol* pb) const { if (pa == NULL) - { - if (pb == NULL) - { - // Stabilize sort. The order really doesn't matter, because - // these entries will be discarded, but we want to return - // the same result every time we compare pa and pb. - return pa < pb; - } - return false; - } + return false; if (pb == NULL) return true; @@ -231,9 +222,6 @@ Symbol_table::do_allocate_commons_list( Mapfile* mapfile, Sort_commons_order sort_order) { - typedef typename Sized_symbol::Value_type Value_type; - typedef typename Sized_symbol::Size_type Size_type; - // We've kept a list of all the common symbols. But the symbol may // have been resolved to a defined symbol by now. And it may be a // forwarder. First remove all non-common symbols. @@ -295,11 +283,23 @@ Symbol_table::do_allocate_commons_list( gold_unreachable(); } - Output_data_space *poc = new Output_data_space(addralign, ds_name); - Output_section *os = layout->add_output_section_data(name, - elfcpp::SHT_NOBITS, - flags, poc, false, - false, false, false); + Output_data_space* poc; + Output_section* os; + + if (!parameters->incremental_update()) + { + poc = new Output_data_space(addralign, ds_name); + os = layout->add_output_section_data(name, elfcpp::SHT_NOBITS, flags, + poc, ORDER_INVALID, false); + } + else + { + // When doing an incremental update, we need to allocate each common + // directly from the output section's free list. + poc = NULL; + os = layout->find_output_section(name); + } + if (os != NULL) { if (commons_section_type == COMMONS_SMALL) @@ -337,12 +337,26 @@ Symbol_table::do_allocate_commons_list( if (mapfile != NULL) mapfile->report_allocate_common(sym, ssym->symsize()); - off = align_address(off, ssym->value()); - ssym->allocate_common(poc, off); - off += ssym->symsize(); + if (poc != NULL) + { + off = align_address(off, ssym->value()); + ssym->allocate_common(poc, off); + off += ssym->symsize(); + } + else + { + // For an incremental update, allocate from the free list. + off = os->allocate(ssym->symsize(), ssym->value()); + if (off == -1) + gold_fallback(_("out of patch space in section %s; " + "relink with --incremental-full"), + os->name()); + ssym->allocate_common(os, off); + } } - poc->set_current_data_size(off); + if (poc != NULL) + poc->set_current_data_size(off); commons->clear(); }