X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fgc.h;h=cd5b539b4856903ee388aa83babc46ca95cb5072;hb=83015056b2bdfb53e4b4d59ffbb3574fc5dffd88;hp=eda332c22dc3dfa07f0f2750f83d7ff4e2b0f211;hpb=219d1afa89d0d53ca93a684cac341f16470f3ca0;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/gc.h b/gold/gc.h index eda332c22d..cd5b539b48 100644 --- a/gold/gc.h +++ b/gold/gc.h @@ -1,6 +1,6 @@ // gc.h -- garbage collection of unused sections -// Copyright (C) 2009-2018 Free Software Foundation, Inc. +// Copyright (C) 2009-2020 Free Software Foundation, Inc. // Written by Sriraman Tallam . // This file is part of gold. @@ -200,7 +200,8 @@ gc_process_relocs( bool check_section_for_function_pointers = false; if (parameters->options().icf_enabled() - && is_section_foldable_candidate(src_section_name.c_str())) + && (is_section_foldable_candidate(src_section_name) + || is_prefix_of(".eh_frame", src_section_name.c_str()))) { is_icf_tracked = true; Section_id src_id(src_obj, src_indx); @@ -247,7 +248,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))); @@ -263,7 +269,7 @@ gc_process_relocs( if (is_ordinary && check_section_for_function_pointers && lsym.get_st_type() != elfcpp::STT_OBJECT - && scan.local_reloc_may_be_function_pointer(symtab, NULL, NULL, + && scan.local_reloc_may_be_function_pointer(symtab, NULL, target, src_obj, src_indx, NULL, reloc, r_type, lsym)) @@ -300,7 +306,7 @@ gc_process_relocs( && dst_obj != NULL && (!is_ordinary || scan.global_reloc_may_be_function_pointer( - symtab, NULL, NULL, src_obj, src_indx, NULL, reloc, + symtab, NULL, target, src_obj, src_indx, NULL, reloc, r_type, gsym))) symtab->icf()->set_section_has_function_pointers(dst_obj, dst_indx);