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
,libieee
conforme necessário, usando um macro e as sequências de caractereslib
elibgcc
spec; -
%{!nostdlib:%{!nostartfiles:%S}}
- isso adiciona a stringstartfile
spec, que especifica os arquivos de objetos a serem adicionados para manipular a inicialização (crti.o
etc.) -
%{!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 stringendfile
spec, que especifica os arquivos de objeto a serem adicionados para manipular as sobras (crtfastmath.o
,crtend.o
etc.)
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.)