]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
aarch64: morello: fix ldconfig for purecap abi
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 15 Jul 2022 07:15:02 +0000 (08:15 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 27 Oct 2022 13:46:53 +0000 (14:46 +0100)
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.

elf/cache.c
sysdeps/generic/ldconfig.h
sysdeps/unix/sysv/linux/aarch64/dl-cache.h
sysdeps/unix/sysv/linux/aarch64/ldconfig.h
sysdeps/unix/sysv/linux/arm/readelflib.c

index 3d7d3a67bf4e6d2d171f985951f5874cd47f362d..664ca6ac3983bd18bb8d358da04a8ec008f4e07a 100644 (file)
@@ -210,6 +210,9 @@ print_entry (const char *lib, int flag, uint64_t hwcap,
     case FLAG_AARCH64_LIB64:
       fputs (",AArch64", stdout);
       break;
+    case FLAG_AARCH64_PURECAP:
+      fputs (",purecap", stdout);
+      break;
     /* Uses the ARM soft-float ABI.  */
     case FLAG_ARM_LIBSF:
       fputs (",soft-float", stdout);
index 7cc898db6156127cba5c9a6744fcad2fd043cc49..5a9e0589d9a6255e2de7dbf3cfadf5d417463192 100644 (file)
@@ -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"
index a35d04bc930ecbda3cf0529ce1741cc16c5ab6d8..e456d8df300a520cde388da461d4c2190f1a051c 100644 (file)
@@ -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
          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);                                       \
        }                                                       \
index 5cbfb327141dd256d9a8776db94b146ebb4737d1..29920f743822732143fa90a1bfec131d5a98c5ac 100644 (file)
@@ -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 }, \
index d4956e2d254dd82dd8f21d7081deac1b1b271851..62d4e137c693e249484050ec7fcc820514f20f02 100644 (file)
@@ -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;
 }