Spec-Zone.ru › GCC 9

3.14 Параметры для связывания

Эти параметры используются, когда компилятор связывает объектные файлы в исполняемый выходной файл. Они не имеют смысла, если компилятор не выполняет этап связывания.

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’. Для поддержания оптимизации всего приложения рекомендуется связать такие объекты в статическую библиотеку. В качестве альтернативы можно использовать H.J. Lu’s binutils с поддержкой смешанных объектов.

-fuse-ld=bfd

Используйте линковщик bfd вместо стандартного линковщика.

-fuse-ld=gold

Используйте линковщик gold вместо стандартного линковщика.

-fuse-ld=lld

Используйте LLVM линковщик lld вместо стандартного линковщика.

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

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

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

Примечания

(1)

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

Далее: Параметры директорий, Предыдущий: Параметры ассемблера, Вверх: Вызов GCC [Содержание][Индекс]

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

Spec-Zone.ru

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