1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-07 06:43:00 +03:00

* elf/dl-deps.c (_dl_map_object_deps): Set MAP's mark bit before loop.

Set mark bits of deps as opened, instead of as scanned.

	* elf/rtld.c (dl_main): Remove _dl_rtld_map from chain unconditionally.
	Then if it has a nonzero l_opencount, add it back in search order.

	* elf/dl-load.c (_dl_map_object): Don't use _dl_loaded's DT_RPATH if
 	it ain't got one!
This commit is contained in:
Roland McGrath
1996-06-16 02:18:58 +00:00
parent a23db8e4af
commit f9496a7b54
5 changed files with 70 additions and 53 deletions

View File

@@ -1,5 +1,14 @@
Sat Jun 15 18:13:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> Sat Jun 15 18:13:43 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* elf/dl-deps.c (_dl_map_object_deps): Set MAP's mark bit before loop.
Set mark bits of deps as opened, instead of as scanned.
* elf/rtld.c (dl_main): Remove _dl_rtld_map from chain unconditionally.
Then if it has a nonzero l_opencount, add it back in search order.
* elf/dl-load.c (_dl_map_object): Don't use _dl_loaded's DT_RPATH if
it ain't got one!
* sysdeps/unix/sysv/linux/Dist: Add sys/klog.h. * sysdeps/unix/sysv/linux/Dist: Add sys/klog.h.
* elf/dl-open.c (_dl_open): Remove PARENT argument, pass null. * elf/dl-open.c (_dl_open): Remove PARENT argument, pass null.

70
configure vendored
View File

@@ -745,12 +745,10 @@ esac
# Compute the list of sysdep directories for this configuration. # Compute the list of sysdep directories for this configuration.
# This can take a while to compute.
sysdep_dir=$srcdir/sysdeps sysdep_dir=$srcdir/sysdeps
echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6 echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6
if eval "test \"`echo '$''{'libc_cv_sysdirs'+set}'`\" = set"; then # Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1.
echo $ac_n "(cached) $ac_c" 1>&6
else
# Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1.
os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`" os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`"
case "$os" in case "$os" in
@@ -858,15 +856,26 @@ sysnames="`echo $sysnames | sed -e 's@^/@@' -e 's@ /@ @g'`"
# Expand the list of system names into a full list of directories # Expand the list of system names into a full list of directories
# from each element's parent name and Implies file (if present). # from each element's parent name and Implies file (if present).
set $sysnames set $sysnames
names= seen=
while test $# -gt 0; do while test $# -gt 0; do
name=$1 name=$1
shift shift
if echo "$seen" | fgrep -x $name >/dev/null; then
# Already in the list.
continue
fi
# Report each name as we discover it, so there is no long pause in output.
echo $ac_n "$name $ac_c" >&6
if test -f $sysdep_dir/$name/Implies; then if test -f $sysdep_dir/$name/Implies; then
# Collect more names from the `Implies' file (removing comments). # Collect more names from the `Implies' file (removing comments).
implied="`sed 's/#.*$//' < $sysdep_dir/$name/Implies`" implied="`sed 's/#.*$//' < $sysdep_dir/$name/Implies`"
for x in $implied; do for x in $implied; do
test -d $sysdep_dir/$x || echo "Warning: $name implies nonexistent $x">&2 test -d $sysdep_dir/$x || {
echo "configure: warning: sysdeps/$name/Implies specifies nonexistent $x" 1>&2
}
done done
else else
implied= implied=
@@ -874,6 +883,9 @@ while test $# -gt 0; do
# Add NAME to the list of names. # Add NAME to the list of names.
names="$names $name" names="$names $name"
# We maintain a parallel newline-separated list for the fgrep check above.
seen="$seen
$name"
# Find the parent of NAME, using the empty string if it has none. # Find the parent of NAME, using the empty string if it has none.
parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`" parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`"
@@ -890,31 +902,13 @@ while test $# -gt 0; do
done done
# Add the default directories. # Add the default directories.
names="$names generic stub" sysnames="$names generic stub"
# Now uniquize the list. # The other names were emitted during the scan.
seen= echo "$ac_t""generic stub" 1>&6
sysnames=
for name in $names; do
if echo "$seen" | fgrep -x $name >/dev/null; then
# Already in the list.
true;
else
# A new one.
if test -z "$seen"; then
seen="$name" sysnames="$name"
else
seen="$seen
$name"
sysnames="$sysnames $name"
fi
fi
done
libc_cv_sysdirs="$sysnames"
fi
echo "$ac_t""$libc_cv_sysdirs" 1>&6
sysnames="$libc_cv_sysdirs" ### Locate tools.
# Find a good install program. We prefer a C program (faster), # Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or # so one script is as good as another. But avoid the broken or
@@ -1101,13 +1095,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1105 "configure" #line 1099 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1111: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1105: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@@ -1116,13 +1110,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1120 "configure" #line 1114 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1126: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:1120: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@@ -1264,7 +1258,7 @@ if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1268 "configure" #line 1262 "configure"
#include "confdefs.h" #include "confdefs.h"
#define __need_size_t #define __need_size_t
#define __need_wchar_t #define __need_wchar_t
@@ -1280,7 +1274,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort (); if (&size == NULL || &wchar == NULL) abort ();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1284: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_friendly_stddef=yes libc_cv_friendly_stddef=yes
else else
@@ -1387,7 +1381,7 @@ if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1391 "configure" #line 1385 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@@ -1397,7 +1391,7 @@ asm (".section .init");
asm (".text"); asm (".text");
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1401: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1395: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_have_initfini=yes libc_cv_have_initfini=yes
else else
@@ -1425,7 +1419,7 @@ if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1429 "configure" #line 1423 "configure"
#include "confdefs.h" #include "confdefs.h"
asm ("_glibc_foobar:"); asm ("_glibc_foobar:");
int main() { return 0; } int main() { return 0; }
@@ -1433,7 +1427,7 @@ int t() {
glibc_foobar (); glibc_foobar ();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then if { (eval echo configure:1431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_asm_underscores=yes libc_cv_asm_underscores=yes
else else

View File

@@ -38,6 +38,10 @@ _dl_map_object_deps (struct link_map *map)
head.next = NULL; head.next = NULL;
nlist = 1; nlist = 1;
/* We use `l_reserved' as a mark bit to detect objects we have already
put in the search list and avoid adding duplicate elements later in
the list. */
map->l_reserved = 1;
/* Process each element of the search list, loading each of its immediate /* Process each element of the search list, loading each of its immediate
dependencies and appending them to the list as we step through it. dependencies and appending them to the list as we step through it.
@@ -47,11 +51,6 @@ _dl_map_object_deps (struct link_map *map)
{ {
struct link_map *l = scanp->map; struct link_map *l = scanp->map;
/* We use `l_reserved' as a mark bit to detect objects we have
already put in the search list and avoid adding duplicate elements
later in the list. */
l->l_reserved = 1;
if (l->l_info[DT_NEEDED]) if (l->l_info[DT_NEEDED])
{ {
const char *strtab const char *strtab
@@ -79,6 +78,8 @@ _dl_map_object_deps (struct link_map *map)
tailp->map = dep; tailp->map = dep;
tailp->next = NULL; tailp->next = NULL;
++nlist; ++nlist;
/* Set the mark bit that says it's already in the list. */
dep->l_reserved = 1;
} }
} }
} }

