Today is a short day to work, my connection is unstable and unusable, and tonight I’m out with a couple of friends of mine.
So I simply prepared a (complex) oneliner to gather some statistics about media libraries I have installed in my system, out of the static archives (so it’s not the worst case).
qlist -I -v media-libs -C |
while read pkg; do
pkgname=${pkg##*/}; mkdir -p ${pkgname}; pushd ${pkgname};
qlist $pkg | egrep '.a$' |
while read lib; do
libname=$(basename $lib); mkdir -p $libname; pushd $libname;
ar x ${lib};
ruby -I ~/devel/repos/ruby-elf ~/devel/repos/ruby-elf/cowstats.rb --statistics --total *.o > ~/mytmpfs/libstats/${pkgname}:${libname};
popd;
done;
popd;
done
The result of this, grepped around a bit gave me these statistics:
a52dec-0.7.4-r5:liba52.a: Total 4593 bytes of variables in copy-on-write sections
alsa-lib-1.0.15:libasound.a: Total 13164 bytes of variables in copy-on-write sections
alsa-lib-1.0.15:smixer-ac97.a: Total 192 bytes of variables in copy-on-write sections
alsa-lib-1.0.15:smixer-hda.a: Total 192 bytes of variables in copy-on-write sections
alsa-lib-1.0.15:smixer-python.a: Total 2144 bytes of variables in copy-on-write sections
alsa-lib-1.0.15:smixer-sbase.a: Total 104 bytes of variables in copy-on-write sections
alsa-oss-1.0.15:libalsatoss.a: Total 28 bytes of variables in copy-on-write sections
alsa-oss-1.0.15:libaoss.a: Total 128 bytes of variables in copy-on-write sections
alsa-oss-1.0.15:libossredir.a: Total 112 bytes of variables in copy-on-write sections
audiofile-0.2.6-r3:libaudiofile.a: Total 6408 bytes of variables in copy-on-write sections
faac-1.26-r1:libfaac.a: Total 9612 bytes of variables in copy-on-write sections
faad2-2.6.1:libfaad.a: Total 8138 bytes of variables in copy-on-write sections
flac-1.2.1-r2:libFLAC.a: Total 1044 bytes of variables in copy-on-write sections
fontconfig-2.5.0-r1:libfontconfig.a: Total 2196 bytes of variables in copy-on-write sections
gd-2.0.35:libgd.a: Total 144508 bytes of variables in copy-on-write sections
giflib-4.1.6:libgif.a: Total 1043 bytes of variables in copy-on-write sections
ilmbase-1.0.1:libHalf.a: Total 1 bytes of variables in copy-on-write sections
ilmbase-1.0.1:libIex.a: Total 8 bytes of variables in copy-on-write sections
ilmbase-1.0.1:libIlmThread.a: Total 16 bytes of variables in copy-on-write sections
ilmbase-1.0.1:libImath.a: Total 311 bytes of variables in copy-on-write sections
imlib-1.9.15-r2:libImlib.a: Total 28 bytes of variables in copy-on-write sections
imlib2-1.4.0:id3.a: Total 8 bytes of variables in copy-on-write sections
imlib2-1.4.0:libImlib2.a: Total 17468 bytes of variables in copy-on-write sections
imlib2-1.4.0:xpm.a: Total 8 bytes of variables in copy-on-write sections
jasper-1.900.1-r1:libjasper.a: Total 13703 bytes of variables in copy-on-write sections
lcms-1.17:liblcms.a: Total 11002 bytes of variables in copy-on-write sections
libao-0.8.8:libalsa09.a: Total 96 bytes of variables in copy-on-write sections
libao-0.8.8:libao.a: Total 590 bytes of variables in copy-on-write sections
libao-0.8.8:liboss.a: Total 72 bytes of variables in copy-on-write sections
libao-0.8.8:libpulse.a: Total 80 bytes of variables in copy-on-write sections
libart_lgpl-2.3.19-r1:libart_lgpl_2.a: Total 16 bytes of variables in copy-on-write sections
libcddb-1.3.0-r1:libcddb.a: Total 2472 bytes of variables in copy-on-write sections
libdvdcss-1.2.9-r1:libdvdcss.a: Total 2064 bytes of variables in copy-on-write sections
libdvdread-0.9.7:libdvdread.a: Total 2108 bytes of variables in copy-on-write sections
libexif-0.6.16-r1:libexif.a: Total 51096 bytes of variables in copy-on-write sections
libgpod-0.6.0:libgpod.a: Total 20 bytes of variables in copy-on-write sections
libid3tag-0.15.1b:libid3tag.a: Total 1 bytes of variables in copy-on-write sections
liblrdf-0.4.0:liblrdf.a: Total 57376 bytes of variables in copy-on-write sections
libmikmod-3.1.11-r5:libmikmod.a: Total 7798 bytes of variables in copy-on-write sections
libmp4v2-1.5.0.1:libmp4v2.a: Total 288 bytes of variables in copy-on-write sections
libsdl-1.2.13:libSDL.a: Total 49795 bytes of variables in copy-on-write sections
libsndfile-1.0.17-r1:libsndfile.a: Total 18651 bytes of variables in copy-on-write sections
libsvg-0.1.4:libsvg.a: Total 552 bytes of variables in copy-on-write sections
libvorbis-1.2.0:libvorbis.a: Total 4 bytes of variables in copy-on-write sections
netpbm-10.40.0:libnetpbm.a: Total 10612 bytes of variables in copy-on-write sections
openexr-1.6.1:libIlmImf.a: Total 1205 bytes of variables in copy-on-write sections
raptor-1.4.16:libraptor.a: Total 3365 bytes of variables in copy-on-write sections
sdl-gfx-2.0.16:libSDL_gfx.a: Total 6184 bytes of variables in copy-on-write sections
sdl-image-1.2.6:libSDL_image.a: Total 67259 bytes of variables in copy-on-write sections
sdl-mixer-1.2.8:libSDL_mixer.a: Total 495 bytes of variables in copy-on-write sections
sdl-net-1.2.7:libSDL_net.a: Total 7 bytes of variables in copy-on-write sections
sdl-pango-0.1.2:libSDL_Pango.a: Total 44 bytes of variables in copy-on-write sections
sdl-ttf-2.0.9:libSDL_ttf.a: Total 19 bytes of variables in copy-on-write sections
smpeg-0.4.4-r9:libsmpeg.a: Total 117478 bytes of variables in copy-on-write sections
t1lib-5.1.1:libt1.a: Total 45191 bytes of variables in copy-on-write sections
tiff-3.8.2-r3:libtiff.a: Total 7746 bytes of variables in copy-on-write sections
x264-svn-20070924:libx264.a: Total 16832 bytes of variables in copy-on-write sections
xvid-1.1.3-r2:libxvidcore.a: Total 209384 bytes of variables in copy-on-write sections
As you can see there’s quite some space for improvement, and remember that these statistics are done on non-PIC objects, the PIC objects will have probably more, within .data.rel sections.
I’ll be writing a few more patches around for this, trying to reduce the numbers as much as I can, even if sometimes it won’t cause much improvement on the actual shared library, either because of relocation of symbols, or just because there are one or two static variables that cause the 4KB for the cow section to be allocated.
My overlay now features patches to mark tables as constant for: libvorbis, libtheora, libpng, giflib, speex, flac, libdca and libmpcdec. I’ll add a few more either tonight when I come home or tomorrow, or anyway in the next weeks.
All the patches were sent to the respective upstream, so that they can be applied there and be available for everybody in the future.
Hopefully some of them might just be applied in Gentoo too, soon 🙂