204 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			204 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | #! /bin/bash | ||
|  | # Copyright (C) 1996-2016 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 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 | ||
|  | # 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, see | ||
|  | # <http://www.gnu.org/licenses/>. | ||
|  | 
 | ||
|  | 
 | ||
|  | # This is the `ldd' command, which lists what shared libraries are | ||
|  | # used by given dynamically-linked executables.  It works by invoking the | ||
|  | # run-time dynamic linker as a command and setting the environment | ||
|  | # variable LD_TRACE_LOADED_OBJECTS to a non-empty value. | ||
|  | 
 | ||
|  | # We should be able to find the translation right at the beginning. | ||
|  | TEXTDOMAIN=libc | ||
|  | TEXTDOMAINDIR=/usr/share/locale | ||
|  | 
 | ||
|  | RTLDLIST="/lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2" | ||
|  | warn= | ||
|  | bind_now= | ||
|  | verbose= | ||
|  | 
 | ||
|  | while test $# -gt 0; do | ||
|  |   case "$1" in | ||
|  |   --vers | --versi | --versio | --version) | ||
|  |     echo 'ldd (GNU libc) 2.23' | ||
|  |     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. | ||
|  | " "2016" | ||
|  |     printf $"Written by %s and %s. | ||
|  | " "Roland McGrath" "Ulrich Drepper" | ||
|  |     exit 0 | ||
|  |     ;; | ||
|  |   --h | --he | --hel | --help) | ||
|  |     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 | ||
|  | " | ||
|  |     printf $"For bug reporting instructions, please see:\\n%s.\\n" \ | ||
|  |       "<http://www.gnu.org/software/libc/bugs.html>" | ||
|  |     exit 0 | ||
|  |     ;; | ||
|  |   -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \ | ||
|  |   --data-rel | --data-relo | --data-reloc | --data-relocs) | ||
|  |     warn=yes | ||
|  |     shift | ||
|  |     ;; | ||
|  |   -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \ | ||
|  |   --function | --function- | --function-r | --function-re | --function-rel | \ | ||
|  |   --function-relo | --function-reloc | --function-relocs) | ||
|  |     warn=yes | ||
|  |     bind_now=yes | ||
|  |     shift | ||
|  |     ;; | ||
|  |   -v | --verb | --verbo | --verbos | --verbose) | ||
|  |     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 | ||
|  |     ;; | ||
|  |   --)		# Stop option processing. | ||
|  |     shift; break | ||
|  |     ;; | ||
|  |   -*) | ||
|  |     echo >&2 'ldd:' $"unrecognized option" "\`$1'" | ||
|  |     echo >&2 $"Try \`ldd --help' for more information." | ||
|  |     exit 1 | ||
|  |     ;; | ||
|  |   *) | ||
|  |     break | ||
|  |     ;; | ||
|  |   esac | ||
|  | done | ||
|  | 
 | ||
|  | nonelf () | ||
|  | { | ||
|  |   # Maybe extra code for non-ELF binaries. | ||
|  |   return 1; | ||
|  | } | ||
|  | 
 | ||
|  | add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now" | ||
|  | add_env="$add_env LD_LIBRARY_VERSION=\$verify_out" | ||
|  | 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" | ||
|  |   echo >&2 $"Try \`ldd --help' for more information." | ||
|  |   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. | ||
|  |   test $single_file = t || echo "${file}:" | ||
|  |   case $file in | ||
|  |   */*) : | ||
|  |        ;; | ||
|  |   *) file=./$file | ||
|  |      ;; | ||
|  |   esac | ||
|  |   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=$? | ||
|  | 	case $ret in | ||
|  | 	[02]) RTLD=${rtld}; break;; | ||
|  | 	esac | ||
|  |       fi | ||
|  |     done | ||
|  |     case $ret in | ||
|  |     0) | ||
|  |       # 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. | ||
|  |       nonelf "$file" || { | ||
|  | 	echo $"	not a dynamic executable" | ||
|  | 	result=1 | ||
|  |       } | ||
|  |       ;; | ||
|  |     2) | ||
|  |       try_trace "$RTLD" "$file" || result=1 | ||
|  |       ;; | ||
|  |     *) | ||
|  |       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 | ||
|  |     result=1 | ||
|  |   fi | ||
|  | done | ||
|  | 
 | ||
|  | exit $result | ||
|  | # Local Variables: | ||
|  | #  mode:ksh | ||
|  | # End: |