Varun Chitre
Varun Chitre

Reputation: 3230

Checking for missing shared libraries (.so) from another shared library

I have a whole bunch of around 500 libraries each of them depending on one another(shared libraries)

The problem is one/few of them are failing to load due to a missing dependency library and I have no logs about which is failing due to what missing library. Due to the large number I cannot analyze it on y own with a hex editor. This scenario is from an android phone. So if I keep all of the .so libraries at one place, is there any way to write a script which analyzes each library for its dependencies and checks its existence in the given directory?

What approach should be followed to do this as AFAIK is possible to list shared libraries only of a dynamic executable using ldd.

Upvotes: 0

Views: 9701

Answers (3)

Vaishali Sutariya
Vaishali Sutariya

Reputation: 5121

Remove

<uses-library android:name="org.apache.commons.lang"/>

This is only for Android Project Libraries not a plain old Jar file. Jar files will have their classes extracted and put into your apk by just including them in the build path.

Upvotes: 0

SIGSEGV
SIGSEGV

Reputation: 412

I'm not entirely sure if I understood you correctly, but I hope my answer helps you anyway.

Normally any dynamic linked binary can be examined with "ldd". It basically shows you all libraries the dynamic linker had to load to in order to resolve all external symbols. This works on libraries, as well as on executables. If you use ldd's "-r" flag, ldd will try to resolve all external symbols, and it will report missing ones.

You can then easily feed the output of "ldd -r" to "grep" and check for missing symbols.

The bash script could then look like this:

find /lib /usr/lib /usr/local/lib -iname "*.so*" | while read lib_name; do
    if ldd -r "$lib_name" 2>&1 | grep -qF "undefined symbol: "; then
        echo "library \"$lib_name\" seems to be broken"
    fi
done

I just wrote this out of my head, might contain minor synax/typing errors.

As I said earlier, this will also work on executables, in case you need it.

In case you need to extend your library search path, you can use the environment variable "LD_LIBRARY_PATH" for that. Just do:

export LD_LIBRARY_PATH=/path/to/my/libs

Since you specifically stated, that ldd will "only" work on dynamic libraries: Well, a statically linked binary (lib or exe), has no dependencies on other binaries (except for the linux kernel). So I'm not sure what you are looking for in this case ... ?

Upvotes: 5

DThought
DThought

Reputation: 1314

ldd works for .so files as well

Try:

cd /usr/lib   
ldd * 

that will list all dynamic .so files used by the libraries, tries to resolv them, and show you anything that's missing.

Upvotes: 1

Related Questions