* output.cc (Output_section::find_starting_output_address): Rename
	from starting_output_address; add PADDR parameter; change return
	type.
	* output.h (class Output_section): Declare
	find_starting_output_address instead of starting_output_address.
	* object.cc (Sized_relobj::do_finalize_local_symbols): Handle a
	section symbol for which we can't find a merge section.
This commit is contained in:
Ian Lance Taylor
2009-02-28 00:12:26 +00:00
parent a5a437df77
commit e29e076ab8
4 changed files with 52 additions and 24 deletions

View File

@@ -1554,20 +1554,31 @@ Sized_relobj<size, big_endian>::do_finalize_local_symbols(unsigned int index,
}
else if (out_offsets[shndx] == invalid_address)
{
uint64_t start;
// This is a SHF_MERGE section or one which otherwise
// requires special handling. We get the output address
// of the start of the merged section. If this is not a
// section symbol, we can then determine the final
// value. If it is a section symbol, we can not, as in
// that case we have to consider the addend to determine
// the value to use in a relocation.
// requires special handling.
if (!lv.is_section_symbol())
lv.set_output_value(os->output_address(this, shndx,
lv.input_value()));
{
// This is not a section symbol. We can determine
// the final value now.
lv.set_output_value(os->output_address(this, shndx,
lv.input_value()));
}
else if (!os->find_starting_output_address(this, shndx, &start))
{
// This is a section symbol, but apparently not one
// in a merged section. Just use the start of the
// output section. This happens with relocatable
// links when the input object has section symbols
// for arbitrary non-merge sections.
lv.set_output_value(os->address());
}
else
{
section_offset_type start =
os->starting_output_address(this, shndx);
// We have to consider the addend to determine the
// value to use in a relocation. START is the start
// of this input section.
Merged_symbol_value<size>* msv =
new Merged_symbol_value<size>(lv.input_value(), start);
lv.set_merged_symbol_value(msv);