diff options
-rw-r--r-- | gold/ChangeLog | 13 | ||||
-rw-r--r-- | gold/layout.cc | 5 | ||||
-rw-r--r-- | gold/object.cc | 1 | ||||
-rw-r--r-- | gold/object.h | 8 | ||||
-rw-r--r-- | gold/symtab.cc | 12 | ||||
-rw-r--r-- | 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 <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): 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<size, big_endian>::Sized_relobj_file( deferred_layout_relocs_(), compressed_sections_() { + this->e_type_ = ehdr.get_e_type(); } template<int size, bool big_endian> 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<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. 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<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() 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<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); |