views:

202

answers:

2

Is there some simple an efficient way to know that a given dynamically linked ELF is missing a required .so for it to run, all from the inside of a C/C++ program?

I need to program a somewhat similar functionality as ldd, without trying to execute the ELF to find out the (met/unmet) dependencies in the system. perhaps asking the ld-linux.so utility via some library? (I'm a newbie in this part of linux =)

NOTE: reading the source code of ldd was not very helpful for my intentions: it seems that ldd is in fact forking another process and executing the program.

If it's not possible to know that a program has unmet dependencies without executing it, is there some way to, at least, quickly list the .so's required for that elf all from within my program?

Thanks in advance =)

+1  A: 

Have you tried dlopen function? you can use this to load a dynamic library (or, for your case, to ckeck if a library can be loaded).

Having a list of needed libraries is more difficult, take a look to handle_dynamic function on readelf source

Jaime Soriano
that function is interesting, I can see the rpath and another parameters.. I'll investigate further, thanks
conejoroy
+3  A: 

As per ld.so(8), setting the environment variable LD_TRACE_LOADED_OBJECTS to a non-empty string will give ldd-like results (instead of executing the binary or library normally).

setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
ephemient
yes, that will give exactly the same output than ldd (well, with perhaps setting an extra couple of envs more) in fact ldd is nothing else than your code.. but of course, this solution is the same as calling ldd that in turn will call your code.. I was looking for another solution, perhaps querying ld-linux.so in another, more direct way..
conejoroy
.. and without invoking a shell =)
conejoroy
Without invoking a shell is easy -- just `fork` and `exec` (`pipe` first if you want output, and `fdopen` if you really want a `FILE *`) instead of `popen`. This is basically querying `ld-linux.so` without having to hard-code *which* `ld-linux.so`.
ephemient