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.