aboutsummaryrefslogtreecommitdiff
path: root/gold/output.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2010-01-19 17:55:49 +0000
committerIan Lance Taylor <ian@airs.com>2010-01-19 17:55:49 +0000
commit5696ab0b73cb827e7b3636255694d1fe61c89a32 (patch)
treedda1642631daec50281a4603f4ee99ccdffe6787 /gold/output.cc
parent2046a35d20ffeb5cfeb1df687925b1fbedb87dcf (diff)
downloadgdb-5696ab0b73cb827e7b3636255694d1fe61c89a32.zip
gdb-5696ab0b73cb827e7b3636255694d1fe61c89a32.tar.gz
gdb-5696ab0b73cb827e7b3636255694d1fe61c89a32.tar.bz2
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.
Diffstat (limited to 'gold/output.cc')
-rw-r--r--gold/output.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/gold/output.cc b/gold/output.cc
index 634249f..2a97078 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);