public inbox for libc-ports@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache
@ 2012-12-03 15:35 Steve McIntyre
  2012-12-03 15:38 ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag " Steve McIntyre
                   ` (2 more replies)
  0 siblings, 3 replies; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 15:35 UTC (permalink / raw)
  To: libc-ports; +Cc: Carlos O'Donell, Joseph S. Myers, Marcus Shawcroft

Splitting up code as requested. Here's patch #1 for ARM. Identical to
the similar code I just posted for AArch64, so I'd suggest using
#include in AArch64 to pull in the ARM version if you're happy with
that.

==============================
Tag ARM and AArch64 binaries in the ldconfig cache

	* sysdeps/unix/sysv/linux/arm/readelflib.c: New file.

Add the correct tags for ARM and AArch64 libraries in the ldconfig
cache for ARM.

Signed-off-by: Steve McIntyre <steve.mcintyre@linaro.org>
---
 ports/sysdeps/unix/sysv/linux/arm/readelflib.c |   73 ++++++++++++++++++++++++
 1 file changed, 73 insertions(+)
 create mode 100644 ports/sysdeps/unix/sysv/linux/arm/readelflib.c

diff --git a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
new file mode 100644
index 0000000..e4ba2b0
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 1999-2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Jaeger <aj@suse.de>, 1999 and
+		  Jakub Jelinek <jakub@redhat.com>, 1999.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+int process_elf32_file (const char *file_name, const char *lib, int *flag,
+			unsigned int *osversion, char **soname,
+			void *file_contents, size_t file_length);
+int process_elf64_file (const char *file_name, const char *lib, int *flag,
+			unsigned int *osversion, char **soname,
+			void *file_contents, size_t file_length);
+
+/* Returns 0 if everything is ok, != 0 in case of error.  */
+int
+process_elf_file (const char *file_name, const char *lib, int *flag,
+		  unsigned int *osversion, char **soname, void *file_contents,
+		  size_t file_length)
+{
+  ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents;
+  int ret;
+
+  if (elf_header->e_ident [EI_CLASS] == ELFCLASS32)
+    {
+      Elf32_Ehdr *elf32_header = (Elf32_Ehdr *) elf_header;
+
+      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 (elf32_header->e_flags & EF_ARM_ABI_FLOAT_HARD)
+	    *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;
+	  else if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_SOFT)
+	    *flag = FLAG_ELF_LIBC6;
+	}
+    }
+  else
+    {
+      ret = process_elf64_file (file_name, lib, flag, osversion, soname,
+				file_contents, file_length);
+      /* AArch64 libraries are always libc.so.6+.  */
+      if (!ret)
+	*flag = FLAG_AARCH64_LIB64|FLAG_ELF_LIBC6;
+    }
+  return ret;
+}
+
+#undef __ELF_NATIVE_CLASS
+#undef process_elf_file
+#define process_elf_file process_elf32_file
+#define __ELF_NATIVE_CLASS 32
+#include "elf/readelflib.c"
+
+#undef __ELF_NATIVE_CLASS
+#undef process_elf_file
+#define process_elf_file process_elf64_file
+#define __ELF_NATIVE_CLASS 64
+#include "elf/readelflib.c"
-- 
1.7.10.4



Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache
  2012-12-03 15:35 [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Steve McIntyre
@ 2012-12-03 15:38 ` Steve McIntyre
  2012-12-03 15:42   ` [PATCH] ARM: Identify the hard-float ABI in older ARM binaries Steve McIntyre
  2012-12-03 15:59   ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache Joseph S. Myers
  2012-12-03 15:44 ` [PATCH] ARM: Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6 Steve McIntyre
  2012-12-03 15:58 ` [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Joseph S. Myers
  2 siblings, 2 replies; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 15:38 UTC (permalink / raw)
  To: libc-ports; +Cc: Carlos O'Donell, Joseph S. Myers, Marcus Shawcroft

This will need to be applied along with the previous patch to
readelflib.c so that the output from ldconfig is kept in sync with
what ld.so expects.

==============================
Check for the FLAG_ARM_LIBHF flag in the ldconfig cache

	* sysdeps/unix/sysv/linux/arm/dl-cache.h: New file.

Signed-off-by: Steve McIntyre <steve.mcintyre@linaro.org>
---
 ports/sysdeps/unix/sysv/linux/arm/dl-cache.h |   29 ++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 ports/sysdeps/unix/sysv/linux/arm/dl-cache.h

diff --git a/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
new file mode 100644
index 0000000..0be68be
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
@@ -0,0 +1,29 @@
+/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
+   Copyright (C) 2003-2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <ldconfig.h>
+
+#ifdef __ARM_PCS_VFP
+#define _dl_cache_check_flags(flags) \
+  ((flags) == (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6))
+#else
+#define _dl_cache_check_flags(flags) \
+  ((flags) == FLAG_ELF_LIBC6)
+#endif
+
+#include_next <dl-cache.h>
-- 
1.7.10.4



Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 15:38 ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag " Steve McIntyre
@ 2012-12-03 15:42   ` Steve McIntyre
  2012-12-03 16:00     ` Joseph S. Myers
  2012-12-03 15:59   ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache Joseph S. Myers
  1 sibling, 1 reply; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 15:42 UTC (permalink / raw)
  To: libc-ports; +Cc: Carlos O'Donell, Joseph S. Myers, Marcus Shawcroft

Hi,

I expect this one to be more controversial and I'll understand if
people don't want to accept it! It's a variation on the code that's in
use today in Debian/Ubuntu to be able to distinguish between soft- and
hard-float ABI libraries. In time, the new ELF flags will make this
obsolete. Until that time, this adds a fallback for older binaries
created before those flags went into binutils.

==============================
Identify the hard-float ABI in older ARM binaries

	* ports/sysdeps/unix/sysv/linux/arm/readelflib.c (read_uleb128):
	New function.
	(is_library_hf): Ditto.
	(process_elf_file): Call is_library_hf() to detect HF ABI if
	we don't have clear evidence from the ELF flags.

Signed-off-by: Steve McIntyre <steve.mcintyre@linaro.org>
---
 ports/sysdeps/unix/sysv/linux/arm/readelflib.c |  129 ++++++++++++++++++++++++
 1 file changed, 129 insertions(+)

diff --git a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
index e4ba2b0..0287644 100644
--- a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
+++ b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
@@ -25,6 +25,133 @@ int process_elf64_file (const char *file_name, const char *lib, int *flag,
 			unsigned int *osversion, char **soname,
 			void *file_contents, size_t file_length);
 
+#undef __ELF_NATIVE_CLASS
+#define __ELF_NATIVE_CLASS 32
+
+/* Read an unsigned leb128 value from P, store the value in VAL, return
+   P incremented past the value.  We assume that a word is large enough to
+   hold any value so encoded; if it is smaller than a pointer on some target,
+   pointers should not be leb128 encoded on that target.  */
+static const unsigned char *
+read_uleb128 (const unsigned char *p, unsigned long *val)
+{
+  unsigned int shift = 0;
+  unsigned char byte;
+  unsigned long result;
+
+  result = 0;
+  do
+    {
+      byte = *p++;
+      result |= (byte & 0x7f) << shift;
+      shift += 7;
+    }
+  while (byte & 0x80);
+
+  *val = result;
+  return p;
+}
+
+#define ATTR_TAG_FILE          1
+#define ABI_VFP_args          28
+#define VFP_ARGS_IN_VFP_REGS   1
+
+/* Check the ABI in the ARM attributes. Search through the section
+   headers looking for the ARM attributes section, then check the
+   VFP_ARGS attribute. */
+static int is_library_hf(const char *file_name, void *file_contents, size_t file_length)
+{
+  unsigned int i;
+  ElfW(Ehdr) *ehdr = (ElfW(Ehdr) *) file_contents;
+  ElfW(Shdr) *shdrs;
+
+  shdrs = file_contents + ehdr->e_shoff;
+  for (i = 0; i < ehdr->e_shnum; i++)
+    {
+      if (SHT_ARM_ATTRIBUTES == shdrs[i].sh_type)
+	{
+          /* We've found a likely section. Load the contents and
+           * check the tags */
+	  unsigned char *p = (unsigned char *)file_contents + shdrs[i].sh_offset;
+	  unsigned char * end;
+
+	  /* Sanity-check the attribute section details. Make sure
+	   * that it's the "aeabi" section, that's all we care
+	   * about. */
+	  if (*p == 'A')
+	    {
+	      unsigned long len = shdrs[i].sh_size - 1;
+	      unsigned long namelen;
+	      p++;
+
+	      while (len > 0)
+		{
+		  unsigned long section_len = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
+		  if (section_len > len)
+		    section_len = len;
+
+		  p += 4;
+		  len -= section_len;
+		  section_len -= 4;
+
+		  if (0 != strcmp((char *)p, "aeabi"))
+		    {
+		      p += section_len;
+		      continue;
+		    }
+		  namelen = strlen((char *)p) + 1;
+		  p += namelen;
+		  section_len -= namelen;
+
+		  /* We're in a valid section. Walk through this
+		   * section looking for the tag we care about
+		   * (ABI_VFP_args) */
+		  while (section_len > 0)
+                    {
+		      unsigned long tag, val = 0;
+		      unsigned long size;
+
+		      end = p;
+		      tag = (*p++);
+		      size = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
+		      if (size > section_len)
+			size = section_len;
+		      p += 4;
+
+		      section_len -= size;
+		      end += size;
+		      if (ATTR_TAG_FILE != tag)
+			{
+			  /* ignore, we don't care */
+			  p = end;
+			  continue;
+			}
+		      while (p < end)
+		        {
+			  p = read_uleb128 (p, &tag);
+			  /* Handle the different types of tag. */
+			  if ( (tag == 4) || (tag == 5) || (tag == 67) )
+			    {
+			      /* Special cases for string values */
+			      namelen = strlen((char *)p) + 1;
+			      p += namelen;
+                            }
+			  else
+			    {
+			      p = read_uleb128 (p, &val);
+                            }
+			  if ( (tag == ABI_VFP_args) && (val == VFP_ARGS_IN_VFP_REGS) )
+			    return 1;
+                        }
+                    }
+                }
+            }
+        }
+    }
+  return 0;
+}
+
+
 /* Returns 0 if everything is ok, != 0 in case of error.  */
 int
 process_elf_file (const char *file_name, const char *lib, int *flag,
@@ -47,6 +174,8 @@ process_elf_file (const char *file_name, const char *lib, int *flag,
 	    *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;
 	  else if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_SOFT)
 	    *flag = FLAG_ELF_LIBC6;
+	  else if (is_library_hf(file_name, file_contents, file_length))
+	    *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;
 	}
     }
   else
-- 
1.7.10.4



Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH] ARM: Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6
  2012-12-03 15:35 [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Steve McIntyre
  2012-12-03 15:38 ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag " Steve McIntyre
@ 2012-12-03 15:44 ` Steve McIntyre
  2012-12-03 16:00   ` Joseph S. Myers
  2012-12-03 15:58 ` [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Joseph S. Myers
  2 siblings, 1 reply; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 15:44 UTC (permalink / raw)
  To: libc-ports; +Cc: Carlos O'Donell, Joseph S. Myers, Marcus Shawcroft

Final patch for ARM...

==============================
Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6

	* sysdeps/unix/sysv/linux/arm/ldconfig.h: New file.

Signed-off-by: Steve McIntyre <steve.mcintyre@linaro.org>
---
 ports/sysdeps/unix/sysv/linux/arm/ldconfig.h |   25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 ports/sysdeps/unix/sysv/linux/arm/ldconfig.h

diff --git a/ports/sysdeps/unix/sysv/linux/arm/ldconfig.h b/ports/sysdeps/unix/sysv/linux/arm/ldconfig.h
new file mode 100644
index 0000000..bb20b79
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/arm/ldconfig.h
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/generic/ldconfig.h>
+
+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
+  { "/lib/ld-linux.so.3", FLAG_ELF_LIBC6 }, \
+  { "/lib/ld-linux-armhf.so.3", FLAG_ELF_LIBC6 },
+#define SYSDEP_KNOWN_LIBRARY_NAMES \
+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
+  { "libm.so.6", FLAG_ELF_LIBC6 },
-- 
1.7.10.4


Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache
  2012-12-03 15:35 [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Steve McIntyre
  2012-12-03 15:38 ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag " Steve McIntyre
  2012-12-03 15:44 ` [PATCH] ARM: Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6 Steve McIntyre
@ 2012-12-03 15:58 ` Joseph S. Myers
  2012-12-03 16:31   ` Steve McIntyre
  2 siblings, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2012-12-03 15:58 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, 3 Dec 2012, Steve McIntyre wrote:

> +      if (!ret && EF_ARM_EABI_VERSION(elf32_header->e_flags) == EF_ARM_EABI_VER5)

Missing space before open parenthesis.  OK with that fixed.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache
  2012-12-03 15:38 ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag " Steve McIntyre
  2012-12-03 15:42   ` [PATCH] ARM: Identify the hard-float ABI in older ARM binaries Steve McIntyre
@ 2012-12-03 15:59   ` Joseph S. Myers
  2012-12-03 16:32     ` Steve McIntyre
  1 sibling, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2012-12-03 15:59 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, 3 Dec 2012, Steve McIntyre wrote:

> +#ifdef __ARM_PCS_VFP
> +#define _dl_cache_check_flags(flags) \
> +  ((flags) == (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6))
> +#else
> +#define _dl_cache_check_flags(flags) \
> +  ((flags) == FLAG_ELF_LIBC6)
> +#endif

Missing indentation, "# define", inside #if.  OK with that fixed.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 15:42   ` [PATCH] ARM: Identify the hard-float ABI in older ARM binaries Steve McIntyre
@ 2012-12-03 16:00     ` Joseph S. Myers
  2012-12-03 16:44       ` Steve McIntyre
  0 siblings, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2012-12-03 16:00 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, 3 Dec 2012, Steve McIntyre wrote:

> Hi,
> 
> I expect this one to be more controversial and I'll understand if
> people don't want to accept it! It's a variation on the code that's in
> use today in Debian/Ubuntu to be able to distinguish between soft- and
> hard-float ABI libraries. In time, the new ELF flags will make this
> obsolete. Until that time, this adds a fallback for older binaries
> created before those flags went into binutils.

As previously explained, it's not appropriate for the dynamic linker to 
examine the section view of the ELF file this way; the use of ELF header 
flags is the right approach.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6
  2012-12-03 15:44 ` [PATCH] ARM: Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6 Steve McIntyre
@ 2012-12-03 16:00   ` Joseph S. Myers
  0 siblings, 0 replies; 17+ messages in thread
From: Joseph S. Myers @ 2012-12-03 16:00 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, 3 Dec 2012, Steve McIntyre wrote:

> Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6
> 
> 	* sysdeps/unix/sysv/linux/arm/ldconfig.h: New file.

OK.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache
  2012-12-03 15:58 ` [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Joseph S. Myers
@ 2012-12-03 16:31   ` Steve McIntyre
  2013-01-09  2:14     ` Joseph S. Myers
  0 siblings, 1 reply; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 16:31 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, Dec 03, 2012 at 03:58:09PM +0000, Joseph S. Myers wrote:
>On Mon, 3 Dec 2012, Steve McIntyre wrote:
>
>> +      if (!ret && EF_ARM_EABI_VERSION(elf32_header->e_flags) == EF_ARM_EABI_VER5)
>
>Missing space before open parenthesis.  OK with that fixed.

Cool. Updated:

===============================

Tag ARM and AArch64 binaries in the ldconfig cache

	* sysdeps/unix/sysv/linux/arm/readelflib.c: New file.

Add the correct tags for ARM and AArch64 libraries in the ldconfig
cache for ARM.

Signed-off-by: Steve McIntyre <steve.mcintyre@linaro.org>
---
 ports/sysdeps/unix/sysv/linux/arm/readelflib.c |   73 ++++++++++++++++++++++++
 1 file changed, 73 insertions(+)
 create mode 100644 ports/sysdeps/unix/sysv/linux/arm/readelflib.c

diff --git a/ports/sysdeps/unix/sysv/linux/arm/readelflib.c b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
new file mode 100644
index 0000000..e4ba2b0
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/arm/readelflib.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 1999-2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Jaeger <aj@suse.de>, 1999 and
+		  Jakub Jelinek <jakub@redhat.com>, 1999.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+
+int process_elf32_file (const char *file_name, const char *lib, int *flag,
+			unsigned int *osversion, char **soname,
+			void *file_contents, size_t file_length);
+int process_elf64_file (const char *file_name, const char *lib, int *flag,
+			unsigned int *osversion, char **soname,
+			void *file_contents, size_t file_length);
+
+/* Returns 0 if everything is ok, != 0 in case of error.  */
+int
+process_elf_file (const char *file_name, const char *lib, int *flag,
+		  unsigned int *osversion, char **soname, void *file_contents,
+		  size_t file_length)
+{
+  ElfW(Ehdr) *elf_header = (ElfW(Ehdr) *) file_contents;
+  int ret;
+
+  if (elf_header->e_ident [EI_CLASS] == ELFCLASS32)
+    {
+      Elf32_Ehdr *elf32_header = (Elf32_Ehdr *) elf_header;
+
+      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 (elf32_header->e_flags & EF_ARM_ABI_FLOAT_HARD)
+	    *flag = FLAG_ARM_LIBHF|FLAG_ELF_LIBC6;
+	  else if (elf32_header->e_flags & EF_ARM_ABI_FLOAT_SOFT)
+	    *flag = FLAG_ELF_LIBC6;
+	}
+    }
+  else
+    {
+      ret = process_elf64_file (file_name, lib, flag, osversion, soname,
+				file_contents, file_length);
+      /* AArch64 libraries are always libc.so.6+.  */
+      if (!ret)
+	*flag = FLAG_AARCH64_LIB64|FLAG_ELF_LIBC6;
+    }
+  return ret;
+}
+
+#undef __ELF_NATIVE_CLASS
+#undef process_elf_file
+#define process_elf_file process_elf32_file
+#define __ELF_NATIVE_CLASS 32
+#include "elf/readelflib.c"
+
+#undef __ELF_NATIVE_CLASS
+#undef process_elf_file
+#define process_elf_file process_elf64_file
+#define __ELF_NATIVE_CLASS 64
+#include "elf/readelflib.c"
-- 
1.7.10.4



Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache
  2012-12-03 15:59   ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache Joseph S. Myers
@ 2012-12-03 16:32     ` Steve McIntyre
  0 siblings, 0 replies; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 16:32 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, Dec 03, 2012 at 03:58:52PM +0000, Joseph S. Myers wrote:
>On Mon, 3 Dec 2012, Steve McIntyre wrote:
>
>> +#ifdef __ARM_PCS_VFP
>> +#define _dl_cache_check_flags(flags) \
>> +  ((flags) == (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6))
>> +#else
>> +#define _dl_cache_check_flags(flags) \
>> +  ((flags) == FLAG_ELF_LIBC6)
>> +#endif
>
>Missing indentation, "# define", inside #if.  OK with that fixed.

OK, updated:

=================================================
Check for the FLAG_ARM_LIBHF flag in the ldconfig cache

	* sysdeps/unix/sysv/linux/arm/dl-cache.h: New file.

Signed-off-by: Steve McIntyre <steve.mcintyre@linaro.org>
---
 ports/sysdeps/unix/sysv/linux/arm/dl-cache.h |   29 ++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 ports/sysdeps/unix/sysv/linux/arm/dl-cache.h

diff --git a/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
new file mode 100644
index 0000000..0be68be
--- /dev/null
+++ b/ports/sysdeps/unix/sysv/linux/arm/dl-cache.h
@@ -0,0 +1,29 @@
+/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
+   Copyright (C) 2003-2012 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <ldconfig.h>
+
+#ifdef __ARM_PCS_VFP
+# define _dl_cache_check_flags(flags) \
+  ((flags) == (FLAG_ARM_LIBHF | FLAG_ELF_LIBC6))
+#else
+# define _dl_cache_check_flags(flags) \
+  ((flags) == FLAG_ELF_LIBC6)
+#endif
+
+#include_next <dl-cache.h>
-- 
1.7.10.4



Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 16:00     ` Joseph S. Myers
@ 2012-12-03 16:44       ` Steve McIntyre
  2012-12-03 16:49         ` Joseph S. Myers
  0 siblings, 1 reply; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 16:44 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

Hi Joseph,

On Mon, Dec 03, 2012 at 04:00:21PM +0000, Joseph S. Myers wrote:
>On Mon, 3 Dec 2012, Steve McIntyre wrote:
>
>> Hi,
>> 
>> I expect this one to be more controversial and I'll understand if
>> people don't want to accept it! It's a variation on the code that's in
>> use today in Debian/Ubuntu to be able to distinguish between soft- and
>> hard-float ABI libraries. In time, the new ELF flags will make this
>> obsolete. Until that time, this adds a fallback for older binaries
>> created before those flags went into binutils.
>
>As previously explained, it's not appropriate for the dynamic linker to 
>examine the section view of the ELF file this way; the use of ELF header 
>flags is the right approach.

Does that apply to ldconfig as well as ld.so?

Again, I understand if people don't like this ugly approach; it's just
a fallback that will end up being used in Debian/Ubuntu anyway, and
may be helpful in other places where there are lots of pre-flag
hard-float binaries.

Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 16:44       ` Steve McIntyre
@ 2012-12-03 16:49         ` Joseph S. Myers
  2012-12-03 16:54           ` Steve McIntyre
  0 siblings, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2012-12-03 16:49 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, 3 Dec 2012, Steve McIntyre wrote:

> >As previously explained, it's not appropriate for the dynamic linker to 
> >examine the section view of the ELF file this way; the use of ELF header 
> >flags is the right approach.
> 
> Does that apply to ldconfig as well as ld.so?

I think so, yes; I'm not aware of any existing use of the section view of 
the file in ldconfig, although efficiency issues don't really apply there.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 16:49         ` Joseph S. Myers
@ 2012-12-03 16:54           ` Steve McIntyre
  2012-12-03 16:59             ` Joseph S. Myers
  0 siblings, 1 reply; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 16:54 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, Dec 03, 2012 at 04:49:06PM +0000, Joseph S. Myers wrote:
>On Mon, 3 Dec 2012, Steve McIntyre wrote:
>
>> >As previously explained, it's not appropriate for the dynamic linker to 
>> >examine the section view of the ELF file this way; the use of ELF header 
>> >flags is the right approach.
>> 
>> Does that apply to ldconfig as well as ld.so?
>
>I think so, yes; I'm not aware of any existing use of the section view of 
>the file in ldconfig, although efficiency issues don't really apply there.

OK... So is there a good reason not to do this beyond "we've not done
this before", then?

(*not* trying to argue, but some clarity here would be appreciated!)

Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 16:54           ` Steve McIntyre
@ 2012-12-03 16:59             ` Joseph S. Myers
  2012-12-03 17:11               ` Steve McIntyre
  0 siblings, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2012-12-03 16:59 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, 3 Dec 2012, Steve McIntyre wrote:

> On Mon, Dec 03, 2012 at 04:49:06PM +0000, Joseph S. Myers wrote:
> >On Mon, 3 Dec 2012, Steve McIntyre wrote:
> >
> >> >As previously explained, it's not appropriate for the dynamic linker to 
> >> >examine the section view of the ELF file this way; the use of ELF header 
> >> >flags is the right approach.
> >> 
> >> Does that apply to ldconfig as well as ld.so?
> >
> >I think so, yes; I'm not aware of any existing use of the section view of 
> >the file in ldconfig, although efficiency issues don't really apply there.
> 
> OK... So is there a good reason not to do this beyond "we've not done
> this before", then?

ldconfig, like the dynamic linker, is logically about the execution time 
(segment) view of a program / shared library, rather than the static-link 
time (section) view.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Identify the hard-float ABI in older ARM binaries
  2012-12-03 16:59             ` Joseph S. Myers
@ 2012-12-03 17:11               ` Steve McIntyre
  0 siblings, 0 replies; 17+ messages in thread
From: Steve McIntyre @ 2012-12-03 17:11 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Mon, Dec 03, 2012 at 04:59:02PM +0000, Joseph S. Myers wrote:
>On Mon, 3 Dec 2012, Steve McIntyre wrote:
>
>> On Mon, Dec 03, 2012 at 04:49:06PM +0000, Joseph S. Myers wrote:
>> >On Mon, 3 Dec 2012, Steve McIntyre wrote:
>> >
>> >> >As previously explained, it's not appropriate for the dynamic linker to 
>> >> >examine the section view of the ELF file this way; the use of ELF header 
>> >> >flags is the right approach.
>> >> 
>> >> Does that apply to ldconfig as well as ld.so?
>> >
>> >I think so, yes; I'm not aware of any existing use of the section view of 
>> >the file in ldconfig, although efficiency issues don't really apply there.
>> 
>> OK... So is there a good reason not to do this beyond "we've not done
>> this before", then?
>
>ldconfig, like the dynamic linker, is logically about the execution time 
>(segment) view of a program / shared library, rather than the static-link 
>time (section) view.

OK, fair enough - thanks.

Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache
  2012-12-03 16:31   ` Steve McIntyre
@ 2013-01-09  2:14     ` Joseph S. Myers
  2013-01-09 13:50       ` Steve McIntyre
  0 siblings, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2013-01-09  2:14 UTC (permalink / raw)
  To: Steve McIntyre; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

Steve, you'll want to look at bug 15006 which appears likely to be related 
to the changes for hard-float binary handling, but you don't appear to 
have a Bugzilla account to CC there....

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache
  2013-01-09  2:14     ` Joseph S. Myers
@ 2013-01-09 13:50       ` Steve McIntyre
  0 siblings, 0 replies; 17+ messages in thread
From: Steve McIntyre @ 2013-01-09 13:50 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: libc-ports, Carlos O'Donell, Marcus Shawcroft

On Wed, Jan 09, 2013 at 02:14:11AM +0000, Joseph S. Myers wrote:
>Steve, you'll want to look at bug 15006 which appears likely to be related 
>to the changes for hard-float binary handling, but you don't appear to 
>have a Bugzilla account to CC there....

Hi Joseph,

Thanks for the heads-up, looking now.

Cheers,
-- 
Steve McIntyre                                steve.mcintyre@linaro.org
<http://www.linaro.org/> Linaro.org | Open source software for ARM SoCs

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2013-01-09 13:50 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-03 15:35 [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Steve McIntyre
2012-12-03 15:38 ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag " Steve McIntyre
2012-12-03 15:42   ` [PATCH] ARM: Identify the hard-float ABI in older ARM binaries Steve McIntyre
2012-12-03 16:00     ` Joseph S. Myers
2012-12-03 16:44       ` Steve McIntyre
2012-12-03 16:49         ` Joseph S. Myers
2012-12-03 16:54           ` Steve McIntyre
2012-12-03 16:59             ` Joseph S. Myers
2012-12-03 17:11               ` Steve McIntyre
2012-12-03 15:59   ` [PATCH] ARM: Check for the FLAG_ARM_LIBHF flag in the ldconfig cache Joseph S. Myers
2012-12-03 16:32     ` Steve McIntyre
2012-12-03 15:44 ` [PATCH] ARM: Tag ARM libc6-dependent binaries with FLAG_ELF_LIBC6 Steve McIntyre
2012-12-03 16:00   ` Joseph S. Myers
2012-12-03 15:58 ` [PATCH] ARM: Tag ARM and AArch64 binaries in the ldconfig cache Joseph S. Myers
2012-12-03 16:31   ` Steve McIntyre
2013-01-09  2:14     ` Joseph S. Myers
2013-01-09 13:50       ` Steve McIntyre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).