* 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.
This commit is contained in:
parent
0f84642536
commit
ebe1fac161
7 changed files with 130 additions and 5 deletions
10
ld/ChangeLog
10
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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
3
ld/configure
vendored
3
ld/configure
vendored
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
44
ld/elf-hints-local.h
Normal file
44
ld/elf-hints-local.h
Normal file
|
@ -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_ */
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue