From 5696ab0b73cb827e7b3636255694d1fe61c89a32 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 19 Jan 2010 17:55:49 +0000 Subject: [PATCH] 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. --- elfcpp/ChangeLog | 4 ++++ elfcpp/elfcpp.h | 9 +++++++++ gold/ChangeLog | 7 +++++++ gold/output.cc | 11 ++++++++--- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index d2d62519486..ab3d2df5816 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -1,3 +1,7 @@ +2010-01-19 Ian Lance Taylor + + * elfcpp.h (PN_XNUM): Define. + 2009-12-14 Ian Lance Taylor * elfcpp_file.h: Revert last patch. diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h index 0b2c871d193..8ecbc0ae4cd 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 0c6e1a02af3..2bf56d41402 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,10 @@ +2010-01-19 Ian Lance Taylor + + * 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 * arm.cc (Arm_relocate_functions::thm_jump6): New function. diff --git a/gold/output.cc b/gold/output.cc index 634249fa303..2a97078c741 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::phdr_size); - oehdr.put_e_phnum(this->segment_header_->data_size() - / elfcpp::Elf_sizes::phdr_size); + size_t phnum = (this->segment_header_->data_size() + / elfcpp::Elf_sizes::phdr_size); + if (phnum > elfcpp::PN_XNUM) + phnum = elfcpp::PN_XNUM; + oehdr.put_e_phnum(phnum); } oehdr.put_e_shentsize(elfcpp::Elf_sizes::shdr_size); -- 2.30.2