I’ve written a shared object that modifies the arguments to FreeType’s FT_Load_Glyph and FT_Render_Glyph functions, currently by interposing it with LD_PRELOAD and dlsym.
This works fine, but I’m curious to know whether or not there’s a way to make these changes:
- to all programs that use FreeType on a given host (running e.g. Debian);
- without clobbering any programs that aren’t actually linked to FreeType;
- without simply applying an
LD_PRELOADto all programs on the host; - without requiring any maintenance unless FreeType’s soname is changed; and
- without modifying any of FreeType’s files, nor those of any programs on the host.
The only two “solutions” that I’ve been able to come up with are ugly hacks:
- to
LD_PRELOADall programs, all of the time, which seems slow and fragile; or - to copy e.g.
libfreetype.so.6.12.3tolibxxxxtype.so.6.12.3; then- patch the soname in
libxxxxtype.so.6.12.3tolibxxxxtype.so.6; - link the interposing shared object against
libxxxxtype.so.6; and - install the shared object as e.g.
libfreetype.so.6.999.
- patch the soname in
I’d essentially like to transparently patch a couple of functions in a shared object, while letting the remaining functions through, without necessarily having access to the source of the shared object or the programs that use it, but if I make a fake shared object with the soname libfreetype.so.6, I can’t see a clean way to link it to (or dlopen) the real libfreetype.so.6.
This is my first real experiment with shared libraries, so please bear with me if this question makes some incorrect assumptions, or just makes no sense.