aboutsummaryrefslogtreecommitdiffstats
path: root/backends
diff options
context:
space:
mode:
Diffstat (limited to 'backends')
-rw-r--r--backends/ChangeLog13
-rw-r--r--backends/aarch64_init.c2
-rw-r--r--backends/aarch64_symbol.c26
-rw-r--r--backends/common-reloc.c6
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;
}