to list all methods from a shared library I use the
objdump -T shared_library.so
what has an output like this:
00013318 g DF .text 00000020 Base apr_os_dir_get 0001afc0 g DF .text 000000f8 Base apr_socket_send 00020808 g DF .text 00000004 Base apr_shm_create_ex
But when I try to pipe the output of find into objdump like this
find ./lib -name "*.so" | objdump -T
I get this error:
objdump: 'a.out': No such file
and this lib folder does contain a lot of shared library files.
What is wrong with my command?
SK
Advertisement
Answer
find ./lib -name "*.so" | xargs objdump -T
or
find ./lib -name "*.so" -exec objdump -T {} +
objdump
expects the name of the library to be passed on the command line. However, piping the output of find
to it sends the filenames to objdump
’s standard input, which it ignores. If you don’t give objdump
a filename on the command line, it defaults to looking for one named a.out
, which is the default output filename of some compilers and linkers.
There are a couple ways to use the files found by find
as parameters to objdump
.
xargs
xargs
reads from standard input and then runs another command with what it read from standard input as that command’s arguments. In this case, the filenames in the output of find
will be piped to xargs
, which will concatenate them into a single line, append it to the command argument from its own command line, and run that. For example, if the lib
folder contains the three files libone.so
, libtwo.so
, and libthree.so
, xargs
will run the command objdump -T libone.so libtwo.so libthree.so
.
Some commands do not accept multiple filenames at a time, and must instead be called multiple times with only a single filename argument. To do this, pass -n1
to xargs
, e.g. find ./lib -name "*.so" | xargs -n1 objdump -T
. With the above example files, xargs
would run objdump -T libone.so
, then objdump -T libtwo.so
, and then objdump -T libthree.so
. (Though objdump
does accept multiple filename arguments, so it is not necessary in this case unless the lib
folder contains so many files that you’re worried about exceeding the maximum command line length.)
find -exec
find
has its own option to run commands and pass the filenames it found as command-line arguments. The -exec
option accepts a command, and replaces the string {}
with the filename or filenames found, with +
indicating the end of the command to run.
If you want to run the command multiple times with only a single filename, like xargs -n1
does, use ;
instead of +
in the command: find ./lib -name "*.so" -exec objdump -T {} ;
.