* 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:
Cary Coutant
2008-05-01 01:23:21 +00:00
parent 1af5d7ceb5
commit e94cf12773
6 changed files with 397 additions and 40 deletions

View File

@@ -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