aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2006-04-11 10:36:26 +0000
committerNick Clifton <nickc@redhat.com>2006-04-11 10:36:26 +0000
commitebe1fac16186a77f5b2d971ac10e42a6b3b5b608 (patch)
treed992aa942a0879cb2815dbe5aa9bee683909acc1
parent0f84642536077e28c9d2f749cd3554404060b894 (diff)
downloadfsf-binutils-gdb-ebe1fac16186a77f5b2d971ac10e42a6b3b5b608.zip
fsf-binutils-gdb-ebe1fac16186a77f5b2d971ac10e42a6b3b5b608.tar.gz
fsf-binutils-gdb-ebe1fac16186a77f5b2d971ac10e42a6b3b5b608.tar.bz2
* 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.
-rw-r--r--ld/ChangeLog10
-rw-r--r--ld/Makefile.am2
-rw-r--r--ld/Makefile.in4
-rwxr-xr-xld/configure3
-rw-r--r--ld/configure.in2
-rw-r--r--ld/elf-hints-local.h44
-rw-r--r--ld/emultempl/elf32.em70
7 files changed, 130 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index e5b6da0..bbadba4 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -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.
diff --git a/ld/Makefile.am b/ld/Makefile.am
index 3118a36..3c4fa5e 100644
--- a/ld/Makefile.am
+++ b/ld/Makefile.am
@@ -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
diff --git a/ld/Makefile.in b/ld/Makefile.in
index 2af4e51..30b9255 100644
--- a/ld/Makefile.in
+++ b/ld/Makefile.in
@@ -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
diff --git a/ld/configure b/ld/configure
index b5f9396..0cd6f5c 100755
--- a/ld/configure
+++ b/ld/configure
@@ -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
diff --git a/ld/configure.in b/ld/configure.in
index 1c91d59..e020288 100644
--- a/ld/configure.in
+++ b/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
diff --git a/ld/elf-hints-local.h b/ld/elf-hints-local.h
new file mode 100644
index 0000000..6940818
--- /dev/null
+++ b/ld/elf-hints-local.h
@@ -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_ */
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 537d9dc..dffcff8 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -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