Раньше (со старыми версиями gcc и библиотек) это было совсем просто (один из вариантов):
gcc -Xlinker -Bstatic .... -Xlinker -Bdynamic (то, что нужно динамически) -Xlinker -Bstatic ...
Теперь все гораздо сложнее, и меняется с каждой версией.
Я придумал так (может, можно проще?):
Для Сишных программ (НЕ плюсатых!) -- перечисляешь сначала то, что нужно подцепить динамически, потом говоришь -static
Для ЦеПП -- то же самое, но добавляешь после -static -lstdc++ -ldl и линкуешься не g++, а gcc (проверено для gcc 3.2)
Статически слинкованная libc6 все равно захочет грузить libc.so.6 из-за nss. Единственный способ это обойти -- самому собрать libc6 сo static_nss (передать в configure такие ключи: --host=i386-linux --enable -add-ons --disable-profile --enable-static-nss) и линковаться с ней статически.