This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] gold: PR gold/21857: Add clear_ch_reserved to 64-bit Chdr_write
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Cc: Cary Coutant <ccoutant at gmail dot com>
- Date: Fri, 28 Jul 2017 11:07:29 -0700
- Subject: [PATCH] gold: PR gold/21857: Add clear_ch_reserved to 64-bit Chdr_write
- Authentication-results: sourceware.org; auth=none
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
The 64-bit ELF compression header has a reserved field. It should be
cleared to avoid random bits in it.
OK for master and 2.29 branches?
H.J.
--
elfcpp/
PR gold/21857
* elfcpp.h (Chdr_write): Add clear_ch_reserved.
gold/
PR gold/21857
* compressed_output.cc (Chdr_write<64, true>::clear_ch_reserved):
New.
(Chdr_write<64, false>::clear_ch_reserved): Likewise.
(Output_compressed_section::set_final_data_size): Call
clear_ch_reserved to clear the reserved field for 64-bit ELF..
---
elfcpp/elfcpp.h | 3 +++
gold/compressed_output.cc | 18 ++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h
index a57f5476f1..0209a48059 100644
--- a/elfcpp/elfcpp.h
+++ b/elfcpp/elfcpp.h
@@ -1351,6 +1351,9 @@ class Chdr_write
put_ch_addralign(typename Elf_types<size>::Elf_WXword v)
{ this->p_->ch_addralign = Convert<size, big_endian>::convert_host(v); }
+ void
+ clear_ch_reserved ();
+
private:
internal::Chdr_data<size>* p_;
};
diff --git a/gold/compressed_output.cc b/gold/compressed_output.cc
index 4374ba1bb7..d34db9bfe6 100644
--- a/gold/compressed_output.cc
+++ b/gold/compressed_output.cc
@@ -26,6 +26,22 @@
#include "options.h"
#include "compressed_output.h"
+template<>
+inline void
+elfcpp::Chdr_write<64, true>::clear_ch_reserved()
+{
+ // Clear the reserved field.
+ this->p_->ch_reserved = 0;
+}
+
+template<>
+inline void
+elfcpp::Chdr_write<64, false>::clear_ch_reserved()
+{
+ // Clear the reserved field.
+ this->p_->ch_reserved = 0;
+}
+
namespace gold
{
@@ -286,6 +302,7 @@ Output_compressed_section::set_final_data_size()
chdr.put_ch_type(elfcpp::ELFCOMPRESS_ZLIB);
chdr.put_ch_size(uncompressed_size);
chdr.put_ch_addralign(addralign);
+ chdr.clear_ch_reserved();
}
else
{
@@ -293,6 +310,7 @@ Output_compressed_section::set_final_data_size()
chdr.put_ch_type(elfcpp::ELFCOMPRESS_ZLIB);
chdr.put_ch_size(uncompressed_size);
chdr.put_ch_addralign(addralign);
+ chdr.clear_ch_reserved();
}
}
else
--
2.13.3