问题
Is there a simple and 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 a program with 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 thatldd
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:
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");
回答2:
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
回答3:
What about using ptrace() to trace all open() calls to find all what the program depends on (however, the output includes files,not only libraries).Or maybe filtering the output by the prefix in file name "/lib" helps.
来源:https://stackoverflow.com/questions/1519684/linux-gcc-ldd-functionality-from-inside-a-c-c-program