https://web.mit.edu/rhel-doc/3/rhel-gcc-en-3/link-options.html-nostartfiles
Do not use the standard system startup files when linking.
The standard system libraries are used normally, unless -nostdlib or -nodefaultlibs is used.-nodefaultlibs
Do not use the standard system libraries when linking. Only the libraries you specify will be passed to the linker.
The standard startup files are used normally, unless -nostartfiles is used. The compiler may generate calls to bcopy and bzero for BSD environments.
These entries are usually resolved by entries in libc.
These entry points should be supplied through some other mechanism when this option is specified.-nostdlib
Do not use the standard system startup files or libraries when linking.
No startup files and only the libraries you specify will be passed to the linker.
The compiler may generate calls to bcopy and bzero for BSD environments.
These entries are usually resolved by entries in libc.
These entry points should be supplied through some other mechanism when this option is specified.
One of the standard libraries bypassed by -nostdlib and -nodefaultlibs is libgcc.a, a library of internal subroutines that GCC uses to overcome shortcomings of particular machines, or special needs for some languages.(,for more discussion of libgcc.a.) In most cases, you need libgcc.a even when you want to avoid other standard libraries.
In other words, when you specify -nostdlib or -nodefaultlibs you should usually specify -lgcc as well. This ensures that you have no unresolved references to internal GCC library subroutines.(For example, __main, used to ensure C++ constructors will be called;.)