Разница между флагами линкера

echo $? вернет код ошибки из предыдущей команды.

try

false ; echo $?
true ; echo $?

ls >> $ File 2> & 1 , перенаправит ( >> ) вывод ls в конец файла, имя которого находится в $ File ], 2> & 1 также перенаправит ошибку, если таковая имеется.

  • >> означает «добавить в файл».
1
27.06.2018, 13:48
1 ответ

Эти флаги определены в файлах спецификаций GCC , поэтому лучший способ определить различия между ними — заглянуть туда:

gcc -dumpspecs

Соответствующей частью является link_commandопределение. Это показывает, что -nostdlib, -nodefaultlibsи -nostartfilesимеют следующее влияние:

  • %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}— при необходимости добавляет libgcc, libpthread, libc, libieeeс помощью макроса и спецификационных строк libи libgcc;
  • %{!nostdlib:%{!nostartfiles:%S}}— это добавляет спецификационную строку startfile, в которой указываются объектные файлы, добавляемые для обработки запуска(crti.oи т. д.)
  • %{!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}}— добавляет проверку виртуальной таблицы с помощьюlibvtv
  • %{!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}}}}}}}— это ручкиlibmpx
  • %{!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)}}}}— управляет различными вариантами санитарной обработки
  • .
  • %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}— это добавляет опции защиты стека и повторяет последовательность ссылок C (, библиотеки которых уже были указаны в начале)
  • %{!nostdlib:%{!nostartfiles:%E}}— это добавляет спецификационную строку endfile, которая указывает объектные файлы, которые нужно добавить для обработки левых -оверов (crtfastmath.o, crtend.oи т. д.)

Как вы поняли из документации, -nostdlibявляется надмножеством -nodefaultlibsи -nostartfiles. Он также отключает проверку виртуальной таблицы.

Итак, -nostdlibдостаточно, чтобы отключить все связанные функции; -nodefaultlibsи -nostartfilesничего к этому не добавляют. (Но их тоже не помешает упомянуть.)

0
28.01.2020, 00:33

Теги

Похожие вопросы