diff options
author | Ian Lance Taylor <ian@airs.com> | 2010-01-19 17:55:49 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2010-01-19 17:55:49 +0000 |
commit | 5696ab0b73cb827e7b3636255694d1fe61c89a32 (patch) | |
tree | dda1642631daec50281a4603f4ee99ccdffe6787 /gold/output.cc | |
parent | 2046a35d20ffeb5cfeb1df687925b1fbedb87dcf (diff) | |
download | gdb-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.cc | 11 |
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); |