From caa83f8b08be81c0f5a93fd8beee392eeac826bc Mon Sep 17 00:00:00 2001
From: Nick Clifton <nickc@redhat.com>
Date: Mon, 28 Sep 2009 09:45:33 +0000
Subject: [PATCH]         PR 10478         * elf.c (bfd_section_from_shdr):
 Allow SHN_BEFORE and SHN_AFTER         section link values in x86 binaries.  
       * elfcode.h (elf_object_p): Likewise.         * readelf.c
 (get_elf_section_flags): Allow SHN_BEFORE and         SHN_AFTER section link
 values in x86 binaries.         (process_section_headers): Likewise.

---
 bfd/ChangeLog      | 7 +++++++
 bfd/elf.c          | 3 ++-
 bfd/elfcode.h      | 5 ++++-
 binutils/ChangeLog | 7 +++++++
 binutils/readelf.c | 8 +++++++-
 5 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 860297be5d..3594e2550b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2009-09-28  Nick Clifton  <nickc@redhat.com>
+
+	PR 10478: Accepting Solaris binaries.
+	* elf.c (bfd_section_from_shdr): Allow SHN_BEFORE and SHN_AFTER
+	section link values in x86 binaries.
+	* elfcode.h (elf_object_p): Likewise.
+
 2009-09-28  Philippe De Muyter  <phdm@macqel.be>
 
 	* elf32-m68k.c (elf_m68k_final_write_processing): New function.
diff --git a/bfd/elf.c b/bfd/elf.c
index e7116d8994..4a329294ce 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1518,10 +1518,11 @@ bfd_section_from_shdr (bfd *abfd, unsigned int shindex)
 	return FALSE;
       if (hdr->sh_link > elf_numsections (abfd))
 	{
-	  /* PR 10478: Accept sparc binaries with a sh_link
+	  /* PR 10478: Accept Solaris binaries with a sh_link
 	     field set to SHN_BEFORE or SHN_AFTER.  */
 	  switch (bfd_get_arch (abfd))
 	    {
+	    case bfd_arch_i386:
 	    case bfd_arch_sparc:
 	      if (hdr->sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
 		  || hdr->sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
diff --git a/bfd/elfcode.h b/bfd/elfcode.h
index f5391194b6..ecdc2de5b4 100644
--- a/bfd/elfcode.h
+++ b/bfd/elfcode.h
@@ -761,10 +761,13 @@ elf_object_p (bfd *abfd)
 	  /* Sanity check sh_link and sh_info.  */
 	  if (i_shdrp[shindex].sh_link >= num_sec)
 	    {
-	      /* PR 10478: Accept sparc binaries with a sh_link
+	      /* PR 10478: Accept Solaris binaries with a sh_link
 		 field set to SHN_BEFORE or SHN_AFTER.  */
 	      switch (ebd->elf_machine_code)
 		{
+		case EM_386:
+		case EM_486:
+		case EM_X86_64:
 		case EM_OLD_SPARCV9:
 		case EM_SPARC32PLUS:
 		case EM_SPARCV9:
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 04e553f296..b059f91e63 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,10 @@
+2009-09-28  Nick Clifton  <nickc@redhat.com>
+
+	PR 10478
+	* readelf.c (get_elf_section_flags): Allow SHN_BEFORE and
+	SHN_AFTER section link values in x86 binaries.
+	(process_section_headers): Likewise.
+
 2009-09-25  Dimitry Gorbachev  <d.g.gorbachev@gmail.com>
 
 	PR 10656
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 9c0982307d..a57b5ad63b 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -3971,6 +3971,9 @@ get_elf_section_flags (bfd_vma sh_flags)
 #endif
 		  break;
 
+		case EM_386:
+		case EM_486:
+		case EM_X86_64:
 		case EM_OLD_SPARCV9:
 		case EM_SPARC32PLUS:
 		case EM_SPARCV9:
@@ -4384,9 +4387,12 @@ process_section_headers (FILE * file)
 	    {
 	      link_too_big = "";
 	      /* The sh_link value is out of range.  Normally this indicates
-		 an error but it can have special values in SPARC binaries.  */
+		 an error but it can have special values in Solaris binaries.  */
 	      switch (elf_header.e_machine)
 		{
+		case EM_386:
+		case EM_486:
+		case EM_X86_64:
 		case EM_OLD_SPARCV9:
 		case EM_SPARC32PLUS:
 		case EM_SPARCV9:
-- 
2.42.0