Mark Wielaard 16224b
commit a95c4ad24cf83b2b0273fee73162bf476cebec8f
Mark Wielaard 16224b
Author: Mark Wielaard <mjw@redhat.com>
Mark Wielaard 16224b
Date:   Fri Jul 4 14:30:48 2014 +0200
Mark Wielaard 16224b
Mark Wielaard 16224b
    Add ppc64le ELFv2 abi support to backends and elflint.
Mark Wielaard 16224b
    
Mark Wielaard 16224b
    The big endian vs little endian changes are already handled by detecting
Mark Wielaard 16224b
    the EI_DATA data encoding. And the function descriptors are already not
Mark Wielaard 16224b
    used when we see there is no .opd section. This change adds new checks
Mark Wielaard 16224b
    for st_other bits, new relocations and recognizes DT_PPC64_OPT.
Mark Wielaard 16224b
    
Mark Wielaard 16224b
    Signed-off-by: Menanteau Guy <menantea@linux.vnet.ibm.com>
Mark Wielaard 16224b
    Signed-off-by: Mark Wielaard <mjw@redhat.com>
Mark Wielaard 16224b
Mark Wielaard 16224b
diff --git a/backends/ppc64_init.c b/backends/ppc64_init.c
Mark Wielaard 16224b
index e52231c..7ea2b23 100644
Mark Wielaard 16224b
--- a/backends/ppc64_init.c
Mark Wielaard 16224b
+++ b/backends/ppc64_init.c
Mark Wielaard 16224b
@@ -61,6 +61,7 @@ ppc64_init (elf, machine, eh, ehlen)
Mark Wielaard 16224b
   HOOK (eh, machine_flag_check);
Mark Wielaard 16224b
   HOOK (eh, copy_reloc_p);
Mark Wielaard 16224b
   HOOK (eh, check_special_symbol);
Mark Wielaard 16224b
+  HOOK (eh, check_st_other_bits);
Mark Wielaard 16224b
   HOOK (eh, bss_plt_p);
Mark Wielaard 16224b
   HOOK (eh, return_value_location);
Mark Wielaard 16224b
   HOOK (eh, register_info);
Mark Wielaard 16224b
diff --git a/backends/ppc64_reloc.def b/backends/ppc64_reloc.def
Mark Wielaard 16224b
index 6366f46..3a693cf 100644
Mark Wielaard 16224b
--- a/backends/ppc64_reloc.def
Mark Wielaard 16224b
+++ b/backends/ppc64_reloc.def
Mark Wielaard 16224b
@@ -132,6 +132,21 @@ RELOC_TYPE (DTPREL16_HIGHER,	REL)
Mark Wielaard 16224b
 RELOC_TYPE (DTPREL16_HIGHERA,	REL)
Mark Wielaard 16224b
 RELOC_TYPE (DTPREL16_HIGHEST,	REL)
Mark Wielaard 16224b
 RELOC_TYPE (DTPREL16_HIGHESTA,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (TLSGD,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (TLSLD,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (TOCSAVE,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (ADDR16_HIGH,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (ADDR16_HIGHA,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (TPREL16_HIGH,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (TPREL16_HIGHA,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (DTPREL16_HIGH,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (DTPREL16_HIGHA,	REL)
Mark Wielaard 16224b
+RELOC_TYPE (JMP_IREL,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (IRELATIVE,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (REL16,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (REL16_LO,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (REL16_HI,		REL)
Mark Wielaard 16224b
+RELOC_TYPE (REL16_HA,		REL)
Mark Wielaard 16224b
 
Mark Wielaard 16224b
 /* Notes from Alan Modra:
Mark Wielaard 16224b
 
Mark Wielaard 16224b
diff --git a/backends/ppc64_symbol.c b/backends/ppc64_symbol.c
Mark Wielaard 16224b
index 212d414..5a020d8 100644
Mark Wielaard 16224b
--- a/backends/ppc64_symbol.c
Mark Wielaard 16224b
+++ b/backends/ppc64_symbol.c
Mark Wielaard 16224b
@@ -72,6 +72,8 @@ ppc64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)),
Mark Wielaard 16224b
       return "PPC64_OPD";
Mark Wielaard 16224b
     case DT_PPC64_OPDSZ:
Mark Wielaard 16224b
       return "PPC64_OPDSZ";
Mark Wielaard 16224b
+    case DT_PPC64_OPT:
Mark Wielaard 16224b
+      return "PPC64_OPT";
Mark Wielaard 16224b
     default:
Mark Wielaard 16224b
       break;
Mark Wielaard 16224b
     }
Mark Wielaard 16224b
@@ -84,7 +86,8 @@ ppc64_dynamic_tag_check (int64_t tag)
Mark Wielaard 16224b
 {
Mark Wielaard 16224b
   return (tag == DT_PPC64_GLINK
Mark Wielaard 16224b
 	  || tag == DT_PPC64_OPD
Mark Wielaard 16224b
-	  || tag == DT_PPC64_OPDSZ);
Mark Wielaard 16224b
+	  || tag == DT_PPC64_OPDSZ
Mark Wielaard 16224b
+	  || tag == DT_PPC64_OPT);
Mark Wielaard 16224b
 }
Mark Wielaard 16224b
 
Mark Wielaard 16224b
 
Mark Wielaard 16224b
@@ -120,3 +123,9 @@ ppc64_machine_flag_check (GElf_Word flags)
Mark Wielaard 16224b
 {
Mark Wielaard 16224b
   return flags == 0 || flags == 1 || flags == 2;
Mark Wielaard 16224b
 }
Mark Wielaard 16224b
+
Mark Wielaard 16224b
+bool
Mark Wielaard 16224b
+ppc64_check_st_other_bits (unsigned char st_other)
Mark Wielaard 16224b
+{
Mark Wielaard 16224b
+  return (PPC64_LOCAL_ENTRY_OFFSET (st_other) != 0);
Mark Wielaard 16224b
+}
Mark Wielaard 16224b
diff --git a/src/elflint.c b/src/elflint.c
Mark Wielaard 16224b
index 5568c65..d6a4774 100644
Mark Wielaard 16224b
--- a/src/elflint.c
Mark Wielaard 16224b
+++ b/src/elflint.c
Mark Wielaard 16224b
@@ -799,7 +799,8 @@ section [%2d] '%s': symbol %zu: function in COMMON section is nonsense\n"),
Mark Wielaard 16224b
 				  && strcmp (name, "__fini_array_end") != 0
Mark Wielaard 16224b
 				  && strcmp (name, "__bss_start") != 0
Mark Wielaard 16224b
 				  && strcmp (name, "__bss_start__") != 0
Mark Wielaard 16224b
-				  && strcmp (name, "__TMC_END__") != 0))
Mark Wielaard 16224b
+				  && strcmp (name, "__TMC_END__") != 0
Mark Wielaard 16224b
+				  && strcmp (name, ".TOC.") != 0))
Mark Wielaard 16224b
 			    ERROR (gettext ("\
Mark Wielaard 16224b
 section [%2d] '%s': symbol %zu: st_value out of bounds\n"),
Mark Wielaard 16224b
 				   idx, section_name (ebl, idx), cnt);