diff options
author | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2022-07-15 08:15:02 +0100 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2022-08-05 19:45:19 +0100 |
commit | c755eefac5059eef147d3aadccc3eecf8acb3706 (patch) | |
tree | e9cbad0561d2542fb69154a42afe9e7724852875 /sysdeps | |
parent | c779cc818eb15d8e3389827b77185cd102a7c710 (diff) | |
download | glibc-c755eefac5059eef147d3aadccc3eecf8acb3706.tar.gz glibc-c755eefac5059eef147d3aadccc3eecf8acb3706.tar.xz glibc-c755eefac5059eef147d3aadccc3eecf8acb3706.zip |
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')
-rw-r--r-- | sysdeps/generic/ldconfig.h | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/aarch64/dl-cache.h | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/aarch64/ldconfig.h | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/readelflib.c | 9 |
4 files changed, 20 insertions, 1 deletions
diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h index 7cc898db61..5a9e0589d9 100644 --- a/sysdeps/generic/ldconfig.h +++ b/sysdeps/generic/ldconfig.h @@ -45,6 +45,7 @@ #define FLAG_MIPS64_LIBN64_NAN2008 0x0e00 #define FLAG_RISCV_FLOAT_ABI_SOFT 0x0f00 #define FLAG_RISCV_FLOAT_ABI_DOUBLE 0x1000 +#define FLAG_AARCH64_PURECAP 0x1100 /* Name of auxiliary cache. */ #define _PATH_LDCONFIG_AUX_CACHE "/var/cache/ldconfig/aux-cache" diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-cache.h b/sysdeps/unix/sysv/linux/aarch64/dl-cache.h index a35d04bc93..e456d8df30 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 5cbfb32714..29920f7438 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 d4956e2d25..62d4e137c6 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; } |