View File

@@ -479,7 +479,7 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
l->l_info[DT_RPATH]->d_un.d_val)); l->l_info[DT_RPATH]->d_un.d_val));
/* If dynamically linked, try the DT_RPATH of the executable itself. */ /* If dynamically linked, try the DT_RPATH of the executable itself. */
l = _dl_loaded; l = _dl_loaded;
if (fd == -1 && l && l->l_type != lt_loaded) if (fd == -1 && l && l->l_type != lt_loaded && l->l_info[DT_RPATH])
trypath ((const char *) (l->l_addr + trypath ((const char *) (l->l_addr +
l->l_info[DT_STRTAB]->d_un.d_ptr + l->l_info[DT_STRTAB]->d_un.d_ptr +
l->l_info[DT_RPATH]->d_un.d_val)); l->l_info[DT_RPATH]->d_un.d_val));

View File

@@ -243,17 +243,30 @@ of this helper program; chances are you did not intend to run this program.\n",
__close (_dl_zerofd); __close (_dl_zerofd);
_dl_zerofd = -1; _dl_zerofd = -1;
/* XXX if kept, move it so l_next list is in dep order because /* Remove _dl_rtld_map from the chain. */
it will determine gdb's search order. _dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next;
Perhaps do this always, so later dlopen by name finds it? if (_dl_rtld_map.l_next)
XXX But then gdb always considers it present. */ _dl_rtld_map.l_next->l_prev = _dl_rtld_map.l_prev;
if (_dl_rtld_map.l_opencount == 0)
if (_dl_rtld_map.l_opencount)
{ {
/* No DT_NEEDED entry referred to the interpreter object itself, /* Some DT_NEEDED entry referred to the interpreter object itself, so
so remove it from the list of visible objects. */ put it back in the list of visible objects. We insert it into the
_dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next; chain in symbol search order because gdb uses the chain's order as
its symbol search order. */
unsigned int i = 1;
while (l->l_searchlist[i] != &_dl_rtld_map)
++i;
_dl_rtld_map.l_prev = l->l_searchlist[i - 1];
_dl_rtld_map.l_next = (i + 1 < l->l_nsearchlist ?
l->l_searchlist[i + 1] : NULL);
assert (_dl_rtld_map.l_prev->l_next == _dl_rtld_map.l_next);
_dl_rtld_map.l_prev->l_next = &_dl_rtld_map;
if (_dl_rtld_map.l_next) if (_dl_rtld_map.l_next)
_dl_rtld_map.l_next->l_prev = _dl_rtld_map.l_prev; {
assert (_dl_rtld_map.l_next->l_prev == _dl_rtld_map.l_prev);
_dl_rtld_map.l_next->l_prev = &_dl_rtld_map;
}
} }
if (list_only) if (list_only)