From 651d16203867f8013a0f78a2f2e24df8c02d1377 Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Tue, 24 Apr 2018 21:57:37 -0700 Subject: Fix bug with relocation addends and merge sections with --icf. During --icf processing, gold was incorrectly processing the relocation addend for references to items in a merge section. PC-relative references and other forms of reference with a biased base address require a non-section local symbol, where the addend is purely the bias. gold/ PR gold/20642 PR gold/22820 * gc.h (gc_process_relocs): Flag STT_SECTION symbols in symvec. * icf.cc (get_section_contents): For merge sections, ignore the addend for relocations against non-section symbols. --- gold/gc.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'gold/gc.h') diff --git a/gold/gc.h b/gold/gc.h index 7c79c23aa95..78ead4132f9 100644 --- a/gold/gc.h +++ b/gold/gc.h @@ -247,7 +247,12 @@ gc_process_relocs( (*secvec).push_back(Section_id(src_obj, dst_indx)); else (*secvec).push_back(Section_id(NULL, 0)); - (*symvec).push_back(NULL); + // If the target of the relocation is an STT_SECTION symbol, + // make a note of that by storing -1 in the symbol vector. + if (lsym.get_st_type() == elfcpp::STT_SECTION) + (*symvec).push_back(reinterpret_cast(-1)); + else + (*symvec).push_back(NULL); (*addendvec).push_back(std::make_pair( static_cast(symvalue), static_cast(addend))); -- cgit v1.2.1