Spec-Zone.ru › GCC 11

Следующее: Параметры поиска в каталогах, Предыдущее: Передача параметров в ассемблер, Вверх: Параметры командной строки GCC [Оглавление][Индекс]

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 линковщик вместо стандартного линковщика.

-llibrary ¶
-l library

Искать библиотеку с именем library при линковке. (Вторая альтернатива с библиотекой в качестве отдельного аргумента предназначена только для соответствия POSIX и не рекомендуется.)

Параметр -l напрямую передаётся линковщику GCC. Обратитесь к документации вашего линковщика для получения подробностей.

Линковщик ищет библиотеку в стандартном списке каталогов. Искомые каталоги включают несколько стандартных системных каталогов, плюс любые, которые вы укажете с помощью -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++

При компоновке программы на 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-11.4.0/gcc/Link-Options.html

Spec-Zone.ru

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