Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
use Pod::Usage;
use Env;
my @dirs = ();
my $help = 0;
GetOptions("help|?" => \$help) or pod2usage(2);
pod2usage(-exitval => 0, -verbose => 2) if $help;
die "findinsharedlibs must have a function to search for" if (@ARGV < 1);
@dirs = split(/:/,$ENV{'LD_LIBRARY_PATH'}) if defined($ENV{'LD_LIBRARY_PATH'});
foreach my $line (`ldconfig -v 2> /dev/null`) {
push @dirs,(split /:/, $line)[0] if ($line =~ /^\//);
}
foreach my $thisDir (@dirs) { # iterate through LD_LIBRARY_PATH & ld.conf
chdir $thisDir;
foreach my $file (glob("*.a *.so")) {
my @list = grep(/$ARGV[0]/,`nm --defined-only -g $file 2> /dev/null`);
print $thisDir . "/" . $file,"\n" if (@list > 0);
}
}
__END__
=head1 NAME
findinsharedlibs - find a routine in the list of possible shared libraries
=head1 SYNOPSIS
findinsharedlibs name_of_routine_to_find
=head1 DESCRIPTION
This short perl script that finds the library where the specified library
is defined. I have hit this case multiple times, trying to port a piece
of Linux code where a specific routine comes up as unresolved and I have
to grep through all the standard library locations, /lib, /usr/lib, etc.
looking for some library that defines that routine. I have not found a
general Linux command to let me do this. This routine searches all the
library pathes defined by ld.conf and LD_LIBRARY_PATH if defined.
For example, I want to know where where the sysfs_ functions are defined.
This was the specific case that caused me to write this:
edt @ centosi.ed-thompson.org ! /home/edt $ findinsharedlibs sysfs_
/usr/lib/libdmraid.a
/usr/lib/libibverbs.a
/usr/lib/liblvm2cmd.a
/usr/lib/libsysfs.a
=cut
@okutane

This comment has been minimized.

Copy link

okutane commented Sep 11, 2016

Nice!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.