forked from Imagelibrary/binutils-gdb
* layout.cc (Layout::include_section): Refactored check for debug
info section. (Layout::add_comdat): Add new parameters. Change type of signature parameter. Add object and shndx to signatures table. (Layout::find_kept_object): New function. * layout.h: Include <cstring>. (Layout::is_debug_info_section): New function. (Layout::add_comdat): Add new parameters. (Layout::find_kept_object): New function. (Layout::Kept_section): New struct. (Layout::Signatures): Change type of map range. * object.cc (Relobj::output_section_address): New function. (Sized_relobj::include_section_group): Add new parameters. Change calls to Layout::add_comdat. Change to build table of kept comdat groups and table mapping discarded sections to kept sections. (Sized_relobj::include_linkonce_section): Likewise. Add new parameter. (Sized_relobj::do_layout): Change calls to include_section_group and include_linkonce_section. (Sized_relobj::do_finalize_local_symbols): Do not set local symbol value to zero when section is discarded. (Sized_relobj::map_to_kept_section): New function. * object.h (Relobj::output_section_address): New function. (Relobj::Comdat_group): New type. (Relobj::find_comdat_group): New function. (Relobj::Comdat_group_table): New type. (Relobj::Kept_comdat_section): New type. (Relobj::Kept_comdat_section_table): New type. (Relobj::add_comdat_group): New function. (Relobj::set_kept_comdat_section): New function. (Relobj::get_kept_comdat_section): New function. (Relobj::comdat_groups_): New field. (Relobj::kept_comdat_sections_): New field. (Symbol_value::input_value): Update comment. (Sized_relobj::map_to_kept_section) New function. (Sized_relobj::include_linkonce_section): Add new parameter. * target-reloc.h (Comdat_behavior): New type. (get_comdat_behavior): New function. (relocate_section): Add code to map a discarded section to the corresponding kept section when applying a relocation.
This commit is contained in:
@@ -192,11 +192,7 @@ Layout::include_section(Sized_relobj<size, big_endian>*, const char* name,
|
||||
if (parameters->options().strip_debug()
|
||||
&& (shdr.get_sh_flags() & elfcpp::SHF_ALLOC) == 0)
|
||||
{
|
||||
// Debugging sections can only be recognized by name.
|
||||
if (is_prefix_of(".debug", name)
|
||||
|| is_prefix_of(".gnu.linkonce.wi.", name)
|
||||
|| is_prefix_of(".line", name)
|
||||
|| is_prefix_of(".stab", name))
|
||||
if (is_debug_info_section(name))
|
||||
return false;
|
||||
}
|
||||
if (parameters->options().strip_debug_gdb()
|
||||
@@ -2770,11 +2766,12 @@ Layout::output_section_name(const char* name, size_t* plen)
|
||||
// want a linkonce signature to block another linkonce signature.
|
||||
|
||||
bool
|
||||
Layout::add_comdat(const char* signature, bool group)
|
||||
Layout::add_comdat(Relobj* object, unsigned int shndx,
|
||||
const std::string& signature, bool group)
|
||||
{
|
||||
std::string sig(signature);
|
||||
Kept_section kept(object, shndx, group);
|
||||
std::pair<Signatures::iterator, bool> ins(
|
||||
this->signatures_.insert(std::make_pair(sig, group)));
|
||||
this->signatures_.insert(std::make_pair(signature, kept)));
|
||||
|
||||
if (ins.second)
|
||||
{
|
||||
@@ -2782,7 +2779,7 @@ Layout::add_comdat(const char* signature, bool group)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (ins.first->second)
|
||||
if (ins.first->second.group_)
|
||||
{
|
||||
// We've already seen a real section group with this signature.
|
||||
return false;
|
||||
@@ -2792,7 +2789,7 @@ Layout::add_comdat(const char* signature, bool group)
|
||||
// This is a real section group, and we've already seen a
|
||||
// linkonce section with this signature. Record that we've seen
|
||||
// a section group, and don't include this section group.
|
||||
ins.first->second = true;
|
||||
ins.first->second.group_ = true;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
@@ -2804,6 +2801,20 @@ Layout::add_comdat(const char* signature, bool group)
|
||||
}
|
||||
}
|
||||
|
||||
// Find the given comdat signature, and return the object and section
|
||||
// index of the kept group.
|
||||
Relobj*
|
||||
Layout::find_kept_object(const std::string& signature,
|
||||
unsigned int* pshndx) const
|
||||
{
|
||||
Signatures::const_iterator p = this->signatures_.find(signature);
|
||||
if (p == this->signatures_.end())
|
||||
return NULL;
|
||||
if (pshndx != NULL)
|
||||
*pshndx = p->second.shndx_;
|
||||
return p->second.object_;
|
||||
}
|
||||
|
||||
// Store the allocated sections into the section list.
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user