diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2019-04-25 13:46:01 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2019-05-24 15:05:57 +0100 |
commit | 2301ed1c9af1316b4bad3747d2b03f7d44940f87 (patch) | |
tree | d0e4b1ec3ada8b6d28fc4ec5e53df73c46c26b1c | |
parent | 405b5bd86fbcfa9ad5e67e9cdc49dfcdaacf533c (diff) | |
download | gdb-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.
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/readelf.c | 20 | ||||
-rw-r--r-- | include/ChangeLog | 5 | ||||
-rw-r--r-- | include/elf/aarch64.h | 5 |
4 files changed, 36 insertions, 0 deletions
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. */ |