Esses sinalizadores são definidos nos arquivos de especificação do GCC , portanto, a melhor maneira de determinar as diferenças entre eles é olhar para lá:
gcc -dumpspecs
A parte relevante é a definição link_command . Isso mostra que -nostdlib , -nodefaultlibs e -nostartfiles têm o seguinte impacto:
-
%{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}- isso adicionalibgcc,libpthread,libc,libieeeconforme necessário, usando um macro e as sequências de caractereslibelibgccspec; -
%{!nostdlib:%{!nostartfiles:%S}}- isso adiciona a stringstartfilespec, que especifica os arquivos de objetos a serem adicionados para manipular a inicialização (crti.oetc.) -
%{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end} %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}- isso adiciona verificação de tabela virtual usandolibvtv -
%{!nostdlib:%{!nodefaultlibs:%{mmpx:%{fcheck-pointer-bounds: %{static:--whole-archive -lmpx --no-whole-archive %:include(libmpx.spec)%(link_libmpx)} %{!static:%{static-libmpx:-Bstatic --whole-archive} %{!static-libmpx:--push-state --no-as-needed} -lmpx %{!static-libmpx:--pop-state} %{static-libmpx:--no-whole-archive -Bdynamic %:include(libmpx.spec)%(link_libmpx)}}}}%{mmpx:%{fcheck-pointer-bounds:%{!fno-chkp-use-wrappers: %{static:-lmpxwrappers} %{!static:%{static-libmpxwrappers:-Bstatic} -lmpxwrappers %{static-libmpxwrappers: -Bdynamic}}}}}}}- isso lida comlibmpx -
%{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address): %{static-libasan:%:include(libsanitizer.spec)%(link_libasan)} %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(thread): %{static-libtsan:%:include(libsanitizer.spec)%(link_libtsan)} %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):%{static-libubsan:-Bstatic} -lubsan %{static-libubsan:-Bdynamic} %{static-libubsan:%:include(libsanitizer.spec)%(link_libubsan)}} %{%:sanitize(leak): %{static-liblsan:%:include(libsanitizer.spec)%(link_liblsan)}}}}- isso lida com as várias opções de higienização -
%{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}- adiciona as opções de proteção da pilha e repete a sequência do link C (cujas bibliotecas já foram especificadas no início) -
%{!nostdlib:%{!nostartfiles:%E}}- adiciona a stringendfilespec, que especifica os arquivos de objeto a serem adicionados para manipular as sobras (crtfastmath.o,crtend.oetc.)
Como você entendeu na documentação, -nostdlib é um superconjunto de -nodefaultlibs e -nostartfiles . Também desativa a verificação de tabela virtual.
Portanto, -nostdlib é suficiente para desativar todos os recursos relacionados; -nodefaultlibs e -nostartfiles não adicionam nada a ele. (Mas não faz mal mencioná-los também.)