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.
This commit is contained in:
Szabolcs Nagy
2019-04-25 13:46:01 +01:00
parent 405b5bd86f
commit 2301ed1c9a
4 changed files with 36 additions and 0 deletions

View File

@@ -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;
}
@@ -11101,6 +11102,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)
{
@@ -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;