This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Add support for ld-elf.so.hints on FreeBSD and DragonFly - Fourth try


Okay, new version of the patch, this time it includes an almost verbatim copy 
of the elf-hints header file from FreeBSD as elf-hints-local.h, that is 
included if the elf-hints.h file is not present in the system already, so 
that it works when building non systems not using FreeBSD's or DragonFly's 
libc,but still defaults to system's headers if they are present, so that if 
they change the signature it works fine anyway.
This should solve the license issues, too.

I also fixed the code style, thanks to Nick Clifton for pointing this out and 
Mike Frysinger for helping me by checking the code after passing it through 
indent.

I'm not quite sure about the changelog entry though... what should i put, and 
more importantly where?

-- 
Diego "Flameeyes" Pettenò - http://dev.gentoo.org/~flameeyes/
Gentoo/ALT lead, Gentoo/FreeBSD, Video, AMD64, Sound, PAM, KDE
Index: binutils-2.16.91.0.7/ld/emultempl/elf32.em
===================================================================
--- binutils-2.16.91.0.7.orig/ld/emultempl/elf32.em
+++ binutils-2.16.91.0.7/ld/emultempl/elf32.em
@@ -529,6 +529,69 @@ gld${EMULATION_NAME}_add_sysroot (const 
 
 EOF
   case ${target} in
+    *-*-freebsd* | *-*-dragonfly*)
+      cat >>e${EMULATION_NAME}.c <<EOF
+/* Read the system search path the FreeBSD way rather than like Linux. */
+#ifdef HAVE_ELF_HINTS_H
+#include <elf-hints.h>
+#else
+#include "elf-hints-local.h"
+#endif
+
+static bfd_boolean
+gld${EMULATION_NAME}_check_ld_elf_hints (const char *name, int force)
+{
+  static bfd_boolean initialized;
+  static char *ld_elf_hints;
+  struct dt_needed needed;
+
+  if (!initialized)
+    {
+      FILE *f;
+      char *tmppath;
+
+      tmppath = concat (ld_sysroot, _PATH_ELF_HINTS, NULL);
+      f = fopen (tmppath, FOPEN_RB);
+      free (tmppath);
+      if (f != NULL)
+	{
+	  struct elfhints_hdr hdr;
+
+	  if (fread (&hdr, 1, sizeof (hdr), f) == sizeof (hdr)
+	      && hdr.magic == ELFHINTS_MAGIC && hdr.version == 1)
+	    {
+	      if (fseek (f, hdr.strtab + hdr.dirlist, SEEK_SET) != -1)
+		{
+		  char *b;
+
+		  b = (char *) xmalloc (hdr.dirlistlen + 1);
+		  if (fread (b, 1, hdr.dirlistlen + 1, f) ==
+		      hdr.dirlistlen + 1)
+		    {
+		      ld_elf_hints =
+			gld${EMULATION_NAME}_add_sysroot (b);
+		    }
+		  free (b);
+		}
+	    }
+	  fclose (f);
+	}
+
+      initialized = TRUE;
+    }
+
+  if (ld_elf_hints == NULL)
+    return FALSE;
+
+  needed.by = NULL;
+  needed.name = name;
+  return gld${EMULATION_NAME}_search_needed (ld_elf_hints, &needed,
+						  force);
+}
+EOF
+    # FreeBSD
+    ;;
+
     *-*-linux-* | *-*-k*bsd*-*)
       cat >>e${EMULATION_NAME}.c <<EOF
 /* For a native linker, check the file /etc/ld.so.conf for directories
@@ -921,6 +984,14 @@ EOF
 fi
 if [ "x${USE_LIBPATH}" = xyes ] ; then
   case ${target} in
+    *-*-freebsd* | *-*-dragonfly*)
+      cat >>e${EMULATION_NAME}.c <<EOF
+	  if (gld${EMULATION_NAME}_check_ld_elf_hints (l->name, force))
+	    break;
+EOF
+    # FreeBSD
+    ;;
+
     *-*-linux-* | *-*-k*bsd*-*)
     # Linux
       cat >>e${EMULATION_NAME}.c <<EOF
Index: binutils-2.16.91.0.7/ld/configure.in
===================================================================
--- binutils-2.16.91.0.7.orig/ld/configure.in
+++ binutils-2.16.91.0.7/ld/configure.in
@@ -99,7 +99,7 @@ AC_SUBST(HOSTING_CRT0)
 AC_SUBST(HOSTING_LIBS)
 AC_SUBST(NATIVE_LIB_DIRS)
 
-AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h)
+AC_CHECK_HEADERS(string.h strings.h stdlib.h unistd.h elf-hints.h)
 AC_CHECK_FUNCS(sbrk realpath glob)
 AC_HEADER_DIRENT
 
Index: binutils-2.16.91.0.7/ld/Makefile.am
===================================================================
--- binutils-2.16.91.0.7.orig/ld/Makefile.am
+++ binutils-2.16.91.0.7/ld/Makefile.am
@@ -414,7 +414,7 @@ CFILES = ldctor.c ldemul.c ldexp.c ldfil
 
 HFILES = ld.h ldctor.h ldemul.h ldexp.h ldfile.h \
 	ldlang.h ldlex.h ldmain.h ldmisc.h ldver.h \
-	ldwrite.h mri.h deffile.h pe-dll.h
+	ldwrite.h mri.h deffile.h pe-dll.h elf-hints-local.h
 
 GENERATED_CFILES = ldgram.c ldlex.c deffilep.c
 GENERATED_HFILES = ldgram.h ldemul-list.h deffilep.h
Index: binutils-2.16.91.0.7/ld/elf-hints-local.h
===================================================================
--- /dev/null
+++ binutils-2.16.91.0.7/ld/elf-hints-local.h
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 1997 John D. Polstra.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/include/elf-hints.h,v 1.4 2001/05/02 23:56:17 obrien Exp $
+ */
+
+#ifndef	_ELF_HINTS_H_
+#define	_ELF_HINTS_H_
+
+/*
+ * Hints file produced by ldconfig.
+ */
+struct elfhints_hdr
+{
+  u_int32_t magic;		/* Magic number */
+  u_int32_t version;		/* File version (1) */
+  u_int32_t strtab;		/* Offset of string table in file */
+  u_int32_t strsize;		/* Size of string table */
+  u_int32_t dirlist;		/* Offset of directory list in
+				   string table */
+  u_int32_t dirlistlen;		/* strlen(dirlist) */
+  u_int32_t spare[26];		/* Room for expansion */
+};
+
+#define ELFHINTS_MAGIC	0x746e6845
+
+#define _PATH_ELF_HINTS	"/var/run/ld-elf.so.hints"
+
+#endif /* !_ELF_HINTS_H_ */

Attachment: pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]