[binutils-gdb] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS

Szabolcs Nagy nsz@sourceware.org
Fri May 24 14:24:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2301ed1c9af1316b4bad3747d2b03f7d44940f87

commit 2301ed1c9af1316b4bad3747d2b03f7d44940f87
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Thu Apr 25 13:46:01 2019 +0100

    aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
    
    The bottom 2 bits of st_other are used for visibility, the top 6 bits are
    de facto reserved for processor specific use.  This patch defines a
    bits to mark function symbols that follow a variant procedure call standard
    with different register usage convention.
    
    A dynamic tag is also defined that marks modules with R_<CLS>_JUMP_SLOT
    relocations referencing symbols marked with STO_AARCH64_VARIANT_PCS.
    This can be used by dynamic linkers that support lazy binding to decide
    what registers need to be preserved during symbol resolution.
    
    binutils/ChangeLog:
    
    	* readelf.c (get_aarch64_dynamic_type): Handle DT_AARCH64_VARIANT_PCS.
    	(get_aarch64_symbol_other): New, handles STO_AARCH64_VARIANT_PCS.
    	(get_symbol_other): Call get_aarch64_symbol_other.
    
    include/ChangeLog:
    
    	* elf/aarch64.h (DT_AARCH64_VARIANT_PCS): Define.
    	(STO_AARCH64_VARIANT_PCS): Define.

Diff:
---
 binutils/ChangeLog    |  6 ++++++
 binutils/readelf.c    | 20 ++++++++++++++++++++
 include/ChangeLog     |  5 +++++
 include/elf/aarch64.h |  5 +++++
 4 files changed, 36 insertions(+)

diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 79bfaee..ef9fa5a 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,9 @@
+2019-05-24  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+	* readelf.c (get_aarch64_dynamic_type): Handle DT_AARCH64_VARIANT_PCS.
+	(get_aarch64_symbol_other): New, handles STO_AARCH64_VARIANT_PCS.
+	(get_symbol_other): Call get_aarch64_symbol_other.
+
 2019-05-24  Alan Modra  <amodra@gmail.com>
 
 	* objdump.c (disassemble_bytes): Set WIDE_OUTPUT in flags.
diff --git a/binutils/readelf.c b/binutils/readelf.c
index 9d28104..23ffd86 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -1810,6 +1810,7 @@ get_aarch64_dynamic_type (unsigned long type)
     {
     case DT_AARCH64_BTI_PLT:  return "AARCH64_BTI_PLT";
     case DT_AARCH64_PAC_PLT:  return "AARCH64_PAC_PLT";
+    case DT_AARCH64_VARIANT_PCS:  return "AARCH64_VARIANT_PCS";
     default:
       return NULL;
     }
@@ -11102,6 +11103,22 @@ get_solaris_symbol_visibility (unsigned int visibility)
 }
 
 static const char *
+get_aarch64_symbol_other (unsigned int other)
+{
+  static char buf[32];
+
+  if (other & STO_AARCH64_VARIANT_PCS)
+    {
+      other &= ~STO_AARCH64_VARIANT_PCS;
+      if (other == 0)
+	return "VARIANT_PCS";
+      snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
+      return buf;
+    }
+  return NULL;
+}
+
+static const char *
 get_mips_symbol_other (unsigned int other)
 {
   switch (other)
@@ -11212,6 +11229,9 @@ get_symbol_other (Filedata * filedata, unsigned int other)
 
   switch (filedata->file_header.e_machine)
     {
+    case EM_AARCH64:
+      result = get_aarch64_symbol_other (other);
+      break;
     case EM_MIPS:
       result = get_mips_symbol_other (other);
       break;
diff --git a/include/ChangeLog b/include/ChangeLog
index 2e84084..4132bfe 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-24  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+	* elf/aarch64.h (DT_AARCH64_VARIANT_PCS): Define.
+	(STO_AARCH64_VARIANT_PCS): Define.
+
 2019-05-24  Alan Modra  <amodra@gmail.com>
 
 	* elf/ppc64.h (R_PPC64_PLTSEQ_NOTOC, R_PPC64_PLTCALL_NOTOC),
diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h
index 4466547..721378a 100644
--- a/include/elf/aarch64.h
+++ b/include/elf/aarch64.h
@@ -38,6 +38,11 @@
 /* Processor specific dynamic array tags.  */
 #define DT_AARCH64_BTI_PLT	(DT_LOPROC + 1)
 #define DT_AARCH64_PAC_PLT	(DT_LOPROC + 3)
+#define DT_AARCH64_VARIANT_PCS	(DT_LOPROC + 5)
+
+/* AArch64-specific values for st_other.  */
+#define STO_AARCH64_VARIANT_PCS	0x80  /* Symbol may follow different call
+					 convention from the base PCS.  */
 
 /* Relocation types.  */



More information about the Binutils-cvs mailing list