Generally you have to use the proper building environment which contains all target libraries with the needed or compatible versions. The difference between libc variants is not only in linked library name itself. For example, required configuration files can differ. Some interfaces can be provided with header-level inline wrappers which mutated between versions. It's generally safe to run a binary with a newer library version, but not with an older one.
But, if you have a development package of the target libc installed additionally to your system, you could build a binary directly with it using -nostdinc and -nostdlib switches (or call a linker explicitly), and specifying required libraries explicitly. The example could be got from gcc -v
output. From my system, it's final linker command:
/usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 \
-o t /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o \
-L/usr/lib -L/usr/lib /tmp//ccCb5j33.o -lgcc --as-needed -lgcc_s \
--no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed \
/usr/lib/crtend.o /usr/lib/crtn.o
Depending on target libc specifics, you should replace some of these instructions to another ones. Especially, startup (crt1.o and crti.o), cleanup (crtend.o, crtn.o), the libc itself (explicit path instead of -lc) shall be replaced; optionally, the same should meet dynamic linker.
P.S. I see this is too old question but it has been reedited just now:)