From: Cary Coutant Date: Mon, 1 Aug 2011 18:25:22 +0000 (+0000) Subject: * layout.cc (Layout::set_segment_offsets): Don't realign text X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9590bf2544154e40e76e1e4d795d1b21327b0abb;p=binutils-gdb.git * 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. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 08fd41f93e8..75afbca0939 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 2a8d3b49c01..44c2e183e82 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 6f68ed321e9..4b69696b3fb 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 9c363cd6f72..a389c54a1fb 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 e289f796c59..ff6ff846492 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 4a7af83c161..091f9d34cd5 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);