On Tuesday 13 February 2007 13:33:58 Ralf Wildenhues wrote: > * Christian Parpart wrote on Tue, Feb 13, 2007 at 11:59:35AM CET: > > I want to override some functions located in libGL.so and libX11.so, in > > order to capture movies from (any) OpenGL application. > > > > There are now several ways to achieve this, but none of them seems to be > > userfriendly *and* ideal (system/platform independant). > > The question is how portable you want to be. Only Gentoo? Only > GNU/Linux? Only ELF systems? Only GNU binutils ld? Or also, say, w32, > or AIX non-runtimelinking, or otherwise native non-GNU linker? > Can we assume the libGL and libX11 all come from X.org? > Is using a wrapper shell script acceptable for you? > Is patching a binary (a la objcopy) acceptable for you?>
I found a solution to this problem I'd like to share here (see attachemed Makefile.am). However, this way I had to modify the system libGL/libX11 files by stripping away their DT_SONAME. I did not manage how to do so, but I at least found a way to rename this entry. With this build system, the user is expected to have the $(libdir) in LD_LIBRARY_PATH (or /etc/ld.so.conf), which is much better than enforcing him to use LD_PRELOAD_LIBRARY because now the lib is only loaded when the client app is linked against libGL and/or libX11. However, I do not know how portable this is ;) Christian.
AM_CXXFLAGS = -ansi -pedantic -Wall @CAPTURY_CFLAGS@ -DVERSION="\"@[EMAIL PROTECTED]"" AM_CFLAGS = -std=c99 -Wall STRIP_SONAME = $(top_builddir)/src/libGLcaptury/strip-soname # FIXME libGLnative.so and libX11native.so are always rebuilt - why? NATIVE_LIBGL = /usr/lib/libGL.so NATIVE_LIBX11 = /usr/lib/libX11.so # --------------------------------------------------------------------------- noinst_PROGRAMS = strip-soname strip_soname_SOURCES = strip-soname.c strip_soname_LDFLAGS = -lelf # --------------------------------------------------------------------------- libGL.so: libGL.so.1 ln -sf $< $@ libGL.so.1: libGLnative.so ln -sf libGLcaptury.so $@ libGLnative.so: $(NATIVE_LIBGL) strip-soname cp -p $< $@ $(STRIP_SONAME) $@ # --------------------------------------------------------------------------- libX11.so: libX11.so.6 ln -sf $< $@ libX11.so.6: libGLnative.so ln -sf libGLcaptury.so $@ libX11native.so: $(NATIVE_LIBX11) strip-soname cp -p $< $@ $(STRIP_SONAME) $@ # --------------------------------------------------------------------------- libGLcaptury.so: libGLcaptury.cpp libGLnative.so libX11native.so $(CXX) -shared -fPIC $(AM_CXXFLAGS) $(CXXFLAGS) -o $@ $< $(CAPTURY_LIBS) -L. -lGLnative -lX11native # --------------------------------------------------------------------------- all-local: libGLcaptury.so libGL.so libX11.so clean-local: rm -f libGLcaptury.so rm -f libGLnative.so libGL.so.1 libGL.so libG_.so.1 rm -f libX11native.so libX11.so.6 libX11.so libX1_.so.6 rm -f strip-soname # --------------------------------------------------------------------------- install-exec-local: install-libGLnative install-libX11native install-libGLcaptury install-libGLnative: $(INSTALL) -m 0755 libGLnative.so $(DESTDIR)$(libdir)/ ln -sf libGL.so.1 $(DESTDIR)$(libdir)/libGL.so ln -sf libGLcaptury.so $(DESTDIR)$(libdir)/libGL.so.1 install-libX11native: $(INSTALL) -m 0755 libX11native.so $(DESTDIR)$(libdir)/ ln -sf libX11.so.6 $(DESTDIR)$(libdir)/libX11.so ln -sf libGLcaptury.so $(DESTDIR)$(libdir)/libX11.so.6 install-libGLcaptury: $(INSTALL) -m 0755 libGLcaptury.so $(DESTDIR)$(libdir)/ # --------------------------------------------------------------------------- uninstall-local: uninstall-libGLnative uninstall-libX11native uninstall-libGLcaptury uninstall-libGLnative: rm -f $(DESTDIR)$(libdir)/libGL.so rm -f $(DESTDIR)$(libdir)/libGL.so.1 rm -f $(DESTDIR)$(libdir)/libGLnative.so uninstall-libX11native: rm -f $(DESTDIR)$(libdir)/libX11.so rm -f $(DESTDIR)$(libdir)/libX11.so.6 rm -f $(DESTDIR)$(libdir)/libX11native.so uninstall-libGLcaptury: rm -f $(DESTDIR)$(libdir)/libGLcaptury.so # vim:ai:noet:ts=4:nowrap
pgpWpT0hnPJLE.pgp
Description: PGP signature