#! @BASH@
-# Copyright (C) 1996-2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 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
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, write to the Free
-# Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA.
+# 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
while test $# -gt 0; do
case "$1" in
--vers | --versi | --versio | --version)
- echo 'ldd (GNU libc) @VERSION@'
+ 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.
-" "2004"
+" "2015"
printf $"Written by %s and %s.
" "Roland McGrath" "Ulrich Drepper"
exit 0
-r, --function-relocs process data and function relocations
-u, --unused print unused direct dependencies
-v, --verbose print all information
-For bug reporting instructions, please see:
-<http://www.gnu.org/software/libc/bugs.html>."
+"
+ 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 | \
-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"
+ 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"
*) file=./$file
;;
esac
- if test ! -f "$file"; then
+ 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:' $"\
warning: you do not have execution permission for" "\`$file'" >&2
RTLD=
+ ret=1
for rtld in ${RTLDLIST}; do
if test -x $rtld; then
verify_out=`${rtld} --verify "$file"`
- ret=$?
+ ret=$?
case $ret in
[02]) RTLD=${rtld}; break;;
esac
fi
done
- if test -z "${RTLD}"; then
- set ${RTLDLIST}
- RTLD=$1
- verify_out=`${RTLD} --verify "$file"`
- ret=$?
- fi
case $ret in
0)
- eval $add_env '"$file"' || result=1
+ # If the program exits with exit code 5, it means the process has been
+ # invoked with __libc_enable_secure. Fall back to running it through
+ # the dynamic linker.
+ try_trace "$file"
+ rc=$?
+ if [ $rc = 5 ]; then
+ try_trace "$RTLD" "$file"
+ rc=$?
+ fi
+ [ $rc = 0 ] || result=1
;;
1)
# This can be a non-ELF binary or no binary at all.
}
;;
2)
- # The following use of cat is needed to make ldd work in SELinux
- # environments where the executed program might not have permissions
- # to write to the console/tty.
- eval $add_env \${RTLD} '"$file"' | cat || result=1
+ try_trace "$RTLD" "$file" || result=1
;;
*)
echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2