2000-08-22 H.J. Lu <hjl@gnu.org>
* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Search the DT_RPATH/DT_RUNPATH entries for DT_NEEDED after LD_LIBRARY_PATH for native linker. Display the needed DSO if trace_file_tries is non-zero. (gld${EMULATION_NAME}_try_needed): Report the needed DSO found if trace_file_tries is non-zero. * ld.texinfo: Document the usage of DT_RPATH/DT_RUNPATH. * News: Mention it.
This commit is contained in:
parent
a963dc6ade
commit
ec4eb78a39
4 changed files with 86 additions and 10 deletions
12
ld/ChangeLog
12
ld/ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2000-08-22 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* emultempl/elf32.em (gld${EMULATION_NAME}_after_open): Search
|
||||||
|
the DT_RPATH/DT_RUNPATH entries for DT_NEEDED after
|
||||||
|
LD_LIBRARY_PATH for native linker. Display the needed DSO if
|
||||||
|
trace_file_tries is non-zero.
|
||||||
|
(gld${EMULATION_NAME}_try_needed): Report the needed DSO found
|
||||||
|
if trace_file_tries is non-zero.
|
||||||
|
|
||||||
|
* ld.texinfo: Document the usage of DT_RPATH/DT_RUNPATH.
|
||||||
|
* News: Mention it.
|
||||||
|
|
||||||
2000-08-14 Jason Eckhardt <jle@cygnus.com>
|
2000-08-14 Jason Eckhardt <jle@cygnus.com>
|
||||||
|
|
||||||
* NEWS: Mention i860 support.
|
* NEWS: Mention i860 support.
|
||||||
|
|
3
ld/NEWS
3
ld/NEWS
|
@ -1,5 +1,8 @@
|
||||||
-*- text -*-
|
-*- text -*-
|
||||||
|
|
||||||
|
* The native ELF linker now searches the directories in DT_RUNPATH or
|
||||||
|
DT_RPATH of a shared library for shared libraries needed by it.
|
||||||
|
|
||||||
* TI C54x support, by Timothy Wall.
|
* TI C54x support, by Timothy Wall.
|
||||||
|
|
||||||
* Added command line switch --section-start to set the start address of any
|
* Added command line switch --section-start to set the start address of any
|
||||||
|
|
|
@ -254,6 +254,7 @@ gld${EMULATION_NAME}_try_needed (name, force)
|
||||||
int force;
|
int force;
|
||||||
{
|
{
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
const char *soname;
|
||||||
|
|
||||||
abfd = bfd_openr (name, bfd_get_target (output_bfd));
|
abfd = bfd_openr (name, bfd_get_target (output_bfd));
|
||||||
if (abfd == NULL)
|
if (abfd == NULL)
|
||||||
|
@ -337,6 +338,17 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
|
||||||
if (bfd_stat (abfd, &global_stat) != 0)
|
if (bfd_stat (abfd, &global_stat) != 0)
|
||||||
einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
|
einfo ("%F%P:%B: bfd_stat failed: %E\n", abfd);
|
||||||
|
|
||||||
|
/* First strip off everything before the last '/'. */
|
||||||
|
soname = strrchr (abfd->filename, '/');
|
||||||
|
if (soname)
|
||||||
|
soname++;
|
||||||
|
else
|
||||||
|
soname = abfd->filename;
|
||||||
|
|
||||||
|
if (trace_file_tries)
|
||||||
|
info_msg (_("found %s at %s\n"), soname, name);
|
||||||
|
|
||||||
global_found = false;
|
global_found = false;
|
||||||
lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
|
lang_for_each_input_file (gld${EMULATION_NAME}_stat_needed);
|
||||||
if (global_found)
|
if (global_found)
|
||||||
|
@ -350,17 +362,10 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
DT_NEEDED entry for this file. */
|
DT_NEEDED entry for this file. */
|
||||||
bfd_elf_set_dt_needed_name (abfd, "");
|
bfd_elf_set_dt_needed_name (abfd, "");
|
||||||
|
|
||||||
/* First strip off everything before the last '/'. */
|
|
||||||
name = strrchr (abfd->filename, '/');
|
|
||||||
if (name)
|
|
||||||
name++;
|
|
||||||
else
|
|
||||||
name = abfd->filename;
|
|
||||||
|
|
||||||
/* Tell the ELF backend that the output file needs a DT_NEEDED
|
/* Tell the ELF backend that the output file needs a DT_NEEDED
|
||||||
entry for this file if it is used to resolve the reference in
|
entry for this file if it is used to resolve the reference in
|
||||||
a regular object. */
|
a regular object. */
|
||||||
bfd_elf_set_dt_needed_soname (abfd, name);
|
bfd_elf_set_dt_needed_soname (abfd, soname);
|
||||||
|
|
||||||
/* Add this file into the symbol table. */
|
/* Add this file into the symbol table. */
|
||||||
if (! bfd_link_add_symbols (abfd, &link_info))
|
if (! bfd_link_add_symbols (abfd, &link_info))
|
||||||
|
@ -565,11 +570,34 @@ static void
|
||||||
gld${EMULATION_NAME}_after_open ()
|
gld${EMULATION_NAME}_after_open ()
|
||||||
{
|
{
|
||||||
struct bfd_link_needed_list *needed, *l;
|
struct bfd_link_needed_list *needed, *l;
|
||||||
|
EOF
|
||||||
|
if [ "x${host}" = "x${target}" ] ; then
|
||||||
|
case " ${EMULATION_LIBPATH} " in
|
||||||
|
*" ${EMULATION_NAME} "*)
|
||||||
|
cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
struct bfd_link_needed_list *run_path;
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
|
||||||
/* We only need to worry about this when doing a final link. */
|
/* We only need to worry about this when doing a final link. */
|
||||||
if (link_info.relocateable || link_info.shared)
|
if (link_info.relocateable || link_info.shared)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
EOF
|
||||||
|
if [ "x${host}" = "x${target}" ] ; then
|
||||||
|
case " ${EMULATION_LIBPATH} " in
|
||||||
|
*" ${EMULATION_NAME} "*)
|
||||||
|
cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
run_path = bfd_elf_get_runpath_list (output_bfd, &link_info);
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
|
||||||
/* Get the list of files which appear in DT_NEEDED entries in
|
/* Get the list of files which appear in DT_NEEDED entries in
|
||||||
dynamic objects included in the link (often there will be none).
|
dynamic objects included in the link (often there will be none).
|
||||||
For each such file, we want to track down the corresponding
|
For each such file, we want to track down the corresponding
|
||||||
|
@ -584,6 +612,18 @@ gld${EMULATION_NAME}_after_open ()
|
||||||
{
|
{
|
||||||
struct bfd_link_needed_list *ll;
|
struct bfd_link_needed_list *ll;
|
||||||
int force;
|
int force;
|
||||||
|
EOF
|
||||||
|
if [ "x${host}" = "x${target}" ] ; then
|
||||||
|
case " ${EMULATION_LIBPATH} " in
|
||||||
|
*" ${EMULATION_NAME} "*)
|
||||||
|
cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
struct bfd_link_needed_list *rp;
|
||||||
|
int found;
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
|
|
||||||
/* If we've already seen this file, skip it. */
|
/* If we've already seen this file, skip it. */
|
||||||
for (ll = needed; ll != l; ll = ll->next)
|
for (ll = needed; ll != l; ll = ll->next)
|
||||||
|
@ -599,12 +639,16 @@ gld${EMULATION_NAME}_after_open ()
|
||||||
if (global_found)
|
if (global_found)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (trace_file_tries)
|
||||||
|
info_msg (_("%s needed by %B\n"), l->name, l->by);
|
||||||
|
|
||||||
/* We need to find this file and include the symbol table. We
|
/* We need to find this file and include the symbol table. We
|
||||||
want to search for the file in the same way that the dynamic
|
want to search for the file in the same way that the dynamic
|
||||||
linker will search. That means that we want to use
|
linker will search. That means that we want to use
|
||||||
rpath_link, rpath, then the environment variable
|
rpath_link, rpath, then the environment variable
|
||||||
LD_LIBRARY_PATH (native only), then the linker script
|
LD_LIBRARY_PATH (native only), then the DT_RPATH/DT_RUNPATH
|
||||||
LIB_SEARCH_DIRS. We do not search using the -L arguments.
|
entries (native only), then the linker script LIB_SEARCH_DIRS.
|
||||||
|
We do not search using the -L arguments.
|
||||||
|
|
||||||
We search twice. The first time, we skip objects which may
|
We search twice. The first time, we skip objects which may
|
||||||
introduce version mismatches. The second time, we force
|
introduce version mismatches. The second time, we force
|
||||||
|
@ -637,6 +681,18 @@ cat >>e${EMULATION_NAME}.c <<EOF
|
||||||
lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
|
lib_path = (const char *) getenv ("LD_LIBRARY_PATH");
|
||||||
if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
|
if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, force))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
found = 0;
|
||||||
|
for (rp = run_path; !found && rp != NULL; rp = rp->next)
|
||||||
|
{
|
||||||
|
found = (rp->by == l->by
|
||||||
|
&& gld${EMULATION_NAME}_search_needed (rp->name,
|
||||||
|
l->name,
|
||||||
|
force));
|
||||||
|
}
|
||||||
|
if (found)
|
||||||
|
break;
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1101,6 +1101,11 @@ directories specified using @code{-L} options.
|
||||||
For a native linker, the contents of the environment variable
|
For a native linker, the contents of the environment variable
|
||||||
@code{LD_LIBRARY_PATH}.
|
@code{LD_LIBRARY_PATH}.
|
||||||
@item
|
@item
|
||||||
|
For a native ELF linker, the directories in @code{DT_RUNPATH} or
|
||||||
|
@code{DT_RPATH} of a shared library are searched for shared
|
||||||
|
libraries needed by it. The @code{DT_RPATH} entries are ignored if
|
||||||
|
@code{DT_RUNPATH} entries exist.
|
||||||
|
@item
|
||||||
The default directories, normally @file{/lib} and @file{/usr/lib}.
|
The default directories, normally @file{/lib} and @file{/usr/lib}.
|
||||||
@item
|
@item
|
||||||
For a native linker on an ELF system, if the file @file{/etc/ld.so.conf}
|
For a native linker on an ELF system, if the file @file{/etc/ld.so.conf}
|
||||||
|
|
Loading…
Reference in a new issue