[22/29,AARCH64] Add support to ldconfig for ILP32 and libilp32
diff mbox

Message ID 1414396793-9005-23-git-send-email-apinski@cavium.com
State New
Headers show

Commit Message

Andrew Pinski Oct. 27, 2014, 7:59 a.m. UTC
This patch adds support to ldconfig for libilp32 which is used by
ILP32.

* sysdeps/generic/ldconfig.h (FLAG_AARCH64_LIB32): New define.
* elf/cache.c (print_entry): Handle FLAG_AARCH64_LIB32.
* sysdeps/unix/sysv/linux/aarch64/dl-cache.h (_DL_CACHE_DEFAULT_ID):
Define it to be the FLAG_AARCH64_LIB32 if compiling for ILP32.
(add_system_dir): Add libilp32 to the list of system directories.
* sysdeps/unix/sysv/linux/arm/readelflib.c (process_elf_file):
Handle ILP32 elf binaries.
---
 elf/cache.c                                |    2 ++
 sysdeps/generic/ldconfig.h                 |    1 +
 sysdeps/unix/sysv/linux/aarch64/dl-cache.h |   13 ++++++++++++-
 sysdeps/unix/sysv/linux/arm/readelflib.c   |    4 +++-
 4 files changed, 18 insertions(+), 2 deletions(-)

Comments

Will Newton Nov. 18, 2014, 2:19 p.m. UTC | #1
On 27 October 2014 07:59, Andrew Pinski <apinski@cavium.com> wrote:
> This patch adds support to ldconfig for libilp32 which is used by
> ILP32.
>
> * sysdeps/generic/ldconfig.h (FLAG_AARCH64_LIB32): New define.
> * elf/cache.c (print_entry): Handle FLAG_AARCH64_LIB32.
> * sysdeps/unix/sysv/linux/aarch64/dl-cache.h (_DL_CACHE_DEFAULT_ID):
> Define it to be the FLAG_AARCH64_LIB32 if compiling for ILP32.
> (add_system_dir): Add libilp32 to the list of system directories.
> * sysdeps/unix/sysv/linux/arm/readelflib.c (process_elf_file):
> Handle ILP32 elf binaries.
> ---
>  elf/cache.c                                |    2 ++
>  sysdeps/generic/ldconfig.h                 |    1 +
>  sysdeps/unix/sysv/linux/aarch64/dl-cache.h |   13 ++++++++++++-
>  sysdeps/unix/sysv/linux/arm/readelflib.c   |    4 +++-
>  4 files changed, 18 insertions(+), 2 deletions(-)

This looks ok to me.

> diff --git a/elf/cache.c b/elf/cache.c
> index 4cbf8d9..267214f 100644
> --- a/elf/cache.c
> +++ b/elf/cache.c
> @@ -101,6 +101,8 @@ print_entry (const char *lib, int flag, unsigned int osversion,
>      case FLAG_AARCH64_LIB64:
>        fputs (",AArch64", stdout);
>        break;
> +    case FLAG_AARCH64_LIB32:
> +      fputs (",ILP32", stdout);
>      /* Uses the ARM soft-float ABI.  */
>      case FLAG_ARM_LIBSF:
>        fputs (",soft-float", stdout);
> diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h
> index ba1d953..1dd8b4e 100644
> --- a/sysdeps/generic/ldconfig.h
> +++ b/sysdeps/generic/ldconfig.h
> @@ -42,6 +42,7 @@
>  #define FLAG_MIPS_LIB32_NAN2008                0x0c00
>  #define FLAG_MIPS64_LIBN32_NAN2008     0x0d00
>  #define FLAG_MIPS64_LIBN64_NAN2008     0x0e00
> +#define FLAG_AARCH64_LIB32             0x0f00
>
>  /* 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 32851d0..930aa20 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
> @@ -18,7 +18,11 @@
>
>  #include <ldconfig.h>
>
> +#ifdef __LP64__
>  #define _DL_CACHE_DEFAULT_ID    (FLAG_AARCH64_LIB64 | FLAG_ELF_LIBC6)
> +#else
> +#define _DL_CACHE_DEFAULT_ID    (FLAG_AARCH64_LIB32 | FLAG_ELF_LIBC6)
> +#endif
>
>  #define _dl_cache_check_flags(flags)                    \
>    ((flags) == _DL_CACHE_DEFAULT_ID)
> @@ -27,18 +31,25 @@
>    do                                                           \
>      {                                                          \
>        size_t len = strlen (dir);                               \
> -      char path[len + 3];                                      \
> +      char path[len + 6];                                      \
>        memcpy (path, dir, len + 1);                             \
>        if (len >= 6 && ! memcmp (path + len - 6, "/lib64", 6))  \
>         {                                                       \
>           len -= 2;                                             \
>           path[len] = '\0';                                     \
>         }                                                       \
> +      if (len >= 9 && ! memcmp (path + len - 9, "/libilp32", 9))\
> +       {                                                       \
> +         len -= 5;                                             \
> +         path[len] = '\0';                                     \
> +       }                                                       \
>        add_dir (path);                                          \
>        if (len >= 4 && ! memcmp (path + len - 4, "/lib", 4))    \
>         {                                                       \
>           memcpy (path + len, "64", 3);                         \
>           add_dir (path);                                       \
> +         memcpy (path + len, "ilp32", 6);                      \
> +         add_dir (path);                                       \
>         }                                                       \
>      } while (0)
>
> diff --git a/sysdeps/unix/sysv/linux/arm/readelflib.c b/sysdeps/unix/sysv/linux/arm/readelflib.c
> index a15ebe4..e255fb0 100644
> --- a/sysdeps/unix/sysv/linux/arm/readelflib.c
> +++ b/sysdeps/unix/sysv/linux/arm/readelflib.c
> @@ -41,7 +41,9 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
>        ret = process_elf32_file (file_name, lib, flag, osversion, soname,
>                                 file_contents, file_length);
>
> -      if (!ret && EF_ARM_EABI_VERSION (elf32_header->e_flags) == EF_ARM_EABI_VER5)
> +      if (!ret && elf_header->e_machine == EM_AARCH64)
> +       *flag = FLAG_AARCH64_LIB32|FLAG_ELF_LIBC6;
> +      else if (!ret && EF_ARM_EABI_VERSION (elf32_header->e_flags) == EF_ARM_EABI_VER5)
>         {
>           if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_HARD)
>             *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;
> --
> 1.7.2.5
>

Patch
diff mbox

diff --git a/elf/cache.c b/elf/cache.c
index 4cbf8d9..267214f 100644
--- a/elf/cache.c
+++ b/elf/cache.c
@@ -101,6 +101,8 @@  print_entry (const char *lib, int flag, unsigned int osversion,
     case FLAG_AARCH64_LIB64:
       fputs (",AArch64", stdout);
       break;
+    case FLAG_AARCH64_LIB32:
+      fputs (",ILP32", stdout);
     /* Uses the ARM soft-float ABI.  */
     case FLAG_ARM_LIBSF:
       fputs (",soft-float", stdout);
diff --git a/sysdeps/generic/ldconfig.h b/sysdeps/generic/ldconfig.h
index ba1d953..1dd8b4e 100644
--- a/sysdeps/generic/ldconfig.h
+++ b/sysdeps/generic/ldconfig.h
@@ -42,6 +42,7 @@ 
 #define FLAG_MIPS_LIB32_NAN2008		0x0c00
 #define FLAG_MIPS64_LIBN32_NAN2008	0x0d00
 #define FLAG_MIPS64_LIBN64_NAN2008	0x0e00
+#define FLAG_AARCH64_LIB32		0x0f00
 
 /* 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 32851d0..930aa20 100644
--- a/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
+++ b/sysdeps/unix/sysv/linux/aarch64/dl-cache.h
@@ -18,7 +18,11 @@ 
 
 #include <ldconfig.h>
 
+#ifdef __LP64__
 #define _DL_CACHE_DEFAULT_ID    (FLAG_AARCH64_LIB64 | FLAG_ELF_LIBC6)
+#else
+#define _DL_CACHE_DEFAULT_ID    (FLAG_AARCH64_LIB32 | FLAG_ELF_LIBC6)
+#endif
 
 #define _dl_cache_check_flags(flags)                    \
   ((flags) == _DL_CACHE_DEFAULT_ID)
@@ -27,18 +31,25 @@ 
   do								\
     {								\
       size_t len = strlen (dir);				\
-      char path[len + 3];					\
+      char path[len + 6];					\
       memcpy (path, dir, len + 1);				\
       if (len >= 6 && ! memcmp (path + len - 6, "/lib64", 6))	\
 	{							\
 	  len -= 2;						\
 	  path[len] = '\0';					\
 	}							\
+      if (len >= 9 && ! memcmp (path + len - 9, "/libilp32", 9))\
+	{							\
+	  len -= 5;						\
+	  path[len] = '\0';					\
+	}							\
       add_dir (path);						\
       if (len >= 4 && ! memcmp (path + len - 4, "/lib", 4))	\
 	{							\
 	  memcpy (path + len, "64", 3);				\
 	  add_dir (path);					\
+	  memcpy (path + len, "ilp32", 6);			\
+	  add_dir (path);					\
 	}							\
     } while (0)
 
diff --git a/sysdeps/unix/sysv/linux/arm/readelflib.c b/sysdeps/unix/sysv/linux/arm/readelflib.c
index a15ebe4..e255fb0 100644
--- a/sysdeps/unix/sysv/linux/arm/readelflib.c
+++ b/sysdeps/unix/sysv/linux/arm/readelflib.c
@@ -41,7 +41,9 @@  process_elf_file (const char *file_name, const char *lib, int *flag,
       ret = process_elf32_file (file_name, lib, flag, osversion, soname,
 				file_contents, file_length);
 
-      if (!ret && EF_ARM_EABI_VERSION (elf32_header->e_flags) == EF_ARM_EABI_VER5)
+      if (!ret && elf_header->e_machine == EM_AARCH64)
+	*flag = FLAG_AARCH64_LIB32|FLAG_ELF_LIBC6;
+      else if (!ret && EF_ARM_EABI_VERSION (elf32_header->e_flags) == EF_ARM_EABI_VER5)
 	{
 	  if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_HARD)
 	    *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;