* layout.cc (Layout::set_segment_offsets): Don't realign text
segment if -Ttext was specified. * object.cc (Sized_relobj_file::Sized_relobj_file): Store the ELF file type. * object.h (Sized_relobj_file::e_type): New function. (Sized_relobj_file::e_type_): New data member. * symtab.cc (Symbol_table::add_from_relobj): Don't add section base address for ET_EXEC files. * target.cc (Target::do_make_elf_object_implementation): Allow ET_EXEC files with --just-symbols option.
This commit is contained in:
parent
9300444e01
commit
9590bf2544
|
@ -1,3 +1,16 @@
|
|||
2011-08-01 Cary Coutant <ccoutant@google.com>
|
||||
|
||||
* layout.cc (Layout::set_segment_offsets): Don't realign text
|
||||
segment if -Ttext was specified.
|
||||
* object.cc (Sized_relobj_file::Sized_relobj_file): Store the ELF
|
||||
file type.
|
||||
* object.h (Sized_relobj_file::e_type): New function.
|
||||
(Sized_relobj_file::e_type_): New data member.
|
||||
* symtab.cc (Symbol_table::add_from_relobj): Don't add section
|
||||
base address for ET_EXEC files.
|
||||
* target.cc (Target::do_make_elf_object_implementation): Allow
|
||||
ET_EXEC files with --just-symbols option.
|
||||
|
||||
2011-07-28 Cary Coutant <ccoutant@google.com>
|
||||
|
||||
* workqueue-internal.h (Workqueue_threader::should_cancel_thread):
|
||||
|
|
|
@ -3039,6 +3039,11 @@ Layout::set_segment_offsets(const Target* target, Output_segment* load_seg,
|
|||
// the physical address.
|
||||
addr = (*p)->paddr();
|
||||
}
|
||||
else if (parameters->options().user_set_Ttext()
|
||||
&& ((*p)->flags() & elfcpp::PF_W) == 0)
|
||||
{
|
||||
are_addresses_set = true;
|
||||
}
|
||||
else if (parameters->options().user_set_Tdata()
|
||||
&& ((*p)->flags() & elfcpp::PF_W) != 0
|
||||
&& (!parameters->options().user_set_Tbss()
|
||||
|
|
|
@ -421,6 +421,7 @@ Sized_relobj_file<size, big_endian>::Sized_relobj_file(
|
|||
deferred_layout_relocs_(),
|
||||
compressed_sections_()
|
||||
{
|
||||
this->e_type_ = ehdr.get_e_type();
|
||||
}
|
||||
|
||||
template<int size, bool big_endian>
|
||||
|
|
|
@ -1912,6 +1912,11 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
|
|||
sized_relobj() const
|
||||
{ return this; }
|
||||
|
||||
// Return the ELF file type.
|
||||
int
|
||||
e_type() const
|
||||
{ return this->e_type_; }
|
||||
|
||||
// Return the number of symbols. This is only valid after
|
||||
// Object::add_symbols has been called.
|
||||
unsigned int
|
||||
|
@ -2504,6 +2509,9 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
|
|||
|
||||
// General access to the ELF file.
|
||||
elfcpp::Elf_file<size, big_endian, Object> elf_file_;
|
||||
// Type of ELF file (ET_REL or ET_EXEC). ET_EXEC files are allowed
|
||||
// as input files only for the --just-symbols option.
|
||||
int e_type_;
|
||||
// Index of SHT_SYMTAB section.
|
||||
unsigned int symtab_shndx_;
|
||||
// The number of local symbols.
|
||||
|
|
|
@ -1192,12 +1192,14 @@ Symbol_table::add_from_relobj(
|
|||
{
|
||||
memcpy(symbuf, p, sym_size);
|
||||
elfcpp::Sym_write<size, big_endian> sw(symbuf);
|
||||
if (orig_st_shndx != elfcpp::SHN_UNDEF && is_ordinary)
|
||||
if (orig_st_shndx != elfcpp::SHN_UNDEF
|
||||
&& is_ordinary
|
||||
&& relobj->e_type() == elfcpp::ET_REL)
|
||||
{
|
||||
// Symbol values in object files are section relative.
|
||||
// This is normally what we want, but since here we are
|
||||
// converting the symbol to absolute we need to add the
|
||||
// section address. The section address in an object
|
||||
// Symbol values in relocatable object files are section
|
||||
// relative. This is normally what we want, but since here
|
||||
// we are converting the symbol to absolute we need to add
|
||||
// the section address. The section address in an object
|
||||
// file is normally zero, but people can use a linker
|
||||
// script to change it.
|
||||
sw.put_st_value(sym.get_st_value()
|
||||
|
|
|
@ -72,7 +72,10 @@ Target::do_make_elf_object_implementation(
|
|||
const elfcpp::Ehdr<size, big_endian>& ehdr)
|
||||
{
|
||||
int et = ehdr.get_e_type();
|
||||
if (et == elfcpp::ET_REL)
|
||||
// ET_EXEC files are valid input for --just-symbols/-R,
|
||||
// and we treat them as relocatable objects.
|
||||
if (et == elfcpp::ET_REL
|
||||
|| (et == elfcpp::ET_EXEC && input_file->just_symbols()))
|
||||
{
|
||||
Sized_relobj_file<size, big_endian>* obj =
|
||||
new Sized_relobj_file<size, big_endian>(name, input_file, offset, ehdr);
|
||||
|
|
Loading…
Reference in New Issue