[PATCH,HURD] Recognize GNU/Hurd-specific binaries

Samuel Thibault samuel.thibault@gnu.org
Sun Jul 3 20:31:00 GMT 2011


Roland McGrath, le Sun 19 Jun 2011 11:46:20 -0700, a écrit :
> > Ok, so I guess we should request binutils to rename the LINUX one into
> > ELFOSABI_GNU and drop the HURD one?
> 
> That seems appropriate to me.

Ok, here is an updated patch for the libc part.

Samuel


binutils started emitting ELF files with ELFOSABI_GNU due to GNU-specific
ELF extensions. We need to accept loading such binaries on hurd-i386 too.

2011-06-19  Samuel Thibault  <samuel.thibault@ens-lyon.org>

	* elf/elf.h (ELFOSABI_GNU): Define macro.
	(ELFOSABI_LINUX): Comment that it is just an alias for ELFOSABI_GNU.
        * sysdeps/mach/hurd/ldsodefs.h: New file, defines VALID_ELF_HEADER,
        VALID_ELF_OSABI, VALID_ELF_ABIVERSION, MORE_ELF_HEADER_DATA, declares
        _dl_non_dynamic_init.
        * sysdeps/unix/sysv/linux/ldsodefs.h (VALID_ELF_OSABI,
        VALID_ELF_ABIVERSION, MORE_ELF_HEADER_DATA): Use ELFOSABI_GNU instead of
        ELFOSABI_LINUX.
        * sysdeps/mach/hurd/powerpc/init-first.c (_dl_non_dynamic_init): Remove
        declaration.
	* sysdeps/mach/hurd/i386/init-first.c (_dl_non_dynamic_init): Likewise.

diff --git a/elf/elf.h b/elf/elf.h
index acb7762..cad15cd 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -142,7 +142,8 @@ typedef struct
 #define ELFOSABI_SYSV		0	/* Alias.  */
 #define ELFOSABI_HPUX		1	/* HP-UX */
 #define ELFOSABI_NETBSD		2	/* NetBSD.  */
-#define ELFOSABI_LINUX		3	/* Linux.  */
+#define ELFOSABI_GNU		3	/* GNU.  */
+#define ELFOSABI_LINUX		3	/* Alias for ELFOSABI_GNU.  */
 #define ELFOSABI_SOLARIS	6	/* Sun Solaris.  */
 #define ELFOSABI_AIX		7	/* IBM AIX.  */
 #define ELFOSABI_IRIX		8	/* SGI Irix.  */
diff --git a/sysdeps/mach/hurd/ldsodefs.h b/sysdeps/mach/hurd/ldsodefs.h
index e69de29..56e4b03 100644
--- a/sysdeps/mach/hurd/ldsodefs.h
+++ b/sysdeps/mach/hurd/ldsodefs.h
@@ -0,0 +1,52 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+   Copyright (C) 2001, 2002, 2003, 2006, 2009, 2010, 2011 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef	_LDSODEFS_H
+
+#include <libc-abis.h>
+
+/* Get the real definitions.  */
+#include_next <ldsodefs.h>
+
+/* Now define our stuff.  */
+
+/* Initialization which is normally done by the dynamic linker.  */
+extern void _dl_non_dynamic_init (void) internal_function;
+
+/* Accept binaries which identify the binary as using Linux extensions.  */
+#define VALID_ELF_HEADER(hdr,exp,size)	(memcmp (hdr, exp, size) == 0	\
+					 || memcmp (hdr, expected2, size) == 0)
+#define VALID_ELF_OSABI(osabi)		(osabi == ELFOSABI_SYSV \
+					 || osabi == ELFOSABI_GNU)
+#define VALID_ELF_ABIVERSION(osabi,ver) \
+  (ver == 0 || (osabi == ELFOSABI_GNU && ver < LIBC_ABI_MAX))
+#define MORE_ELF_HEADER_DATA \
+  static const unsigned char expected2[EI_PAD] =	\
+  {							\
+    [EI_MAG0] = ELFMAG0,				\
+    [EI_MAG1] = ELFMAG1,				\
+    [EI_MAG2] = ELFMAG2,				\
+    [EI_MAG3] = ELFMAG3,				\
+    [EI_CLASS] = ELFW(CLASS),				\
+    [EI_DATA] = byteorder,				\
+    [EI_VERSION] = EV_CURRENT,				\
+    [EI_OSABI] = ELFOSABI_GNU				\
+  }
+
+#endif /* ldsodefs.h */
diff --git a/sysdeps/unix/sysv/linux/ldsodefs.h b/sysdeps/unix/sysv/linux/ldsodefs.h
index 5d5b1b4..cf20217 100644
--- a/sysdeps/unix/sysv/linux/ldsodefs.h
+++ b/sysdeps/unix/sysv/linux/ldsodefs.h
@@ -58,9 +58,9 @@ extern void _dl_non_dynamic_init (void) internal_function;
 #define VALID_ELF_HEADER(hdr,exp,size)	(memcmp (hdr, exp, size) == 0	\
 					 || memcmp (hdr, expected2, size) == 0)
 #define VALID_ELF_OSABI(osabi)		(osabi == ELFOSABI_SYSV \
-					 || osabi == ELFOSABI_LINUX)
+					 || osabi == ELFOSABI_GNU)
 #define VALID_ELF_ABIVERSION(osabi,ver) \
-  (ver == 0 || (osabi == ELFOSABI_LINUX && ver < LIBC_ABI_MAX))
+  (ver == 0 || (osabi == ELFOSABI_GNU && ver < LIBC_ABI_MAX))
 #define MORE_ELF_HEADER_DATA \
   static const unsigned char expected2[EI_PAD] =	\
   {							\
@@ -71,7 +71,7 @@ extern void _dl_non_dynamic_init (void) internal_function;
     [EI_CLASS] = ELFW(CLASS),				\
     [EI_DATA] = byteorder,				\
     [EI_VERSION] = EV_CURRENT,				\
-    [EI_OSABI] = ELFOSABI_LINUX				\
+    [EI_OSABI] = ELFOSABI_GNU				\
   }
 
 #endif /* ldsodefs.h */
diff --git a/sysdeps/mach/hurd/powerpc/init-first.c b/sysdeps/mach/hurd/powerpc/init-first.c
index 21b5054..2047cac 100644
--- a/sysdeps/mach/hurd/powerpc/init-first.c
+++ b/sysdeps/mach/hurd/powerpc/init-first.c
@@ -32,9 +32,6 @@ extern void __init_misc (int, char **, char **);
 #ifdef USE_NONOPTION_FLAGS
 extern void __getopt_clean_environment (char **);
 #endif
-#ifndef SHARED
-extern void _dl_non_dynamic_init (void) internal_function;
-#endif
 extern void __libc_global_ctors (void);
 
 unsigned int __hurd_threadvar_max;
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index e79af1d..7c86609 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -37,9 +37,6 @@ extern void __init_misc (int, char **, char **);
 #ifdef USE_NONOPTION_FLAGS
 extern void __getopt_clean_environment (char **);
 #endif
-#ifndef SHARED
-extern void _dl_non_dynamic_init (void) internal_function;
-#endif
 extern void __libc_global_ctors (void);
 
 unsigned int __hurd_threadvar_max;



More information about the Libc-alpha mailing list