I don't know if you already know this but here it is
libc isn't neccesary, it's necesary at compile time, cause it has the info that is needed by the program to 'do things'.
If I do a:
The way of do that printf in 'computer languaje' is stored in glibc. But when I'm making a binary of that you can choise if you want to make it to search on the libc (glibc, culibc, etc) or store it in the binary itself.
Making a big binary, with all the instructions inside, its called static.
Making a small binary, that has the direction of where are the instructions (glibc) is called shared.
The pros and cons: When using a static binary you don't need anything else. But the functions inside it, the store 'ways of do things' inside, are never gonna be actualized. Also the binary use to be to mouch big in filesize. The shared way (the stantard of the distros for distribute binarys) need some run time dependencis, glibc basic, mostly, if it needs other lib, like libpng for example, libpng also is gonna to need glibc.
I hope this is usefull in any way.