From d6183960755dae9d809642f2e2a54d7b6c9634f4 Mon Sep 17 00:00:00 2001
From: Jason Hiser <jdhiser@gmail.com>
Date: Mon, 28 Oct 2019 10:33:45 -0400
Subject: [PATCH] fixed endian write for section headers

---
 src/elfwrite.cpp | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/src/elfwrite.cpp b/src/elfwrite.cpp
index 716590de5..d5f6671ae 100644
--- a/src/elfwrite.cpp
+++ b/src/elfwrite.cpp
@@ -66,18 +66,18 @@ static inline void host_to_shdr(const T_Elf_Ehdr& ehdr, T_Elf_Shdr& shdr)
 		if(sizeof(ehdr.e_entry)==4)	 // 32-bit header
 		{
 			shdr.sh_flags     = htole32(shdr.sh_flags);
-			shdr.sh_size      = htole32(shdr.sh_size);
 			shdr.sh_addr      = htole32(shdr.sh_addr);
 			shdr.sh_offset    = htole32(shdr.sh_offset);
+			shdr.sh_size      = htole32(shdr.sh_size);
 			shdr.sh_addralign = htole32(shdr.sh_addralign);
 			shdr.sh_entsize   = htole32(shdr.sh_entsize);
 		}
 		else if(sizeof(ehdr.e_entry)==8)	// 64-bit header
 		{
 			shdr.sh_flags     = htole64(shdr.sh_flags);
-			shdr.sh_size      = htole64(shdr.sh_size);
 			shdr.sh_addr      = htole64(shdr.sh_addr);
 			shdr.sh_offset    = htole64(shdr.sh_offset);
+			shdr.sh_size      = htole64(shdr.sh_size);
 			shdr.sh_addralign = htole64(shdr.sh_addralign);
 			shdr.sh_entsize   = htole64(shdr.sh_entsize);
 		}
@@ -96,18 +96,18 @@ static inline void host_to_shdr(const T_Elf_Ehdr& ehdr, T_Elf_Shdr& shdr)
 		if(sizeof(ehdr.e_entry)==4)	 // 32-bit header
 		{
 			shdr.sh_flags     = htobe32(shdr.sh_flags);
-			shdr.sh_size      = htobe32(shdr.sh_size);
 			shdr.sh_addr      = htobe32(shdr.sh_addr);
 			shdr.sh_offset    = htobe32(shdr.sh_offset);
+			shdr.sh_size      = htobe32(shdr.sh_size);
 			shdr.sh_addralign = htobe32(shdr.sh_addralign);
 			shdr.sh_entsize   = htobe32(shdr.sh_entsize);
 		}
 		else if(sizeof(ehdr.e_entry)==8)	// 64-bit header
 		{
 			shdr.sh_flags     = htobe64(shdr.sh_flags);
-			shdr.sh_size      = htobe64(shdr.sh_size);
 			shdr.sh_addr      = htobe64(shdr.sh_addr);
 			shdr.sh_offset    = htobe64(shdr.sh_offset);
+			shdr.sh_size      = htobe64(shdr.sh_size);
 			shdr.sh_addralign = htobe64(shdr.sh_addralign);
 			shdr.sh_entsize   = htobe64(shdr.sh_entsize);
 		}
@@ -167,18 +167,18 @@ static inline void shdr_to_host(const T_Elf_Ehdr& ehdr, T_Elf_Shdr& shdr)
 		if(sizeof(ehdr.e_entry)==4)	 // 32-bit header
 		{
 			shdr.sh_flags     = le32toh(shdr.sh_flags);
-			shdr.sh_size      = le32toh(shdr.sh_size);
 			shdr.sh_addr      = le32toh(shdr.sh_addr);
 			shdr.sh_offset    = le32toh(shdr.sh_offset);
+			shdr.sh_size      = le32toh(shdr.sh_size);
 			shdr.sh_addralign = le32toh(shdr.sh_addralign);
 			shdr.sh_entsize   = le32toh(shdr.sh_entsize);
 		}
 		else if(sizeof(ehdr.e_entry)==8)	// 64-bit header
 		{
 			shdr.sh_flags     = le64toh(shdr.sh_flags);
-			shdr.sh_size      = le64toh(shdr.sh_size);
 			shdr.sh_addr      = le64toh(shdr.sh_addr);
 			shdr.sh_offset    = le64toh(shdr.sh_offset);
+			shdr.sh_size      = le64toh(shdr.sh_size);
 			shdr.sh_addralign = le64toh(shdr.sh_addralign);
 			shdr.sh_entsize   = le64toh(shdr.sh_entsize);
 		}
@@ -197,18 +197,18 @@ static inline void shdr_to_host(const T_Elf_Ehdr& ehdr, T_Elf_Shdr& shdr)
 		if(sizeof(ehdr.e_entry)==4)	 // 32-bit header
 		{
 			shdr.sh_flags     = be32toh(shdr.sh_flags);
-			shdr.sh_size      = be32toh(shdr.sh_size);
 			shdr.sh_addr      = be32toh(shdr.sh_addr);
 			shdr.sh_offset    = be32toh(shdr.sh_offset);
+			shdr.sh_size      = be32toh(shdr.sh_size);
 			shdr.sh_addralign = be32toh(shdr.sh_addralign);
 			shdr.sh_entsize   = be32toh(shdr.sh_entsize);
 		}
 		else if(sizeof(ehdr.e_entry)==8)	// 64-bit header
 		{
 			shdr.sh_flags     = be64toh(shdr.sh_flags);
-			shdr.sh_size      = be64toh(shdr.sh_size);
 			shdr.sh_addr      = be64toh(shdr.sh_addr);
 			shdr.sh_offset    = be64toh(shdr.sh_offset);
+			shdr.sh_size      = be64toh(shdr.sh_size);
 			shdr.sh_addralign = be64toh(shdr.sh_addralign);
 			shdr.sh_entsize   = be64toh(shdr.sh_entsize);
 		}
@@ -1427,7 +1427,6 @@ filesz before we start writing out the elf.  See "trim_last_seg_filesz"
 	{
 		host_to_phdr(ehdr,phdr);
 		fwrite(&phdr, sizeof(new_phdrs[0]), 1, fout);
-
 	}
 }
 
@@ -1621,7 +1620,7 @@ void ElfWriterImpl<T_Elf_Ehdr,T_Elf_Phdr,T_Elf_Addr,T_Elf_Shdr,T_Elf_Sym, T_Elf_
 	for(auto shdr : shdrs)
 	{
 		host_to_shdr(ehdr,shdr);
-		fwrite(&shdrs, sizeof(T_Elf_Shdr), 1, fout);
+		fwrite(&shdr, sizeof(T_Elf_Shdr), 1, fout);
 
 	}
 
-- 
GitLab