Spec-Zone.ru › GCC 12

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

Создайте общий объект, который затем можно связать с другими объектами для создания исполняемого файла. Не все системы поддерживают этот вариант. Для предсказуемых результатов необходимо также указать тот же набор опций, используемых для компиляции (-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-12.2.0/gcc/Link-Options.html

Spec-Zone.ru

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