How To Determine Dynamic Library Dependencies For An Executable or Library File in OS X

This script uses otool -L to determine and print all dynamic library dependencies of a given executable or library file recursively and you use it like this:

$ checklibs.pl /bin/ls
   /bin/ls:
            /usr/lib/libgcc_s.1.dylib
            /usr/lib/libncurses.5.4.dylib
            /usr/lib/libSystem.B.dylib
   /usr/lib/libgcc_s.1.dylib:
            /usr/lib/libSystem.B.dylib
   /usr/lib/libncurses.5.4.dylib:
            /usr/lib/libgcc_s.1.dylib
            /usr/lib/libSystem.B.dylib
   /usr/lib/libSystem.B.dylib:
            /usr/lib/system/libmathCommon.A.dylib

Here’s the script which was written by Marc Liyanage:

#!/usr/bin/perl
#
# Written by Marc Liyanage <http://www.entropy.ch>
# use strict;
use warnings; 

my ($file) = @ARGV;
die $! unless (-f $file); 

my $libs = {};
check_libs(file => $file, libs => $libs); 

print
	map {("\n$_:\n", map {"\t$_\n"} sort {lc($a) cmp lc($b)} @{$libs->{$_}})}
	sort {lc($a) cmp lc($b)}
	grep {@{$libs->{$_}}}
	keys(%$libs);
sub check_libs {
	my (%args) = @_;
	my $libs = $args{libs};
	my @file_libs = grep {$_ ne $args{file}} grep {$_} map {/^\s+(\S+)/} qx(otool -L $args{file});
	$libs->{$args{file}} = \@file_libs;
	foreach my $lib (grep {!$libs->{$_}} @file_libs) {
		unless (-f $lib) {
			$libs->{$lib} = ['(missing)'];
			next;
		}
		check_libs(%args, file => $lib);
	}
}

In case my blog software mangles the code above, you can download the script in a plain text file by clicking here: checklibs.zip

Code

How to Determine What Shared Libraries a Program Requires in OS X

In Linux you can use the command “ldd” to display what shared libraries a program requires. This is handy if you need to figure out what missing libraries are required to get a program running. Here is the syntax for the Linux ldd command along with example usage for it:

ldd pathToExecuteable

Example:

ldd /usr/bin/ftp

Mac OS X does not include the ldd command. Instead you need to use the command “otool”. Otool gives you basically the same information as what ldd does in Linux. Here is the syntax for the otool command along with example usage for it:

otool -L pathToExecuteable

Example:

otool -L /usr/bin/ftp

Mac OS X Terminal

Fink Error While Upgrading from 10.4-Transitional to 10.4 Final

While upgrading Fink from the the 10.4-Transitional branch to the 10.4 final branch you may get an error similar to this after running update.pl:

Can’t locate Fink/Bootstrap.pm in @INC (@INC contains: /System/Library/Perl/5.8.6/darwin-thread-multi-2level
/System/Library/Perl/5.8.6 /Library/Perl/5.8.6/darwin-thread-multi-2level /Library/Perl/5.8.6 /Library/Perl
/Network/Library/Perl/5.8.6/darwin-thread-multi-2level /Network/Library/Perl/5.8.6 /Network/Library/Perl
/System/Library/Perl/Extras/5.8.6/darwin-thread-multi-2level /System/Library/Perl/Extras/5.8.6/Library/Perl/5.8.1/darwin-thread-multi-2level /Library/Perl/5.8.1 .) at ./update.pl line 36.

To fix the problem, execute the script with this command:

sudo env PERL5LIB=$PERL5LIB ./update.pl

You may need to add the “/sw/lib/perl5/Fink” to your PERL5LIB environment variable which can be modified by editing your .bash_profile file in your home directory.

Fink Logo

Unable to Move Fink Directory Error when trying to Self Update

Fink is a great program that makes installing open source applications easy in OS X. One day when running self update in fink I got an error that said the process was unable to move the Fink directory. To fix this error you need to remove the old fink directory and its associated temporary file:

sudo rm -R /sw/fink.old
sudo rm fink.tmp

Fink Logo