aboutsummaryrefslogtreecommitdiff
path: root/gold/output.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2009-12-30 04:00:21 +0000
committerIan Lance Taylor <ian@airs.com>2009-12-30 04:00:21 +0000
commite8cd95c71e5a6ea455f60d6428a34c621d11d3bf (patch)
tree0f031d13181414fbfa32b0d6bce82891f01dcb07 /gold/output.cc
parent9037e078d45ef6c97475b74f46e017a33416f11c (diff)
downloadfsf-binutils-gdb-e8cd95c71e5a6ea455f60d6428a34c621d11d3bf.zip
fsf-binutils-gdb-e8cd95c71e5a6ea455f60d6428a34c621d11d3bf.tar.gz
fsf-binutils-gdb-e8cd95c71e5a6ea455f60d6428a34c621d11d3bf.tar.bz2
PR 10450
* output.h (class Output_section): Add is_entsize_zero_ field. * output.cc (Output_section::Output_section): Initialize is_entsize_zero_. (Output_section::set_entsize): If two different entsizes are requested, force it to zero. (Output_section::add_input_section): Set flags for .debug_str before updating section flags. Set entsize. (Output_section::update_flags_for_input_section): Set SHF_MERGE and SHF_STRING if all input sections have those flags.
Diffstat (limited to 'gold/output.cc')
-rw-r--r--gold/output.cc33
1 files changed, 28 insertions, 5 deletions
diff --git a/gold/output.cc b/gold/output.cc
index 440d4f2..d75b45b 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -1800,6 +1800,7 @@ Output_section::Output_section(const char* name, elfcpp::Elf_Word type,
is_interp_(false),
is_dynamic_linker_section_(false),
generate_code_fills_at_write_(false),
+ is_entsize_zero_(false),
tls_offset_(0),
checkpoint_(NULL),
merge_section_map_(),
@@ -1824,10 +1825,15 @@ Output_section::~Output_section()
void
Output_section::set_entsize(uint64_t v)
{
- if (this->entsize_ == 0)
+ if (this->is_entsize_zero_)
+ ;
+ else if (this->entsize_ == 0)
this->entsize_ = v;
- else
- gold_assert(this->entsize_ == v);
+ else if (this->entsize_ != v)
+ {
+ this->entsize_ = 0;
+ this->is_entsize_zero_ = 1;
+ }
}
// Add the input section SHNDX, with header SHDR, named SECNAME, in
@@ -1863,8 +1869,6 @@ Output_section::add_input_section(Sized_relobj<size, big_endian>* object,
this->addralign_ = addralign;
typename elfcpp::Elf_types<size>::Elf_WXword sh_flags = shdr.get_sh_flags();
- this->update_flags_for_input_section(sh_flags);
-
uint64_t entsize = shdr.get_sh_entsize();
// .debug_str is a mergeable string section, but is not always so
@@ -1875,6 +1879,9 @@ Output_section::add_input_section(Sized_relobj<size, big_endian>* object,
entsize = 1;
}
+ this->update_flags_for_input_section(sh_flags);
+ this->set_entsize(entsize);
+
// If this is a SHF_MERGE section, we pass all the input sections to
// a Output_data_merge. We don't try to handle relocations for such
// a section. We don't try to handle empty merge sections--they
@@ -2199,6 +2206,22 @@ Output_section::update_flags_for_input_section(elfcpp::Elf_Xword flags)
& (elfcpp::SHF_WRITE
| elfcpp::SHF_ALLOC
| elfcpp::SHF_EXECINSTR));
+
+ if ((flags & elfcpp::SHF_MERGE) == 0)
+ this->flags_ &=~ elfcpp::SHF_MERGE;
+ else
+ {
+ if (this->current_data_size_for_child() == 0)
+ this->flags_ |= elfcpp::SHF_MERGE;
+ }
+
+ if ((flags & elfcpp::SHF_STRINGS) == 0)
+ this->flags_ &=~ elfcpp::SHF_STRINGS;
+ else
+ {
+ if (this->current_data_size_for_child() == 0)
+ this->flags_ |= elfcpp::SHF_STRINGS;
+ }
}
// Find the merge section into which an input section with index SHNDX in