summaryrefslogtreecommitdiffstats
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2011-08-01 18:25:22 +0000
committerCary Coutant <ccoutant@google.com>2011-08-01 18:25:22 +0000
commit9590bf2544154e40e76e1e4d795d1b21327b0abb (patch)
tree52d41c1f96a4c0d6d0a8e102f61bc8a5f1c50687 /gold
parent9300444e01cbd7db31985548a0a0eba2b8040b83 (diff)
downloadppe42-binutils-9590bf2544154e40e76e1e4d795d1b21327b0abb.tar.gz
ppe42-binutils-9590bf2544154e40e76e1e4d795d1b21327b0abb.zip
* 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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog13
-rw-r--r--gold/layout.cc5
-rw-r--r--gold/object.cc1
-rw-r--r--gold/object.h8
-rw-r--r--gold/symtab.cc12
-rw-r--r--gold/target.cc5
6 files changed, 38 insertions, 6 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 08fd41f93e..75afbca093 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 2a8d3b49c0..44c2e183e8 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 6f68ed321e..4b69696b3f 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 9c363cd6f7..a389c54a1f 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 e289f796c5..ff6ff84649 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 4a7af83c16..091f9d34cd 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);
OpenPOWER on IntegriCloud