rd->relocs.reserve(shnum / 2);
- std::vector<Map_to_output>& map_sections(this->map_to_output());
+ const Output_sections& out_sections(this->output_sections());
+ const std::vector<Address>& out_offsets(this->section_offsets_);
const unsigned char *pshdrs = this->get_view(this->elf_file_.shoff(),
shnum * This::shdr_size,
continue;
}
- Output_section* os = map_sections[shndx].output_section;
+ Output_section* os = out_sections[shndx];
if (os == NULL)
continue;
sr.sh_type = sh_type;
sr.reloc_count = reloc_count;
sr.output_section = os;
- sr.needs_special_offset_handling = map_sections[shndx].offset == -1;
+ sr.needs_special_offset_handling = out_offsets[shndx] == invalid_address;
sr.is_data_section_allocated = is_section_allocated;
}
public:
// A local non-section symbol.
inline Relocatable_relocs::Reloc_strategy
- local_non_section_strategy(unsigned int, Relobj*)
+ local_non_section_strategy(unsigned int, Relobj*, unsigned int)
{ return Relocatable_relocs::RELOC_COPY; }
// A local section symbol.
Views* pviews)
{
unsigned int shnum = this->shnum();
- const std::vector<Map_to_output>& map_sections(this->map_to_output());
+ const Output_sections& out_sections(this->output_sections());
+ const std::vector<Address>& out_offsets(this->section_offsets_);
File_read::Read_multiple rm;
bool is_sorted = true;
pvs->view = NULL;
- const Output_section* os = map_sections[i].output_section;
+ const Output_section* os = out_sections[i];
if (os == NULL)
continue;
- off_t output_offset = map_sections[i].offset;
+ Address output_offset = out_offsets[i];
typename This::Shdr shdr(p);
// In the normal case, this input section is simply mapped to
// the output section at offset OUTPUT_OFFSET.
- // However, if OUTPUT_OFFSET == -1, then input data is handled
- // specially--e.g., a .eh_frame section. The relocation
+ // However, if OUTPUT_OFFSET == INVALID_ADDRESS, then input data is
+ // handled specially--e.g., a .eh_frame section. The relocation
// routines need to check for each reloc where it should be
// applied. For this case, we need an input/output view for the
// entire contents of the section in the output file. We don't
// final data to the output file.
off_t output_section_offset;
- off_t output_section_size;
+ Address output_section_size;
if (!os->requires_postprocessing())
{
output_section_offset = os->offset();
- output_section_size = os->data_size();
+ output_section_size = convert_types<Address, off_t>(os->data_size());
}
else
{
output_section_offset = 0;
- output_section_size = os->postprocessing_buffer_size();
+ output_section_size =
+ convert_types<Address, off_t>(os->postprocessing_buffer_size());
}
off_t view_start;
section_size_type view_size;
- if (output_offset != -1)
+ if (output_offset != invalid_address)
{
view_start = output_section_offset + output_offset;
view_size = convert_to_section_size_type(shdr.get_sh_size());
if (view_size == 0)
continue;
- gold_assert(output_offset == -1
- || (output_offset >= 0
- && (output_offset + static_cast<off_t>(view_size)
- <= output_section_size)));
+ gold_assert(output_offset == invalid_address
+ || output_offset + view_size <= output_section_size);
unsigned char* view;
if (os->requires_postprocessing())
{
unsigned char* buffer = os->postprocessing_buffer();
view = buffer + view_start;
- if (output_offset != -1)
+ if (output_offset != invalid_address)
{
off_t sh_offset = shdr.get_sh_offset();
if (!rm.empty() && rm.back().file_offset > sh_offset)
}
else
{
- if (output_offset == -1)
+ if (output_offset == invalid_address)
view = of->get_input_output_view(view_start, view_size);
else
{
pvs->view = view;
pvs->address = os->address();
- if (output_offset != -1)
+ if (output_offset != invalid_address)
pvs->address += output_offset;
pvs->offset = view_start;
pvs->view_size = view_size;
- pvs->is_input_output_view = output_offset == -1;
+ pvs->is_input_output_view = output_offset == invalid_address;
pvs->is_postprocessing_view = os->requires_postprocessing();
}
unsigned int shnum = this->shnum();
Sized_target<size, big_endian>* target = this->sized_target();
- const std::vector<Map_to_output>& map_sections(this->map_to_output());
+ const Output_sections& out_sections(this->output_sections());
+ const std::vector<Address>& out_offsets(this->section_offsets_);
Relocate_info<size, big_endian> relinfo;
relinfo.options = &options;
continue;
}
- Output_section* os = map_sections[index].output_section;
+ Output_section* os = out_sections[index];
if (os == NULL)
{
// This relocation section is against a section which we
// discarded.
continue;
}
- off_t output_offset = map_sections[index].offset;
+ Address output_offset = out_offsets[index];
gold_assert((*pviews)[index].view != NULL);
if (parameters->options().relocatable())
continue;
}
- gold_assert(output_offset != -1
+ gold_assert(output_offset != invalid_address
|| this->relocs_must_follow_section_writes());
relinfo.reloc_shndx = i;
prelocs,
reloc_count,
os,
- output_offset == -1,
+ output_offset == invalid_address,
(*pviews)[index].view,
(*pviews)[index].address,
(*pviews)[index].view_size);
const unsigned char* prelocs,
size_t reloc_count,
Output_section* output_section,
- off_t offset_in_output_section,
+ typename elfcpp::Elf_types<size>::Elf_Addr offset_in_output_section,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr address,
section_size_type view_size,
const unsigned char* prelocs,
size_t reloc_count,
Output_section* output_section,
- off_t offset_in_output_section,
+ typename elfcpp::Elf_types<size>::Elf_Addr offset_in_output_section,
unsigned char* view,
typename elfcpp::Elf_types<size>::Elf_Addr address,
section_size_type view_size,