3.15 Параметры для связывания
Эти параметры применяются, когда компилятор связывает объектные файлы в исполняемый выходной файл. Они бессмысленны, если компилятор не выполняет этап связывания.
object-file-name-
Имя файла, не заканчивающееся на специальный распознаваемый суффикс, считается именем файла объекта или библиотеки. (Файлы объектов различаются от библиотек линковщиком в соответствии с содержимым файла.) При выполнении линковки эти файлы объектов используются в качестве входных данных для линковщика.
-c-S-E-
Если используется любой из этих параметров, тогда линковщик не запускается, и имена файлов объектов не должны использоваться в качестве аргументов. См. Общие параметры.
-flinker-output=type-
Этот параметр управляет генерацией кода оптимизатором на этапе линковки. По умолчанию вывод линковщика автоматически определяется плагином линковщика. Для отладки компилятора и если требуется инкрементная линковка с файлом объекта без LTO, может быть полезно вручную управлять типом.
Если type — ‘exec’, генерация кода создаёт статический двоичный файл. В этом случае -fpic и -fpie оба отключены.
Если type — ‘dyn’, генерация кода создаёт динамическую библиотеку. В этом случае -fpic или -fPIC сохраняется, но не включается автоматически. Это позволяет создавать динамические библиотеки без позиционно-независимого кода на архитектурах, где это возможно, например, на x86.
Если type — ‘pie’, генерация кода создаёт исполняемый файл с -fpie. Это приводит к аналогичным оптимизациям, как и ‘exec’, за исключением того, что -fpie не отключается, если указан при компиляции.
Если type — ‘rel’, компилятор предполагает, что выполняется инкрементная линковка. Разделы, содержащие промежуточный код для оптимизации на этапе линковки, объединяются, предварительно оптимизируются и выводятся в результирующий файл объекта. Кроме того, если указан -ffat-lto-objects, двоичный код генерируется для будущей линковки без LTO. Файл объекта, созданный при инкрементной линковке, меньше, чем статическая библиотека, созданная из тех же файлов объектов. На этапе линковки результат инкрементной линковки также загружается быстрее, чем статическая библиотека, при условии, что большинство объектов в библиотеке используются.
Наконец, ‘nolto-rel’ настраивает компилятор для инкрементной линковки, где генерация кода принудительно выполняется, создаётся окончательный двоичный файл, а промежуточный код для последующей оптимизации на этапе линковки удаляется. При линковке нескольких файлов объектов результирующий код оптимизирован лучше, чем при отключённых оптимизациях на этапе линковки (например, происходит встраивание функций между модулями), но большинство преимуществ оптимизации всего приложения теряется.
Во время инкрементной линковки (с помощью -r) плагин линковщика по умолчанию устанавливает rel. Однако с текущими интерфейсами к GNU Binutils невозможно выполнить инкрементную линковку файлов объектов LTO и файлов объектов без LTO в один смешанный файл объекта. Если какой-либо из файлов объектов в инкрементной линковке не может быть использован для оптимизации на этапе линковки, плагин линковщика выдаёт предупреждение и использует ‘nolto-rel’. Для сохранения оптимизации всего приложения рекомендуется линковать такие объекты в статическую библиотеку вместо этого. В качестве альтернативы можно использовать утилиты binutils H.J. Lu с поддержкой смешанных объектов.
-fuse-ld=bfd-
Используйте линковщик
bfdвместо стандартного линковщика. -fuse-ld=gold-
Используйте линковщик
goldвместо стандартного линковщика. -fuse-ld=lld-
Используйте линковщик LLVM
lldвместо стандартного линковщика. -fuse-ld=mold-
Используйте Модернизированный линковщик (
mold) вместо стандартного линковщика. -llibrary-l library-
Искать библиотеку с именем library при линковке. (Второй вариант с библиотекой в качестве отдельного аргумента используется только для соответствия POSIX и не рекомендуется.)
Параметр -l передаётся линковщику GCC напрямую. Обратитесь к документации вашего линковщика для получения точных деталей. Ниже приведено общее описание, применимое к GNU линковщику.
Линковщик ищет библиотеку в стандартном списке каталогов. Искомые каталоги включают несколько стандартных системных каталогов, а также любые, которые вы укажете с помощью -L.
Статические библиотеки — это архивы файлов объектов, и имеют имена файлов, похожие на liblibrary.a. Некоторые целевые платформы также поддерживают динамические библиотеки, которые, как правило, имеют имена, подобные liblibrary.so. Если найдены как статическая, так и динамическая библиотеки, линковщик отдаёт предпочтение линковке с динамической библиотекой, если не используется параметр -static.
Важна позиция этого параметра в команде; линковщик ищет и обрабатывает библиотеки и файлы объектов в порядке их указания. Таким образом, ‘foo.o -lz bar.o’ ищет библиотеку ‘z’ после файла foo.o, но перед bar.o. Если bar.o ссылается на функции в ‘z’, эти функции могут не быть загружены.
-lobjc-
Этот специальный случай параметра -l необходим для линковки программы Objective-C или Objective-C++.
-nostartfiles-
Не использовать стандартные системные файлы запуска при линковке. Стандартные системные библиотеки используются обычно, если не используется -nostdlib, -nolibc или -nodefaultlibs.
-nodefaultlibs-
Не использовать стандартные системные библиотеки при линковке. Только указанные вами библиотеки передаются линковщику, и параметры, определяющие линковку системных библиотек, такие как -static-libgcc или -shared-libgcc, игнорируются. Стандартные файлы запуска используются обычно, если не используется -nostartfiles.
Компилятор может генерировать вызовы к
memcmp,memset,memcpyиmemmove. Эти записи обычно разрешаются записями в libc. Эти точки входа должны быть предоставлены другим способом, когда указан этот параметр. -nolibc-
Не использовать библиотеку C или системные библиотеки, тесно связанные с ней, при линковке. Тем не менее, связывать с файлами запуска, libgcc или библиотеками языка, предоставляемыми инструментальной цепочкой, такими как libgnat, libgfortran или libstdc++, если не используются параметры, запрещающие их включение. Обычно это удаляет -lc из командной строки линковки, а также системные библиотеки, которые обычно идут с ней и становятся бессмысленными при предположении отсутствия библиотеки C, например, -lpthread или -lm в некоторых конфигурациях. Это предназначено для целевых платформ без операционной системы, когда действительно нет доступной библиотеки C.
-nostdlib-
Не использовать стандартные системные файлы запуска или библиотеки при линковке. Нет файлов запуска и только указанные вами библиотеки передаются линковщику, и параметры, определяющие линковку системных библиотек, такие как -static-libgcc или -shared-libgcc, игнорируются.
Компилятор может генерировать вызовы к
memcmp,memset,memcpyиmemmove. Эти записи обычно разрешаются записями в libc. Эти точки входа должны быть предоставлены другим способом, когда указан этот параметр.Одна из стандартных библиотек, пропущенных -nostdlib и -nodefaultlibs, — это libgcc.a, библиотека внутренних подпрограмм, которую GCC использует для преодоления недостатков конкретных машин или особых потребностей некоторых языков. (См. Взаимодействие с выводом GCC в документации по внутреннему устройству GNU компилятора GCC для получения дополнительной информации о libgcc.a.) В большинстве случаев вам нужна libgcc.a, даже если вы хотите избежать других стандартных библиотек. Другими словами, когда вы указываете -nostdlib или -nodefaultlibs, обычно необходимо также указать -lgcc. Это гарантирует отсутствие неразрешенных ссылок на внутренние подпрограммы библиотеки GCC. (Пример такой внутренней подпрограммы —
__main, используемой для обеспечения вызова конструкторов C++; см.collect2в документации по внутреннему устройству GNU компилятора GCC.) -e entry--entry=entry-
Указать, что точкой входа программы является entry. Аргумент интерпретируется линковщиком; GNU линковщик принимает имя символа или адрес.
-pie-
Создать динамически связанный позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Для предсказуемых результатов вы также должны указать тот же набор параметров, используемых при компиляции (-fpie, -fPIE или параметры модели), когда вы указываете этот параметр линковщика.
-no-pie-
Не создавать динамически связанный позиционно-независимый исполняемый файл.
-static-pie-
Создать статический позиционно-независимый исполняемый файл на целевых платформах, которые его поддерживают. Статический позиционно-независимый исполняемый файл похож на статический исполняемый файл, но может быть загружен по любому адресу без динамического линковщика. Для предсказуемых результатов вы также должны указать тот же набор параметров, используемых при компиляции (-fpie, -fPIE или параметры модели), когда вы указываете этот параметр линковщика.
-pthread-
Связываться с библиотекой POSIX потоков. Этот параметр поддерживается на целевых платформах GNU/Linux, большинстве других Unix-подобных системах, а также на x86 Cygwin и MinGW целевых платформах. На некоторых платформах этот параметр также устанавливает флаги для препроцессора, поэтому он должен использоваться последовательно как при компиляции, так и при линковке.
-r-
Создать релоцируемый объект в качестве выходного файла. Это также известно как частичная линковка.
-rdynamic-
Передать флаг -export-dynamic линковщику ELF на целевых платформах, которые его поддерживают. Это инструктирует линковщик добавить все символы, а не только используемые, в таблицу динамических символов. Этот параметр необходим для некоторых применений
dlopenили для возможности получения отладочных трассировок из программы. -s-
Удалить всю информацию о таблице символов и перемещении из исполняемого файла.
-static-
В системах, которые поддерживают динамическую линковку, это переопределяет -pie и предотвращает линковку с динамическими библиотеками. В других системах этот параметр не оказывает влияния.
-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-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-12.2.0/gcc/Link-Options.html