* emultempl/elf32.em: Add support for elf-hints.h on FreeBSD and Dragonfly targets.
authorNick Clifton <nickc@redhat.com>
Tue, 11 Apr 2006 10:36:26 +0000 (10:36 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 11 Apr 2006 10:36:26 +0000 (10:36 +0000)
* configure.in (AC_CHECK_HEADERS): Add elf-hints.h.
* Makefile.am (HFILES): Add elf-hints-local.h.
* elf-hints-local.h: New file.
* Makefile.in: Regenerate.
* configure: Regenerate.

ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/configure
ld/configure.in
ld/elf-hints-local.h [new file with mode: 0644]
ld/emultempl/elf32.em

index e5b6da0..bbadba4 100644 (file)
@@ -1,3 +1,13 @@
+2006-04-11  Diego Pettenò  <flameeyes@gentoo.org>
+
+       * emultempl/elf32.em: Add support for elf-hints.h on FreeBSD
+       and Dragonfly targets.
+       * configure.in (AC_CHECK_HEADERS): Add elf-hints.h.
+       * Makefile.am (HFILES): Add elf-hints-local.h.
+       * elf-hints-local.h: New file.
+       * Makefile.in: Regenerate.
+       * configure: Regenerate.
+
 2006-04-07  Bernhard Fischer  <aldot@gcc.gnu.org>
 
        * ld.texinfo: Fix typo in documentation of --check-sections.
index 3118a36..3c4fa5e 100644 (file)
@@ -418,7 +418,7 @@ CFILES = ldctor.c ldemul.c ldexp.c ldfile.c ldlang.c \
 
 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 2af4e51..30b9255 100644 (file)
@@ -644,7 +644,7 @@ CFILES = ldctor.c ldemul.c ldexp.c ldfile.c ldlang.c \
 
 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
@@ -813,7 +813,7 @@ distclean-libtool:
        else \
          rc=$$?; \
          cd $(srcdir) && \
-         $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+         $$restore $$backupdir/* `echo "$@" | sed 's|[^/]*$$||'`; \
        fi; \
        rm -rf $$backupdir; exit $$rc
 
index b5f9396..0cd6f5c 100755 (executable)
@@ -8607,7 +8607,8 @@ fi
 
 
 
-for ac_header in string.h strings.h stdlib.h unistd.h
+
+for ac_header in string.h strings.h stdlib.h unistd.h elf-hints.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
index 1c91d59..e020288 100644 (file)
@@ -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
 
diff --git a/ld/elf-hints-local.h b/ld/elf-hints-local.h
new file mode 100644 (file)
index 0000000..6940818
--- /dev/null
@@ -0,0 +1,44 @@
+/* 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.  */
+
+#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_ */
index 537d9dc..dffcff8 100644 (file)
@@ -529,6 +529,68 @@ gld${EMULATION_NAME}_add_sysroot (const char *path)
 
 EOF
   case ${target} in
+    *-*-freebsd* | *-*-dragonfly*)
+      cat >>e${EMULATION_NAME}.c <<EOF
+/* Read the system search path the FreeBSD way rather than the Linux way.  */
+#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 = 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
@@ -928,6 +990,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