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), для более подробного обсуждения libgcc.a.) В большинстве случаев вам нужна libgcc.a, даже если вы хотите избежать других стандартных библиотек. Другими словами, при указании -nostdlib или -nodefaultlibs, вам обычно необходимо указать также -lgcc. Это гарантирует, что у вас нет неразрешённых ссылок на внутренние подпрограммы библиотеки GCC. (Пример такой внутренней подпрограммы —
__main, используемая для обеспечения вызова конструкторов C++; см.collect2в документации по внутреннему устройству GNU Compiler Collection (GCC).) -pie-
Создать позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Для получения предсказуемых результатов необходимо также указать тот же набор параметров, используемых для компиляции (-fpie, -fPIE или подпараметры модели), когда вы указываете этот параметр линковщика.
-no-pie-
Не создавать позиционно-независимый исполняемый файл.
-pthread-
Линковка с библиотекой POSIX потоков. Этот параметр поддерживается на целевых платформах GNU/Linux, большинстве других производных Unix, а также на целевых платформах x86 Cygwin и MinGW. На некоторых платформах этот параметр также устанавливает флаги для препроцессора, поэтому его следует использовать последовательно как для компиляции, так и для линковки.
-rdynamic-
Передать флаг -export-dynamic линковщику ELF на целевых платформах, которые его поддерживают. Это указывает линковщику добавить все символы, а не только используемые, в динамическую таблицу символов. Этот параметр необходим для некоторых применений
dlopenили для возможности получения трассировок изнутри программы. -s-
Удалить всю таблицу символов и информацию о перераспределении из исполняемого файла.
-static-
В системах, которые поддерживают динамическую линковку, это предотвращает линковку с общими библиотеками. В других системах этот параметр не имеет эффекта.
-shared-shared-libgcc-static-libgcc-
В системах, предоставляющих libgcc как общую библиотеку, эти параметры принудительно используют либо общую, либо статическую версию, соответственно. Если при конфигурации компилятора не была построена общая версия libgcc, эти параметры не имеют эффекта.
Существует несколько ситуаций, в которых приложение должно использовать общую libgcc вместо статической версии. Самая распространённая из них — когда приложение хочет бросать и перехватывать исключения через различные общие библиотеки. В этом случае каждая из библиотек, а также само приложение должны использовать общую libgcc.
Поэтому драйвер G++ автоматически добавляет -shared-libgcc всякий раз, когда вы строит общую библиотеку или основной исполняемый файл, потому что программы C++ обычно используют исключения, поэтому это правильный подход.
Если вместо этого вы используете драйвер GCC для создания общих библиотек, вы можете обнаружить, что они не всегда связаны с общей libgcc. Если GCC обнаруживает при конфигурации, что у вас есть не-GNU линковщик или GNU линковщик, который не поддерживает параметр --eh-frame-hdr, он подключает общую версию libgcc в общие библиотеки по умолчанию. В противном случае он использует линковщик и оптимизирует отсутствие линковки с общей версией libgcc, подключая по умолчанию статическую версию libgcc. Это позволяет исключениям распространяться через такие общие библиотеки без затрат на перераспределение во время загрузки библиотеки.
Однако, если библиотека или основной исполняемый файл должны бросать или перехватывать исключения, вы должны связать их с помощью драйвера G++, или используя параметр -shared-libgcc, чтобы он связывался с общей libgcc.
-static-libasan-
При линковке программы с использованием параметра -fsanitize=address драйвер GCC автоматически подключается к libasan. Если libasan доступна как общая библиотека, и параметр -static не используется, то это связывается с общей версией libasan. Параметр -static-libasan указывает драйверу GCC на статическую линковку libasan без необходимости статической линковки других библиотек.
-static-libtsan-
При линковке программы с использованием параметра -fsanitize=thread драйвер GCC автоматически подключается к libtsan. Если libtsan доступна как общая библиотека, и параметр -static не используется, то это связывается с общей версией libtsan. Параметр -static-libtsan указывает драйверу GCC на статическую линковку libtsan без необходимости статической линковки других библиотек.
-static-liblsan-
При линковке программы с использованием параметра -fsanitize=leak драйвер GCC автоматически подключается к liblsan. Если liblsan доступна как общая библиотека, и параметр -static не используется, то это связывается с общей версией 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 компоновщика. На некоторых целевых платформах, таких как целевые платформы без операционной системы, опция -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-7.5.0/gcc/Link-Options.html