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

Posted on Posted in Apple

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

One thought on “How To Determine Dynamic Library Dependencies For An Executable or Library File in OS X

Leave a Reply

Your email address will not be published. Required fields are marked *