3.14 Параметры для компоновки
Эти параметры применяются при компоновке компилятором объектных файлов в исполняемый выходной файл. Они не имеют смысла, если компилятор не выполняет этап компоновки.
object-file-nameИмя файла, не оканчивающееся на специальный распознаваемый суффикс, считается именем объектного файла или библиотеки. (Объектные файлы отличаются от библиотек компоновщиком в соответствии с содержимым файла.) При выполнении компоновки эти объектные файлы используются в качестве входных данных для компоновщика.
-c-S-EЕсли любой из этих параметров используется, тогда компоновщик не запускается, и имена объектных файлов не должны использоваться в качестве аргументов. См. Общие параметры.
-fuse-ld=bfdИспользовать компоновщик
bfdвместо стандартного компоновщика.-fuse-ld=goldИспользовать компоновщик
goldвместо стандартного компоновщика.-llibrary-l libraryПри компоновке искать библиотеку с именем library. (Второй вариант с библиотекой как отдельным аргументом предназначен только для соответствия POSIX и не рекомендуется.)
Это имеет значение, где в команде вы указываете этот параметр; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, ‘foo.o -lz bar.o’ ищет библиотеку ‘z’ после файла foo.o, но перед bar.o. Если bar.o ссылается на функции в ‘z’, эти функции могут не загрузиться.
Компоновщик ищет стандартный список каталогов для библиотеки, которая фактически является файлом с именем liblibrary.a. Затем компоновщик использует этот файл так, как если бы он был указан именно по имени.
Искомые каталоги включают несколько стандартных системных каталогов плюс любые, которые вы указываете с помощью -L.
Обычно найденные таким образом файлы являются библиотечными файлами — архивными файлами, члены которых являются объектными файлами. Компоновщик обрабатывает архивный файл, просматривая его на предмет членов, которые определяют символы, которые до сих пор ссылались, но не были определены. Но если найденный файл — обычный объектный файл, он компонуется обычным образом. Единственное различие между использованием параметра -l и указанием имени файла заключается в том, что -l окружает library строками ‘lib’ и ‘.a’ и ищет несколько каталогов.
-lobjcВам нужен этот специальный случай параметра -l, чтобы скомпоновать программу Objective-C или Objective-C++.
-nostartfilesНе использовать стандартные системные файлы запуска при компоновке. Стандартные системные библиотеки используются обычно, если не используется -nostdlib или -nodefaultlibs.
-nodefaultlibsНе использовать стандартные системные библиотеки при компоновке. Только указанные вами библиотеки передаются компоновщику, и параметры, определяющие компоновку системных библиотек, такие как -static-libgcc или -shared-libgcc, игнорируются. Стандартные файлы запуска используются обычно, если не используется -nostartfiles.
Компилятор может генерировать вызовы
memcmp,memset,memcpyиmemmove. Эти записи обычно разрешаются записями в libc. Эти точки входа должны быть предоставлены другим способом, когда указан этот параметр.-nostdlibНе использовать стандартные системные файлы запуска или библиотеки при компоновке. В компоновщик не передаются файлы запуска и только указанные вами библиотеки, и параметры, определяющие компоновку системных библиотек, такие как -static-libgcc или -shared-libgcc, игнорируются.
Компилятор может генерировать вызовы
memcmp,memset,memcpyиmemmove. Эти записи обычно разрешаются записями в libc. Эти точки входа должны быть предоставлены другим способом, когда указан этот параметр.Одна из стандартных библиотек, опущенных -nostdlib и -nodefaultlibs, — libgcc.a, библиотека внутренних подпрограмм, которые GCC использует для преодоления недостатков конкретных машин или специальных потребностей некоторых языков. (См. Взаимодействие с выходом GCC в GNU Compiler Collection (GCC) Internals для получения дополнительной информации о libgcc.a.) В большинстве случаев вам нужна libgcc.a, даже когда вы хотите избежать других стандартных библиотек. Другими словами, когда вы указываете -nostdlib или -nodefaultlibs, вы обычно должны также указать -lgcc. Это гарантирует, что у вас нет неразрешенных ссылок на внутренние подпрограммы библиотеки GCC. (Пример такой внутренней подпрограммы —
__main, используемой для обеспечения вызова конструкторов C++; см.collect2в GNU Compiler Collection (GCC) Internals.)-pieСоздать динамически связанный позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Для предсказуемых результатов при указании этого параметра компоновщика необходимо также указать тот же набор параметров, используемых для компиляции (-fpie, -fPIE или параметры модели).
-no-pieНе создавать динамически связанный позиционно-независимый исполняемый файл.
-static-pieСоздать статически позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Статически позиционно-независимый исполняемый файл похож на статический исполняемый файл, но может загружаться по любому адресу без динамического компоновщика. Для предсказуемых результатов при указании этого параметра компоновщика необходимо также указать тот же набор параметров, используемых для компиляции (-fpie, -fPIE или параметры модели).
-pthreadСкомпоновать с библиотекой POSIX-потоков. Этот параметр поддерживается на целевых платформах GNU/Linux, большинстве других производных Unix, а также на целевых платформах x86 Cygwin и MinGW. На некоторых целевых платформах этот параметр также устанавливает флаги для препроцессора, поэтому его следует использовать последовательно как для компиляции, так и для компоновки.
-rdynamicПередать флаг -export-dynamic компоновщику ELF на целевых платформах, которые его поддерживают. Это инструктирует компоновщик добавить все символы, а не только используемые, в динамическую таблицу символов. Этот параметр необходим для некоторых применений
dlopenили для возможности получения отслеживания стека изнутри программы.-sУдалить всю информацию о таблице символов и перемещении из исполняемого файла.
-staticНа системах, которые поддерживают динамическую компоновку, это переопределяет -pie и предотвращает компоновку со shared библиотеками. На других системах этот параметр не имеет эффекта.
-shared-shared-libgcc-static-libgccНа системах, которые предоставляют libgcc как shared библиотеку, эти параметры принудительно используют соответственно shared или статическую версию. Если shared версия libgcc не была построена при конфигурировании компилятора, эти параметры не имеют эффекта.
Существует несколько ситуаций, в которых приложение должно использовать shared libgcc вместо статической версии. Наиболее распространенный случай — когда приложение хочет генерировать и обрабатывать исключения через разные shared библиотеки. В этом случае каждая из библиотек, а также само приложение должны использовать shared libgcc.
Поэтому драйвер G++ автоматически добавляет -shared-libgcc всякий раз, когда вы создаете shared библиотеку или основной исполняемый файл, потому что C++ программы обычно используют исключения, поэтому это правильный подход.
Если вы вместо этого используете драйвер GCC для создания shared библиотек, вы можете обнаружить, что они не всегда компонуются с shared libgcc. Если GCC обнаруживает при настройке, что у вас компоновщик не GNU или компоновщик GNU не поддерживает параметр --eh-frame-hdr, он связывает shared версию libgcc в shared библиотеки по умолчанию. В противном случае он использует компоновщик и оптимизирует связывание с shared версией libgcc, связывая по умолчанию статическую версию libgcc. Это позволяет исключениям распространяться через такие shared библиотеки без затрат на перемещение во время загрузки библиотеки.
Однако, если библиотека или основной исполняемый файл должны генерировать или обрабатывать исключения, вы должны скомпоновать его с помощью драйвера G++, или с помощью параметра -shared-libgcc, чтобы он был связан с shared libgcc.
-static-libasanКогда для компоновки программы используется параметр -fsanitize=address, драйвер GCC автоматически компонует с libasan. Если libasan доступна как shared библиотека, а параметр -static не используется, то это связывает с shared версией libasan. Параметр -static-libasan указывает драйверу GCC компоновать libasan статически, необязательно компонуя другие библиотеки статически.
-static-libtsanКогда для компоновки программы используется параметр -fsanitize=thread, драйвер GCC автоматически компонует с libtsan. Если libtsan доступна как shared библиотека, а параметр -static не используется, то это связывает с shared версией libtsan. Параметр -static-libtsan указывает драйверу GCC компоновать libtsan статически, необязательно компонуя другие библиотеки статически.
-static-liblsanКогда для компоновки программы используется параметр -fsanitize=leak, драйвер GCC автоматически компонует с liblsan. Если liblsan доступна как shared библиотека, а параметр -static не используется, то это связывает с shared версией liblsan. Параметр -static-liblsan указывает драйверу GCC компоновать liblsan статически, необязательно компонуя другие библиотеки статически.
-static-libubsan
-
При использовании опции -fsanitize=undefined для компоновки программы, драйвер GCC автоматически подключает libubsan. Если libubsan доступен как динамическая библиотека, и опция -static не используется, то компоновка выполняется с динамической версией libubsan. Опция -static-libubsan указывает драйверу GCC на статическую компоновку libubsan, без необходимости статической компоновки других библиотек.
-static-libmpx-
При использовании опций -fcheck-pointer bounds и -mmpx для компоновки программы, драйвер GCC автоматически подключает libmpx. Если libmpx доступен как динамическая библиотека, и опция -static не используется, то компоновка выполняется с динамической версией libmpx. Опция -static-libmpx указывает драйверу GCC на статическую компоновку libmpx, без необходимости статической компоновки других библиотек.
-static-libmpxwrappers-
При использовании опций -fcheck-pointer bounds и -mmpx для компоновки программы без использования опции -fno-chkp-use-wrappers, драйвер GCC автоматически подключает libmpxwrappers. Если libmpxwrappers доступен как динамическая библиотека, и опция -static не используется, то компоновка выполняется с динамической версией libmpxwrappers. Опция -static-libmpxwrappers указывает драйверу GCC на статическую компоновку libmpxwrappers, без необходимости статической компоновки других библиотек.
-static-libstdc++-
При использовании
g++для компоновки программы на C++, обычно происходит автоматическая компоновка с libstdc++. Если libstdc++ доступна как динамическая библиотека, и опция -static не используется, то компоновка выполняется с динамической версией libstdc++. Обычно это нормально. Однако иногда бывает полезно зафиксировать версию libstdc++, используемую программой, не прибегая к полной статической компоновке. Опция -static-libstdc++ указывает драйверуg++на статическую компоновку libstdc++, без необходимости статической компоновки других библиотек. -symbolic-
Связывать ссылки на глобальные символы при построении разделяемой библиотеки. Предупреждать об неразрешенных ссылках (если это не переопределено опцией компоновщика -Xlinker -z -Xlinker defs). Эта опция поддерживается лишь на некоторых системах.
-T script-
Использовать script в качестве скрипта компоновщика. Эта опция поддерживается большинством систем, использующих GNU компоновщик. На некоторых целевых платформах, таких как bare-board системы без операционной системы, может потребоваться опция -T при компоновке, чтобы избежать ссылок на не определённые символы.
-Xlinker option-
Передать option как опцию компоновщику. Вы можете использовать это для передачи системно-специфических опций компоновщику, которые не распознаются GCC.
Если вы хотите передать опцию, которая требует отдельного аргумента, вы должны использовать -Xlinker дважды, один раз для опции и один раз для аргумента. Например, чтобы передать -assert definitions, вы должны написать -Xlinker -assert -Xlinker definitions. Не работает запись -Xlinker "-assert definitions", так как это передаёт всю строку как один аргумент, а это не то, что ожидает компоновщик.
При использовании GNU компоновщика, обычно удобнее передавать аргументы к опциям компоновщика используя синтаксис option=value, чем как отдельные аргументы. Например, вы можете указать -Xlinker -Map=output.map, вместо -Xlinker -Map -Xlinker output.map. Другие компоновщики могут не поддерживать этот синтаксис для командной строки опций.
-Wl,option-
Передать option как опцию компоновщику. Если option содержит запятые, она разбивается на несколько опций в местах запятых. Вы можете использовать этот синтаксис для передачи аргумента к опции. Например, -Wl,-Map,output.map передаёт -Map output.map компоновщику. При использовании GNU компоновщика, вы также можете получить тот же эффект с -Wl,-Map=output.map.
-u symbol-
Представить, что символ symbol не определён, чтобы принудительно заставить компоновку модулей библиотек определить его. Вы можете использовать -u несколько раз с различными символами, чтобы принудительно загрузить дополнительные модули библиотек.
-z keyword-
-z передаётся непосредственно компоновщику вместе со словом keyword. Смотрите раздел в документации вашего компоновщика для разрешенных значений и их значений.
Примечания
В некоторых системах, ‘gcc -shared’ необходимо создать дополнительные вспомогательные фрагменты кода для работы конструкторов. В системах с несколькими версиями библиотек, ‘gcc -shared’ должен выбрать правильные поддерживающие библиотеки для компоновки. Отсутствие корректных флагов может привести к скрытым дефектам. Использование их в случаях, когда они не нужны, не приводит к ошибкам.
Далее: Опции каталогов, Предыдущая: Опции ассемблера, Наверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Link-Options.html