#! /bin/sh # # Name: # # ldd show shared libraries used by a program. # # Usage: # # ldd [-h|-help] | -man | [-arch] [options] # program [ . . . ] # # Description: # # This Bourne shell script calls the appropriate platform # specific command to search a program for shared library # information. You can also view the manual page for the # command used. # # Options: # # -h | -help - Help. Print usage. # # -man - View manual page for command used. # # -arch - Assume local host has architecture arch. # # options - Platform specific options. See the # the manual page for details. # # program - Program to search. # # [ . . . ] - Additional programs to search. # # Note(s): 1. Commands with options to use: # # sol2: /usr/bin/ldd # sol64: /usr/bin/ldd # glnx86: /usr/bin/ldd # glnxi64: /usr/bin/ldd # mac: /usr/bin/otool -L # maci: /usr/bin/otool -L # maci64: /usr/bin/otool -L # # Copyright 1984-2007 The MathWorks, Inc. # All Rights Reserved. #----------------------------------------------------------------------- #23456789012345678901234567890123456789012345678901234567890123456789012 # trap "exit 1" 1 2 3 15 # # Do not use ARCH if it exists in the environment # ARCH="" # #========================= archlist.sh (start) ============================ # # usage: archlist.sh # # abstract: This Bourne Shell script creates the variable ARCH_LIST. # # note(s): 1. This file is always imbedded in another script # # Copyright 1997-2013 The MathWorks, Inc. #---------------------------------------------------------------------------- # ARCH_LIST='glnxa64 maci64' #======================================================================= # Functions: # check_archlist () #======================================================================= check_archlist () { # Sets ARCH. If first argument contains a valid # arch then ARCH is set to that value else # an empty string. If there is a second argument # do not output any warning message. The most # common forms of the first argument are: # # ARCH=arch # MATLAB_ARCH=arch # argument=-arch # # Always returns a 0 status. # # usage: check_archlist arch=[-]value [noprint] # if [ $# -gt 0 ]; then arch_in=`expr "$1" : '.*=\(.*\)'` if [ "$arch_in" != "" ]; then ARCH=`echo "$ARCH_LIST EOF $arch_in" | awk ' #----------------------------------------------------------------------- { for (i = 1; i <= NF; i = i + 1) if ($i == "EOF") narch = i - 1 for (i = 1; i <= narch; i = i + 1) if ($i == $NF || "-" $i == $NF) { print $i exit } }'` #----------------------------------------------------------------------- if [ "$ARCH" = "" -a $# -eq 1 ]; then #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ echo ' ' echo " Warning: $1 does not specify a valid architecture - ignored . . ." echo ' ' #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fi else ARCH="" fi else ARCH="" fi # return 0 } #======================================================================= #========================= archlist.sh (end) ============================== # stat="OK" msg="" # # Verify input # help=0 man=0 if [ $# -eq 0 ]; then stat="" fi while [ "$stat" = "OK" -a $# -gt 0 ]; do case "$1" in -help) # -help: Help option. stat="" help=1 ;; -man) # -man: Man pages. man=1 stat="" ;; -*) # # -arch MUST be the first option on the line for the general # case # check_archlist argument=$1 noprint if [ "$ARCH" != "" ]; then shift fi break ;; *) break ;; esac shift done # # Command and Options # #========================= arch.sh (start) ============================ #!/bin/sh # # usage: arch.sh # # abstract: This Bourne Shell script determines the architecture # of the the current machine. # # ARCH - Machine architecture # # IMPORTANT: The shell function 'check_archlist' is used # by this routine and MUST be loaded first. # This can be done by sourcing the file, # # archlist.sh # # before using this routine. # # note(s): 1. This routine must be called using a . (period) # # 2. Also returns ARCH_MSG which may contain additional # information when ARCH returns 'unknown'. # # Copyright 1986-2011 The MathWorks, Inc. #---------------------------------------------------------------------------- # #======================================================================= # Functions: # realfilepath () # matlab_arch () #======================================================================= realfilepath () { # Returns the actual path in the file system # of a file. It follows links. It returns an # empty path if an error occurs. # # Returns a 1 status if the file does not exist # or appears to be a circular link. Otherwise, # a 0 status is returned. # # usage: realfilepath filepath # filename=$1 # # Now it is either a file or a link to a file. # cpath=`pwd` # # Follow up to 8 links before giving up. Same as BSD 4.3 # n=1 maxlinks=8 while [ $n -le $maxlinks ] do # # Get directory correctly! # newdir=`echo "$filename" | awk ' { tail = $0 np = index (tail, "/") while ( np != 0 ) { tail = substr (tail, np + 1, length (tail) - np) if (tail == "" ) break np = index (tail, "/") } head = substr ($0, 1, length ($0) - length (tail)) if ( tail == "." || tail == "..") print $0 else print head }'` if [ ! "$newdir" ]; then newdir="." fi (cd "$newdir") > /dev/null 2>&1 if [ $? -ne 0 ]; then return 1 fi cd "$newdir" # # Need the function pwd - not the built in one # newdir=`/bin/pwd` # newbase=`expr //"$filename" : '.*/\(.*\)' \| "$filename"` lscmd=`ls -ld "$newbase" 2>/dev/null` if [ ! "$lscmd" ]; then return 1 fi # # Check for link portably # if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then filename=`echo "$lscmd" | awk '{ print $NF }'` else # # It's a file # dir="$newdir" command="$newbase" # cd "$dir" # # On Mac OS X, the -P option to pwd causes it to return a resolved path, but # on 10.5, -P is no longer the default, so we are now passing -P explicitly # if [ "$ARCH" = 'mac' -o "$ARCH" = 'maci' -o "$ARCH" = 'maci64' ]; then echo `/bin/pwd -P`/$command # # The Linux version of pwd returns a resolved path by default, and there is # no -P option # else echo `/bin/pwd`/$command fi break fi n=`expr $n + 1` done if [ $n -gt $maxlinks ]; then return 1 fi cd "$cpath" } # #======================================================================= set_mac_arch() { # First check to see if maci64 is even possible on this hardware if [ "`/usr/sbin/sysctl -n hw.cpu64bit_capable`" = "0" ]; then # maci64 is not possible. So set the arch to maci. ARCH="maci" return fi # Now check to see if maci64 is asked for if [ "$MACI64" = "0" ]; then # only maci is wanted, so arch is maci. ARCH="maci" return fi # If we get to this point, maci64 is available and desired. So, check to # see if 64 bit binaries are available. First, if $MATLABROOT is NOT # set, we can't really check for anything else. if [ "$MATLABROOT" = "" ]; then ARCH="maci64"; return fi # if we get to this point, we need to check the binaries that we have to # find out if we have maci64 binaries if [ -d "$MATLABROOT/bin/maci64" ]; then ARCH="maci64" return fi # if we get to this point, even though maci64 is possible and desired, # the maci64 binaries aren't available, so fall back to maci ARCH="maci" } # #======================================================================= matlab_arch () { # Determine the architecture for MATLAB # It returns the value in the ARCH variable. # If 'unknown' is returned then sometimes a # diagnostic message is returned in ARCH_MSG. # # Always returns a 0 status. # # usage: matlab_arch # ARCH="unknown" # if [ -f /bin/uname ]; then case "`/bin/uname`" in SunOS) # Solaris case "`/bin/uname -p`" in sparc) ARCH="sol64" ;; i386) ARCH="sola64" ;; esac ;; Linux) case "`/bin/uname -m`" in i*86) ARCH="glnx86" ;; x86_64) ARCH="glnxa64" ;; esac ;; # Usually uname lives in /usr/bin on the Mac, but sometimes people # have links in /bin that link uname to /usr/bin. Because of this # Mac needs to be listed in the checks for both /bin/uname and /usr/bin/uname Darwin) # Mac OS X case "`/bin/uname -p`" in i386) set_mac_arch ;; esac ;; *) : ;; esac elif [ -f /usr/bin/uname ]; then case "`/usr/bin/uname`" in Darwin) # Mac OS X case "`/usr/bin/uname -p`" in i386) set_mac_arch ;; esac ;; esac fi return 0 } #======================================================================= # # The local shell function check_archlist is assumed to be loaded before this # function is sourced. # ARCH_MSG='' check_archlist ARCH=$ARCH if [ "$ARCH" = "" ]; then if [ "$MATLAB_ARCH" != "" ]; then check_archlist MATLAB_ARCH=$MATLAB_ARCH fi if [ "$ARCH" = "" ]; then matlab_arch fi fi Arch=$ARCH #========================= arch.sh (end) ============================== # case "$ARCH" in glnx86) cmd=/usr/bin/ldd mancmd=ldd options= ;; glnxi64) cmd=/usr/bin/ldd mancmd=ldd options= ;; mac|maci|maci64) cmd='xcrun otool ' mancmd=otool options=-L ;; *) cmd=/usr/bin/ldd mancmd=ldd options= ;; esac # if [ "$stat" = "" ]; then if [ "$man" != "0" ]; then man $mancmd exit 1 fi if [ "$msg" != "" ]; then #----------------------------------------------------------------------- echo " " echo " Error: $msg" echo " " #----------------------------------------------------------------------- fi #------------------------------------------------------------------------------ echo "-----------------------------------------------------------------" echo " " echo " usage: ldd [-h|-help] | -man | [-arch] [options]" echo " program [ . . . ]" echo " " echo " -h|-help - Print Usage." echo " -man - View manual page for command used." echo " -arch - Assume local host has architecture arch." echo " options - Platform specific options. See the" echo " manual page for details." echo " program - Program to search." echo " " echo " DEFAULT: executes '$cmd $options [options] program [ . . . ]'" echo " " echo " Show shared libraries used by a program. You can also" echo " view the manual page for the command used." echo " " echo "-----------------------------------------------------------------" #------------------------------------------------------------------------------ exit 1 fi # $cmd $options $* exit $?