// gc.h -- garbage collection of unused sections
-// Copyright (C) 2009-2016 Free Software Foundation, Inc.
+// Copyright (C) 2009-2020 Free Software Foundation, Inc.
// Written by Sriraman Tallam <tmsriram@google.com>.
// This file is part of gold.
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);
(*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<Symbol*>(-1));
+ else
+ (*symvec).push_back(NULL);
(*addendvec).push_back(std::make_pair(
static_cast<long long>(symvalue),
static_cast<long long>(addend)));
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))
// When doing safe folding, check to see if this relocation is that
// of a function pointer being taken.
if (gsym->source() == Symbol::FROM_OBJECT
+ && gsym->type() == elfcpp::STT_FUNC
&& check_section_for_function_pointers
&& 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);