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:
@@ -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
70
configure
vendored
@@ -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
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
|
31
elf/rtld.c
31
elf/rtld.c
@@ -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)
|
||||||
|
Reference in New Issue
Block a user