aboutsummaryrefslogtreecommitdiff
path: root/binutils/readelf.c
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2019-04-25 13:46:01 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2019-05-24 15:05:57 +0100
commit2301ed1c9af1316b4bad3747d2b03f7d44940f87 (patch)
treed0e4b1ec3ada8b6d28fc4ec5e53df73c46c26b1c /binutils/readelf.c
parent405b5bd86fbcfa9ad5e67e9cdc49dfcdaacf533c (diff)
downloadgdb-2301ed1c9af1316b4bad3747d2b03f7d44940f87.zip
gdb-2301ed1c9af1316b4bad3747d2b03f7d44940f87.tar.gz
gdb-2301ed1c9af1316b4bad3747d2b03f7d44940f87.tar.bz2
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.
Diffstat (limited to 'binutils/readelf.c')
-rw-r--r--binutils/readelf.c20
1 files changed, 20 insertions, 0 deletions
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;