aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2022-07-15 08:15:02 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2022-11-22 14:31:25 +0000
commit41965d796f93c63f3756ea59d93a9daaa76388f5 (patch)
tree1e63e12c4fed0cdc9d52a3bf7438bb52afb8d673 /sysdeps/unix
parent3fb3ff7f38f44389b74cc39adcbf398ad4c468fc (diff)
downloadglibc-41965d796f93c63f3756ea59d93a9daaa76388f5.zip
glibc-41965d796f93c63f3756ea59d93a9daaa76388f5.tar.gz
glibc-41965d796f93c63f3756ea59d93a9daaa76388f5.tar.bz2
aarch64: morello: fix ldconfig for purecap abi
Add purecap ld cache flag. Add the purecap ld.so name to known names. Handle lib64c system library paths. And set the purecap abi flag on cache entries.
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/dl-cache.h9
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/ldconfig.h2
-rw-r--r--sysdeps/unix/sysv/linux/arm/readelflib.c9
3 files changed, 19 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-cache.h b/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
index a35d04b..e456d8d 100644
--- a/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
+++ b/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
@@ -20,6 +20,8 @@
#ifdef __LP64__
# define _DL_CACHE_DEFAULT_ID (FLAG_AARCH64_LIB64 | FLAG_ELF_LIBC6)
+#elif defined __CHERI_PURE_CAPABILITY__
+# define _DL_CACHE_DEFAULT_ID (FLAG_AARCH64_PURECAP | FLAG_ELF_LIBC6)
#else
# define _DL_CACHE_DEFAULT_ID (FLAG_AARCH64_LIB32 | FLAG_ELF_LIBC6)
#endif
@@ -38,6 +40,11 @@
len -= 2; \
path[len] = '\0'; \
} \
+ if (len >= 7 && ! memcmp (path + len - 7, "/lib64c", 7)) \
+ { \
+ len -= 3; \
+ path[len] = '\0'; \
+ } \
if (len >= 9 && ! memcmp (path + len - 9, "/libilp32", 9))\
{ \
len -= 5; \
@@ -48,6 +55,8 @@
{ \
memcpy (path + len, "64", 3); \
add_dir (path); \
+ memcpy (path + len, "64c", 4); \
+ add_dir (path); \
memcpy (path + len, "ilp32", 6); \
add_dir (path); \
} \
diff --git a/sysdeps/unix/sysv/linux/aarch64/ldconfig.h b/sysdeps/unix/sysv/linux/aarch64/ldconfig.h
index 5cbfb32..29920f7 100644
--- a/sysdeps/unix/sysv/linux/aarch64/ldconfig.h
+++ b/sysdeps/unix/sysv/linux/aarch64/ldconfig.h
@@ -21,6 +21,8 @@
#define SYSDEP_KNOWN_INTERPRETER_NAMES \
{ "/lib/ld-linux-aarch64.so.1", FLAG_ELF_LIBC6 }, \
{ "/lib/ld-linux-aarch64_be.so.1", FLAG_ELF_LIBC6 }, \
+ { "/lib/ld-linux-aarch64_purecap.so.1", FLAG_ELF_LIBC6 }, \
+ { "/lib/ld-linux-aarch64_be_purecap.so.1", FLAG_ELF_LIBC6 }, \
{ "/lib/ld-linux-aarch64_ilp32.so.1", FLAG_ELF_LIBC6 }, \
{ "/lib/ld-linux-aarch64_be_ilp32.so.1", FLAG_ELF_LIBC6 }, \
{ "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
diff --git a/sysdeps/unix/sysv/linux/arm/readelflib.c b/sysdeps/unix/sysv/linux/arm/readelflib.c
index d4956e2..62d4e13 100644
--- a/sysdeps/unix/sysv/linux/arm/readelflib.c
+++ b/sysdeps/unix/sysv/linux/arm/readelflib.c
@@ -55,11 +55,18 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
}
else
{
+ Elf64_Ehdr *elf64_header = (Elf64_Ehdr *) elf_header;
+
ret = process_elf64_file (file_name, lib, flag, isa_level, soname,
file_contents, file_length);
/* AArch64 libraries are always libc.so.6+. */
if (!ret)
- *flag = FLAG_AARCH64_LIB64|FLAG_ELF_LIBC6;
+ {
+ if (elf64_header->e_flags & EF_AARCH64_CHERI_PURECAP)
+ *flag = FLAG_AARCH64_PURECAP|FLAG_ELF_LIBC6;
+ else
+ *flag = FLAG_AARCH64_LIB64|FLAG_ELF_LIBC6;
+ }
}
return ret;
}