diff options
author | Nick Clifton <nickc@redhat.com> | 2006-04-11 10:36:26 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2006-04-11 10:36:26 +0000 |
commit | ebe1fac16186a77f5b2d971ac10e42a6b3b5b608 (patch) | |
tree | d992aa942a0879cb2815dbe5aa9bee683909acc1 | |
parent | 0f84642536077e28c9d2f749cd3554404060b894 (diff) | |
download | ppe42-binutils-ebe1fac16186a77f5b2d971ac10e42a6b3b5b608.tar.gz ppe42-binutils-ebe1fac16186a77f5b2d971ac10e42a6b3b5b608.zip |
* 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/ChangeLog | 10 | ||||
-rw-r--r-- | ld/Makefile.am | 2 | ||||
-rw-r--r-- | ld/Makefile.in | 4 | ||||
-rwxr-xr-x | ld/configure | 3 | ||||
-rw-r--r-- | ld/configure.in | 2 | ||||
-rw-r--r-- | ld/elf-hints-local.h | 44 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 70 |
7 files changed, 130 insertions, 5 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index e5b6da0230..bbadba41d8 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 3118a36646..3c4fa5ee66 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 2af4e519ce..30b925596b 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 b5f939620b..0cd6f5c99d 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 1c91d59d51..e020288c00 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 0000000000..69408180ce --- /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 537d9dc993..dffcff81b4 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 |