diff --git a/binutils/readelf.c b/binutils/readelf.c index c31a5c1266..0e8b27bcfe 100644 --- a/binutils/readelf.c +++ b/binutils/readelf.c @@ -1804,6 +1804,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; } @@ -11095,6 +11096,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) { @@ -11206,6 +11223,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/elf/aarch64.h b/include/elf/aarch64.h index 4466547626..721378abf8 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. */