[Gllug] pimping my elf

Nix nix at esperi.org.uk
Sun Jun 18 11:50:43 UTC 2006

On Wed, 14 Jun 2006, Alex Sayle stated:
> it looks a bit like <somepath>/bar/<version>/{lib,include,share} so
> we can have multiple libbar's co-existing.

I do this, roughly, using GNU stow. epkg, DEPOT, STORE and other systems
do much the same (with ever-increasing degrees of flexibility and

> For simplicity we then take bar/<version>/lib/libbar.so.<version> and
> install into a central LIB directory. For some historic reason when
> we do this the libraries are renamed to libbar-<version>.so.

The first part should be a matter of course, with every active thing in
the installed tree being symlinked into the stow tree (/usr/local or
whatever). Arrange for apps to look into the stow tree instead of the
installed tree for everything, and you're home free.

(Aside; KDE needs a tiny patch for this or its menus get all mangled.
So does AmaroK. Available on request; I'll push them upstream when I
get around to upgrading KDE from 3.$ANCIENT.)

But renaming the libraries is somewhere between dangerous and lunatic and
*really* shouldn't happen.

The transformations I apply to install-time trees pre-stowing are:

 - gzip manpages and transform the names in .so links in them (that's the
   groff .so command used as a sort of strange symlink/#include replacement,
   not shared libraries!)

 - gzip info pages and install-info them into the info/dir file

 - similar with XML and SGML catalogs

 - move certain things onto the root filesystem (which I don't manage with
   stow) and repoint symlinks to any shared libraries I so move

 - strip every binary with --strip-unneeded (note that `binary' here includes
   shared objects but does *not* include object files! Strip the object
   files in a gcc install and you've just wrecked your compiler)

 - eliminate the libtool dependency library stuff, which is only needed for 
   static libs (which I don't use):

[[ -d lib ]] && find lib -name "*.la" -print0 | xargs -0r sed -i 's/^dependency_libs='"'"'.*'"'"'$/dependency_libs='"''"'/; /^libdir=/s,packages\.bin/[^/]*/[^/]*/usr/,,'

 - zap .a files which have corresponding .so's (I'll never use the .a's)

Post-stowing, I run ldconfig, and scan for missing symbols or non-PIC
code in libraries (which stymie prelinking).

Note that at no point here are libraries hex-edited! The soname of a
library is part of its published ABI and should *not* be changed.  You
can rename the library all you like and ldconfig will create appropriate
symlinks for you if they're missing (although because those symlinks
aren't stowed, I'd recommend against it; it'll cause you problems when
next you upgrade when the symlinks break).

> this name change can be an issue and rather than going against the grain
> I'd like to get it working as is. So, here's the question, does anyone
> know a non hexedit or binary sed hackery way to change link targets  in a an elf binary.

You could do it with libelf, but it would be annoying. Among other
things, if the new name is longer than the old you may have quite a lot
of work to do if the DT_NEEDED tag value needs expanding.

There's never a need to do this unless the library doesn't bother to
maintain its sonames properly (and virtually all of them do), and by
doing this you *destroy* any chance of interoperability with other Linux
systems. ELF handles this stuff for you; don't make your life difficult
by shooting it in the foot.

I have ~1200 packages with libraries in on the systems I maintain with
GNU stow (the only nonstowed stuff on those systems outside of the root
filesystem is GNU libc). I've never *once* had to edit sonames. Sometimes
I have to create a temporary installation of just the shared library
parts of a package if its ABI is breaking and I want to maintain the
old library until dependent code is updated, but that's the most that's

> 0x00000001 (NEEDED)                     Shared library: [libbar.so.4.2]
> to
> 0x00000001 (NEEDED)                     Shared library: [libbar-4.2.so]
> with out re-linking the whole thing.
> any marvellous ideas ?

libelf, and pray. Hard.

`Voting for any American political party is fundamentally
 incomprehensible.' --- Vadik
Gllug mailing list  -  Gllug at gllug.org.uk

More information about the GLLUG mailing list