@ Joao:
It's the C runtime you are talking about. Yes, C requires a runtime environment... not only for the argc / argv handling you mentioned. Every "hosted" application (i.e., everything running in user space) needs quite a couple of things happening before main() is even entered. You need a function pointer vector of signal handlers. You need your malloc() control structures initialized. You need the stdin, stdout and stderr streams set up, and the default locale loaded. You need another function pointer vector where you can register functions with atexit(), and you need code that actually calls those functions when exit() or the end of main() is reached.
The file, if I remember correctly, is named crt0.o, and it is part of GCC, not glibc. You can avoid all this with the option --freestanding, but you wouldn't end up with a "working" application in the classical sense.
@ belhifet:
AFAICT, glibc would only get linked in if you use "standard"-named functions (like puts()), and
don't define them yourself.
-nostdinc suppresses the searching of the "standard" include paths when looking for <someheader.h>. Only what you specify yourself using -I gets searched.
-nostartfiles suppresses linking of the runtime I mentioned above. You will have to provide your own _start.
-nodefaultlibs suppresses linking of the "standard" library object files. Only what you specify yourself gets passed to the linker. Note that GCC generates calls to memory functions (memset, memcmp, memcpy, memmove) by itself, so you have to provide these. Also not linked in is libgcc.a, which provides quite some support functions (e.g. for C++). You might want to do -nodefaultlibs -lgcc, to get no glibc object files but still have libgcc.a.
-nostdlib is equivalent to -nostartfiles -nodefaultlibs.
Hope this helps.