From 9590bf2544154e40e76e1e4d795d1b21327b0abb Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Mon, 1 Aug 2011 18:25:22 +0000 Subject: [PATCH] * 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. --- gold/ChangeLog | 13 +++++++++++++ gold/layout.cc | 5 +++++ gold/object.cc | 1 + gold/object.h | 8 ++++++++ gold/symtab.cc | 12 +++++++----- gold/target.cc | 5 ++++- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 08fd41f..75afbca 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,16 @@ +2011-08-01 Cary Coutant + + * 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 * workqueue-internal.h (Workqueue_threader::should_cancel_thread): diff --git a/gold/layout.cc b/gold/layout.cc index 2a8d3b4..44c2e18 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -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() diff --git a/gold/object.cc b/gold/object.cc index 6f68ed3..4b69696 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -421,6 +421,7 @@ Sized_relobj_file::Sized_relobj_file( deferred_layout_relocs_(), compressed_sections_() { + this->e_type_ = ehdr.get_e_type(); } template diff --git a/gold/object.h b/gold/object.h index 9c363cd..a389c54 100644 --- a/gold/object.h +++ b/gold/object.h @@ -1912,6 +1912,11 @@ class Sized_relobj_file : public Sized_relobj 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 // General access to the ELF file. elfcpp::Elf_file 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. diff --git a/gold/symtab.cc b/gold/symtab.cc index e289f79..ff6ff84 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -1192,12 +1192,14 @@ Symbol_table::add_from_relobj( { memcpy(symbuf, p, sym_size); elfcpp::Sym_write 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() diff --git a/gold/target.cc b/gold/target.cc index 4a7af83..091f9d3 100644 --- a/gold/target.cc +++ b/gold/target.cc @@ -72,7 +72,10 @@ Target::do_make_elf_object_implementation( const elfcpp::Ehdr& 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* obj = new Sized_relobj_file(name, input_file, offset, ehdr); -- 2.7.4