Spec-Zone.ru › GCC 13

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 Output в GNU Compiler Collection (GCC) Internals для более подробного обсуждения libgcc.a.) В большинстве случаев вам нужна libgcc.a, даже если вы хотите избежать других стандартных библиотек. Другими словами, когда вы указываете -nostdlib или -nodefaultlibs, вы обычно должны указать также -lgcc. Это гарантирует, что у вас нет неразрешённых ссылок на внутренние подпрограммы библиотеки GCC. (Пример такой внутренней подпрограммы — __main, используемая для обеспечения вызова конструкторов C++; см. collect2 в GNU Compiler Collection (GCC) Internals.)

-nostdlib++

Не выполнять неявную линковку со стандартными библиотеками C++.

-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

Создайте общий объект, который затем можно связать с другими объектами для создания исполняемого файла. Не все системы поддерживают этот параметр. Для предсказуемых результатов вы также должны указать тот же набор параметров, используемых для компиляции (-fpic, -fPIC или параметры модели), когда вы указываете этот параметр линковщика.1

-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++

При связывании программы C++, программа g++ обычно автоматически связывается с 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. Смотрите раздел в документации вашего линковщика для разрешённых значений и их значений.

Примечания

(1)

В некоторых системах «gcc -shared» необходимо строить дополнительные подпрограммы для работы конструкторов. В системах с несколькими версиями библиотек «gcc -shared» должен выбрать правильные поддерживающие библиотеки для связывания. Отсутствие правильных флагов может привести к скрытым ошибкам. Их использование в случаях, когда они не нужны, не повлияет на работу.

-shared подавляет добавление кода загрузки для изменения среды с плавающей запятой, как это делается с -ffast-math, -Ofast или -funsafe-math-optimizations на некоторых целевых платформах.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/Link-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API