diff options
Diffstat (limited to 'backends')
| -rw-r--r-- | backends/ChangeLog | 13 | ||||
| -rw-r--r-- | backends/aarch64_init.c | 2 | ||||
| -rw-r--r-- | backends/aarch64_symbol.c | 26 | ||||
| -rw-r--r-- | backends/common-reloc.c | 6 |
4 files changed, 44 insertions, 3 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog index 7d3578b0..ce4c971e 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,16 @@ +2020-08-28 Mark Wielard <mark@klomp.org> + + * aarch64_init.c (aarch64_init): Hook dynamic_tag_name and + dynamic_tag_check. + * aarch64_symbol.c (aarch64_dynamic_tag_name): New function. + (aarch64_dynamic_tag_check): Likewise. + +2020-06-16 Mark Wielard <mark@klomp.org> + + * common-reloc.c (reloc_nametable): Make zero a 1 char array. + Initialize it as an array { '\0' }. + (reloc_type_name): Access zero as an array. + 2020-06-10 Mark Wielard <mark@klomp.org> * aarch64_init.c (aarch64_init): Remove ehlen, return eh. diff --git a/backends/aarch64_init.c b/backends/aarch64_init.c index 66bfae94..bed92954 100644 --- a/backends/aarch64_init.c +++ b/backends/aarch64_init.c @@ -50,6 +50,8 @@ aarch64_init (Elf *elf __attribute__ ((unused)), HOOK (eh, reloc_simple_type); HOOK (eh, return_value_location); HOOK (eh, check_special_symbol); + HOOK (eh, dynamic_tag_name); + HOOK (eh, dynamic_tag_check); HOOK (eh, data_marker_symbol); HOOK (eh, abi_cfi); diff --git a/backends/aarch64_symbol.c b/backends/aarch64_symbol.c index e30c409d..464a5695 100644 --- a/backends/aarch64_symbol.c +++ b/backends/aarch64_symbol.c @@ -106,3 +106,29 @@ aarch64_data_marker_symbol (const GElf_Sym *sym, const char *sname) && GELF_ST_TYPE (sym->st_info) == STT_NOTYPE && (strcmp (sname, "$d") == 0 || strncmp (sname, "$d.", 3) == 0)); } + +const char * +aarch64_dynamic_tag_name (int64_t tag, char *buf __attribute__ ((unused)), + size_t len __attribute__ ((unused))) +{ + switch (tag) + { + 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: + break; + } + return NULL; +} + +bool +aarch64_dynamic_tag_check (int64_t tag) +{ + return (tag == DT_AARCH64_BTI_PLT + || tag == DT_AARCH64_PAC_PLT + || tag == DT_AARCH64_VARIANT_PCS); +} diff --git a/backends/common-reloc.c b/backends/common-reloc.c index 096ed1c7..a91bc87d 100644 --- a/backends/common-reloc.c +++ b/backends/common-reloc.c @@ -45,14 +45,14 @@ static const struct EBLHOOK(reloc_nametable) { - char zero; + char zero[1]; #define RELOC_TYPE(type, uses) \ char name_##type[sizeof R_NAME (type)]; #include RELOC_TYPES #undef RELOC_TYPE } EBLHOOK(reloc_nametable) = { - '\0', + { '\0' }, #define RELOC_TYPE(type, uses) R_NAME (type), #include RELOC_TYPES #undef RELOC_TYPE @@ -92,7 +92,7 @@ EBLHOOK(reloc_type_name) (int reloc, #endif if (reloc >= 0 && reloc < nreloc && EBLHOOK(reloc_nameidx)[reloc] != 0) - return &reloc_namestr[EBLHOOK(reloc_nameidx)[reloc]]; + return reloc_namestr[EBLHOOK(reloc_nameidx)[reloc]]; return NULL; } |
