About three years after starting my work on Ruby-Elf I finally implemented one of the scripts I wanted to write for the longest tile: elfgrep
. At the name implies it’s a tool with a grep-like interface to look up symbols defined and used in ELF files.
I have avoided writing it for a long time because scanelf
(part of pax-utils
) implements already a similar, but definitely not identical, feature through the -gs
options. The main feature missing in scanelf is the ability to look for multiple symbols at once: it does allow you to specify multiple symbols, but then again it only prints the first one found, rather than all of them.
The other night, mru from FFmpeg suggested me another limitation of scanelf
: it cannot be used to look for symbols depending on their version information (for GNU systems). So I finally decided to start writing my own. Thankfully, Ruby-Elf was designed to be easy to extend, if anything, so the original implementation to do the job it was aimed for only required 83 lines of Ruby code, including my license header.
Right now the implementation is a bit more complex, and so it has more lines of code, but it implements a number of switches analogue to those in grep
itself, that makes it a very flexible tool to find both definitions and uses of symbols: you can either look for the library defining a given symbol or the objects making use of those; you can get the type of symbols (it has an output similar to nm(1)
), or you can simply list the files that matched or that didn’t match. You can also count symbols, without having to go through wc -l
thanks to the -c
option, and the list output is suitable to use with xargs -0
as well.
Most of the time, when analysing the output of a library, I end up having to do something like nm | grep
; this unfortunately doesn’t work that well when you have multiple files, as you lose sight of the file that actually hits; elfgrep
solves this just fine as it prefixes the file’s path to the nm
-like output, which makes it terrific to identify which object file exports a given symbol, for instance.
All in all, I’m very very happy at how elfgrep
turned out to be, so I’ll likely try to make a release of ruby-elf
soonish; but to do so I have to make it a Ruby Gem, just for the sake of ease of distribution; I’ll look at it in the next week or so. In the mean time you can find the sources on the project’s page and on my overlay you find an ebuild that installs it from Git until I make a release (I’ll package it in main tree as soon as it is!).
If you have any particular comment, patch, request, or anything like that, feel free to send me an email, you find the references above.
It seems you have overlooked the -A option of nm.
D’uh! Yes I did overlook that; OTOH I still prefer having a single command rather than two to remember the options of.
Might be better named as ‘elflocate’- specifically thinking a cscope like db might be useful for this for binary analysis.If you think through what portage (and various lsb tools) do, such a db would be useful- and would fit rather nicely into what you’re talking about here.
I don’t think _this one_ should be named @elflocate@ but you gave me a good idea for the next step, I guess 😀