summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2010-01-19 17:55:48 +0000
committerIan Lance Taylor <ian@airs.com>2010-01-19 17:55:48 +0000
commite8a151354bec08c94e32875c10bc8a10c68268b7 (patch)
tree3bb753fca4ee2d61ab506abe1ac868b6a1b65428
parente5b68cff621511867f4cc6e70cf29c17fadb3f1d (diff)
downloadbinutils-redhat-e8a151354bec08c94e32875c10bc8a10c68268b7.tar.gz
elfcpp/:
* elfcpp.h (PN_XNUM): Define. gold/: * output.cc (Output_section_headers::do_sized_write): Write large segment count to sh_info field. (Output_file_header::do_sized_write): For large segment count, write PN_XNUM to e_phnum field.
-rw-r--r--elfcpp/ChangeLog4
-rw-r--r--elfcpp/elfcpp.h9
-rw-r--r--gold/ChangeLog7
-rw-r--r--gold/output.cc11
4 files changed, 28 insertions, 3 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog
index d2d6251948..ab3d2df581 100644
--- a/elfcpp/ChangeLog
+++ b/elfcpp/ChangeLog
@@ -1,3 +1,7 @@
+2010-01-19 Ian Lance Taylor <iant@google.com>
+
+ * elfcpp.h (PN_XNUM): Define.
+
2009-12-14 Ian Lance Taylor <iant@google.com>
* elfcpp_file.h: Revert last patch.
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index 0b2c871d19..8ecbc0ae4c 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -302,6 +302,15 @@ enum EM
// Old MN10200 objects used 0xdead (EM_MN10200 is correct).
};
+// A special value found in the Ehdr e_phnum field.
+
+enum
+{
+ // Number of program segments stored in sh_info field of first
+ // section headre.
+ PN_XNUM = 0xffff
+};
+
// Special section indices.
enum
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 0c6e1a02af..2bf56d4140 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,10 @@
+2010-01-19 Ian Lance Taylor <iant@google.com>
+
+ * output.cc (Output_section_headers::do_sized_write): Write large
+ segment count to sh_info field.
+ (Output_file_header::do_sized_write): For large segment count,
+ write PN_XNUM to e_phnum field.
+
2010-01-15 Viktor Kutuzov <vkutuzov@accesssoftek.com>
* arm.cc (Arm_relocate_functions::thm_jump6): New function.
diff --git a/gold/output.cc b/gold/output.cc
index 634249fa30..2a97078c74 100644
--- a/gold/output.cc
+++ b/gold/output.cc
@@ -213,7 +213,9 @@ Output_section_headers::do_sized_write(Output_file* of)
else
oshdr.put_sh_link(shstrndx);
- oshdr.put_sh_info(0);
+ size_t segment_count = this->segment_list_->size();
+ oshdr.put_sh_info(segment_count >= elfcpp::PN_XNUM ? segment_count : 0);
+
oshdr.put_sh_addralign(0);
oshdr.put_sh_entsize(0);
}
@@ -470,8 +472,11 @@ Output_file_header::do_sized_write(Output_file* of)
else
{
oehdr.put_e_phentsize(elfcpp::Elf_sizes<size>::phdr_size);
- oehdr.put_e_phnum(this->segment_header_->data_size()
- / elfcpp::Elf_sizes<size>::phdr_size);
+ size_t phnum = (this->segment_header_->data_size()
+ / elfcpp::Elf_sizes<size>::phdr_size);
+ if (phnum > elfcpp::PN_XNUM)
+ phnum = elfcpp::PN_XNUM;
+ oehdr.put_e_phnum(phnum);
}
oehdr.put_e_shentsize(elfcpp::Elf_sizes<size>::shdr_size);