Skip to content

Commit

Permalink
* elf/dl-deps.c (_dl_map_object_deps): Set MAP's mark bit before loop.
Browse files Browse the repository at this point in the history
	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!
  • Loading branch information
Roland McGrath committed Jun 16, 1996
1 parent a23db8e commit f9496a7
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 53 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
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.

* elf/dl-open.c (_dl_open): Remove PARENT argument, pass null.
Expand Down
70 changes: 32 additions & 38 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -745,12 +745,10 @@ esac


# Compute the list of sysdep directories for this configuration.
# This can take a while to compute.
sysdep_dir=$srcdir/sysdeps
echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6
if eval "test \"`echo '$''{'libc_cv_sysdirs'+set}'`\" = set"; then
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.
# 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'`"

case "$os" in
Expand Down Expand Up @@ -858,22 +856,36 @@ sysnames="`echo $sysnames | sed -e 's@^/@@' -e 's@ /@ @g'`"
# Expand the list of system names into a full list of directories
# from each element's parent name and Implies file (if present).
set $sysnames
names= seen=
while test $# -gt 0; do
name=$1
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
# Collect more names from the `Implies' file (removing comments).
implied="`sed 's/#.*$//' < $sysdep_dir/$name/Implies`"
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
else
implied=
fi

# Add NAME to the list of names.
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.
parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`"
Expand All @@ -890,31 +902,13 @@ while test $# -gt 0; do
done

# Add the default directories.
names="$names generic stub"
sysnames="$names generic stub"

# The other names were emitted during the scan.
echo "$ac_t""generic stub" 1>&6

# Now uniquize the list.
seen=
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),
# so one script is as good as another. But avoid the broken or
Expand Down Expand Up @@ -1101,13 +1095,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
#line 1105 "configure"
#line 1099 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
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`
if test -z "$ac_err"; then
:
Expand All @@ -1116,13 +1110,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
#line 1120 "configure"
#line 1114 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
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`
if test -z "$ac_err"; then
:
Expand Down Expand Up @@ -1264,7 +1258,7 @@ if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1268 "configure"
#line 1262 "configure"
#include "confdefs.h"
#define __need_size_t
#define __need_wchar_t
Expand All @@ -1280,7 +1274,7 @@ size_t size; wchar_t wchar;
if (&size == NULL || &wchar == NULL) abort ();
; return 0; }
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*
libc_cv_friendly_stddef=yes
else
Expand Down Expand Up @@ -1387,7 +1381,7 @@ if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1391 "configure"
#line 1385 "configure"
#include "confdefs.h"
int main() { return 0; }
Expand All @@ -1397,7 +1391,7 @@ asm (".section .init");
asm (".text");
; return 0; }
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*
libc_cv_have_initfini=yes
else
Expand Down Expand Up @@ -1425,15 +1419,15 @@ if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1429 "configure"
#line 1423 "configure"
#include "confdefs.h"
asm ("_glibc_foobar:");
int main() { return 0; }
int t() {
glibc_foobar ();
; return 0; }
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*
libc_cv_asm_underscores=yes
else
Expand Down
11 changes: 6 additions & 5 deletions elf/dl-deps.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ _dl_map_object_deps (struct link_map *map)
head.next = NULL;
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
dependencies and appending them to the list as we step through it.
Expand All @@ -47,11 +51,6 @@ _dl_map_object_deps (struct link_map *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])
{
const char *strtab
Expand Down Expand Up @@ -79,6 +78,8 @@ _dl_map_object_deps (struct link_map *map)
tailp->map = dep;
tailp->next = NULL;
++nlist;
/* Set the mark bit that says it's already in the list. */
dep->l_reserved = 1;
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion elf/dl-load.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
/* If dynamically linked, try the DT_RPATH of the executable itself. */
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 +
l->l_info[DT_STRTAB]->d_un.d_ptr +
l->l_info[DT_RPATH]->d_un.d_val));
Expand Down
31 changes: 22 additions & 9 deletions elf/rtld.c
Original file line number Diff line number Diff line change
Expand Up @@ -243,17 +243,30 @@ of this helper program; chances are you did not intend to run this program.\n",
__close (_dl_zerofd);
_dl_zerofd = -1;

/* XXX if kept, move it so l_next list is in dep order because
it will determine gdb's search order.
Perhaps do this always, so later dlopen by name finds it?
XXX But then gdb always considers it present. */
if (_dl_rtld_map.l_opencount == 0)
/* Remove _dl_rtld_map from the chain. */
_dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next;
if (_dl_rtld_map.l_next)
_dl_rtld_map.l_next->l_prev = _dl_rtld_map.l_prev;

if (_dl_rtld_map.l_opencount)
{
/* No DT_NEEDED entry referred to the interpreter object itself,
so remove it from the list of visible objects. */
_dl_rtld_map.l_prev->l_next = _dl_rtld_map.l_next;
/* Some DT_NEEDED entry referred to the interpreter object itself, so
put it back in the list of visible objects. We insert it into the
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)
_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)
Expand Down

0 comments on commit f9496a7

Please sign in to comment.