#! @BASH@
-
-# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+# Copyright (C) 1996-2019 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Library General Public License as
-# published by the Free Software Foundation; either version 2 of the
-# License, or (at your option) any later version.
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
# The GNU C Library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Library General Public License for more details.
+# Lesser General Public License for more details.
-# You should have received a copy of the GNU Library General Public
-# License along with the GNU C Library; see the file COPYING.LIB. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
# This is the `ldd' command, which lists what shared libraries are
TEXTDOMAIN=libc
TEXTDOMAINDIR=@TEXTDOMAINDIR@
-RTLD=@RTLD@
+RTLDLIST=@RTLD@
warn=
bind_now=
verbose=
while test $# -gt 0; do
case "$1" in
--vers | --versi | --versio | --version)
- echo 'ldd (GNU libc) @VERSION@'
- echo $"Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+ echo 'ldd @PKGVERSION@@VERSION@'
+ printf $"Copyright (C) %s Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-Written by Roland McGrath and Ulrich Drepper."
+" "2019"
+ printf $"Written by %s and %s.
+" "Roland McGrath" "Ulrich Drepper"
exit 0
;;
--h | --he | --hel | --help)
- echo $"ldd [OPTION]... FILE...
+ echo $"Usage: ldd [OPTION]... FILE...
--help print this help and exit
--version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
+ -u, --unused print unused direct dependencies
-v, --verbose print all information
-Report bugs using the \`glibcbug' script to <bugs@gnu.org>."
+"
+ printf $"For bug reporting instructions, please see:\\n%s.\\n" \
+ "@REPORT_BUGS_TO@"
exit 0
;;
-d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
verbose=yes
shift
;;
+ -u | --u | --un | --unu | --unus | --unuse | --unused)
+ unused=yes
+ shift
+ ;;
--v | --ve | --ver)
echo >&2 $"ldd: option \`$1' is ambiguous"
exit 1
add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
add_env="$add_env LD_VERBOSE=$verbose"
+if test "$unused" = yes; then
+ add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
+fi
+
+# The following command substitution is needed to make ldd work in SELinux
+# environments where the RTLD might not have permission to write to the
+# terminal. The extra "x" character prevents the shell from trimming trailing
+# newlines from command substitution results. This function is defined as a
+# subshell compound list (using "(...)") to prevent parameter assignments from
+# affecting the calling shell execution environment.
+try_trace() (
+ output=$(eval $add_env '"$@"' 2>&1; rc=$?; printf 'x'; exit $rc)
+ rc=$?
+ printf '%s' "${output%x}"
+ return $rc
+)
+
case $# in
0)
echo >&2 'ldd:' $"missing file arguments"
exit 1
;;
1)
+ single_file=t
+ ;;
+*)
+ single_file=f
+ ;;
+esac
+
+result=0
+for file do
# We don't list the file name when there is only one.
- case "$1" in
- */*) file="$1"
+ test $single_file = t || echo "${file}:"
+ case $file in
+ */*) :
;;
- *) file="./$1"
+ *) file=./$file
;;
esac
- if test ! -f "$file"; then
- echo "ldd: ${file}:" $"no such file"
- exit 1
+ if test ! -e "$file"; then
+ echo "ldd: ${file}:" $"No such file or directory" >&2
+ result=1
+ elif test ! -f "$file"; then
+ echo "ldd: ${file}:" $"not regular file" >&2
+ result=1
elif test -r "$file"; then
- test -x "$file" ||
- echo 'ldd:' $"\
+ test -x "$file" || echo 'ldd:' $"\
warning: you do not have execution permission for" "\`$file'" >&2
- verify_out=`${RTLD} --verify "$file"`
- case $? in
- 0)
- eval $add_env exec '"$file"' || exit 1
- ;;
+ RTLD=
+ ret=1
+ for rtld in ${RTLDLIST}; do
+ if test -x $rtld; then
+ verify_out=`${rtld} --verify "$file"`
+ ret=$?
+ case $ret in
+ [02]) RTLD=${rtld}; break;;
+ esac
+ fi
+ done
+ case $ret in
1)
# This can be a non-ELF binary or no binary at all.
- nonelf $file ||
- echo $" not a dynamic executable"
- exit 1
+ nonelf "$file" || {
+ echo $" not a dynamic executable"
+ result=1
+ }
;;
- 2)
- eval $add_env exec \${RTLD} '"$file"' || exit 1
+ 0|2)
+ try_trace "$RTLD" "$file" || result=1
;;
*)
- echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($?)" >&2
+ echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2
exit 1
;;
esac
else
echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
- exit 1
+ result=1
fi
- exit
- ;;
-*)
- result=0
- for file; do
- echo "${file}:"
- case "$file" in
- */*) :
- ;;
- *) file="./$file"
- ;;
- esac
- if test ! -f "$file"; then
- echo "ldd: ${file}:" $"no such file"
- result=1
- elif test -r "$file"; then
- test -x "$file" || echo 'ldd:' $"\
-warning: you do not have execution permission for" "\`$file'" >&2
- verify_out=`${RTLD} --verify "$file"`
- case $? in
- 0)
- eval $add_env '"$file"' || result=1
- ;;
- 1)
- # This can be a non-ELF binary or no binary at all.
- nonelf $file || {
- echo $" not a dynamic executable"
- result=1
- }
- ;;
- 2)
- eval $add_env ${RTLD} '"$file"' || result=1
- ;;
- *)
- echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($?)" >&2
- exit 1
- ;;
- esac
- else
- echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
- result=1
- fi
- done
-esac
+done
exit $result
# Local Variables: