Spec-Zone.ru › GCC 6

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

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

object-file-name

Имя файла, не заканчивающееся на специальный распознанный суффикс, считается именем объектного файла или библиотеки. (Объектные файлы отличаются от библиотек линковщиком в соответствии с содержимым файла.) Если выполняется линковка, эти объектные файлы используются как входные данные для линковщика.

-c
-S
-E

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

-fuse-ld=bfd

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

-fuse-ld=gold

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

-llibrary
-l library

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

Это имеет значение, где в команде вы указываете этот параметр; линковщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, ‘foo.o -lz bar.o’ ищет библиотеку ‘z’ после файла foo.o, но перед bar.o. Если bar.o ссылается на функции в ‘z’, эти функции могут не загрузиться.

Линковщик ищет стандартный список каталогов для библиотеки, которая фактически является файлом с именем liblibrary.a. Затем линковщик использует этот файл так, как будто он был указан точно по имени.

Искомые каталоги включают несколько стандартных системных каталогов, а также все указанные вами с помощью -L.

Обычно найденные файлы — это библиотечные файлы — архивные файлы, члены которых являются объектные файлы. Линковщик обрабатывает архивный файл, просматривая его в поисках членов, которые определяют символы, на которые до сих пор ссылались, но не были определены. Но если найден обычный объектный файл, он линковался обычным способом. Единственное отличие между использованием параметра -l и указанием имени файла заключается в том, что -l обрамляет library строками ‘lib’ и ‘.a’ и ищет несколько каталогов.

-lobjc

Этот специальный случай параметра -l необходим для линковки программы на Objective-C или Objective-C++.

-nostartfiles

При линковке не использовать стандартные системные файлы запуска. Стандартные системные библиотеки используются обычно, если не используется -nostdlib или -nodefaultlibs.

-nodefaultlibs

При линковке не использовать стандартные системные библиотеки. Только указанные вами библиотеки передаются линковщику, и параметры, задающие линковку системных библиотек, такие как -static-libgcc или -shared-libgcc, игнорируются. Стандартные файлы запуска используются обычно, если не используется -nostartfiles.

Компилятор может генерировать вызовы memcmp, memset, memcpy и memmove. Обычно эти записи разрешаются записями в libc. Эти точки входа должны быть обеспечены с помощью другого механизма, когда указан этот параметр.

-nostdlib

При линковке не использовать стандартные системные файлы запуска или библиотеки. Линковщику передаются только указанные вами библиотеки и не используются файлы запуска, а параметры, задающие линковку системных библиотек, такие как -static-libgcc или -shared-libgcc, игнорируются.

Компилятор может генерировать вызовы memcmp, memset, memcpy и memmove. Обычно эти записи разрешаются записями в libc. Эти точки входа должны быть обеспечены с помощью другого механизма, когда указан этот параметр.

Одна из стандартных библиотек, опущенных -nostdlib и -nodefaultlibs, это libgcc.a, библиотека внутренних подпрограмм, которые GCC использует для преодоления недостатков конкретных машин или особых потребностей некоторых языков. (См. Взаимодействие с выводом GCC в Руководстве по внутреннему устройству GNU Compiler Collection (GCC), для более подробного обсуждения libgcc.a.) В большинстве случаев вам нужна libgcc.a, даже когда вы хотите избежать других стандартных библиотек. Другими словами, при указании -nostdlib или -nodefaultlibs вы обычно должны также указать -lgcc. Это гарантирует отсутствие неразрешенных ссылок на внутренние подпрограммы библиотеки GCC. (Пример такой внутренней подпрограммы — __main, используемой для обеспечения вызова конструкторов C++; см. collect2 в Руководстве по внутреннему устройству GNU Compiler Collection (GCC)).

-pie

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

-no-pie

Не создавать позиционно-независимый исполняемый файл.

-rdynamic

Передать флаг -export-dynamic линковщику ELF на целевых платформах, которые его поддерживают. Это указывает линковщику добавить все символы, а не только используемые, в таблицу динамических символов. Этот параметр необходим для некоторых применений dlopen или для получения отладочных трасс внутри программы.

-s

Удалить всю таблицу символов и информацию о перемещении из исполняемого файла.

-static

На системах, которые поддерживают динамическую линковку, это предотвращает линковку со ссылками на общие библиотеки. На других системах этот параметр не оказывает никакого влияния.

-shared

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

-shared-libgcc
-static-libgcc

На системах, которые предоставляют libgcc как общую библиотеку, эти параметры соответственно принуждают использовать либо общую, либо статическую версию. Если при конфигурации компилятора не была построена общая версия libgcc, эти параметры не оказывают никакого влияния.

Существует несколько ситуаций, в которых приложение должно использовать общую libgcc вместо статической версии. Наиболее распространенным из них является случай, когда приложение хочет бросать и перехватывать исключения через различные общие библиотеки. В этом случае каждая из библиотек, а также само приложение должны использовать общую libgcc.

Поэтому драйверы G++ и GCJ автоматически добавляют -shared-libgcc всякий раз, когда вы создаете общую библиотеку или основной исполняемый файл, потому что программы на C++ и Java обычно используют исключения, поэтому это правильное решение.

Если же вы используете драйвер GCC для создания общих библиотек, вы можете обнаружить, что они не всегда связаны с общей libgcc. Если GCC при своей конфигурации обнаруживает, что у вас не-GNU линковщик или GNU линковщик, который не поддерживает параметр --eh-frame-hdr, он связывает общую версию libgcc в общие библиотеки по умолчанию. В противном случае он использует линковщик и оптимизирует связь с общей версией libgcc, связывая её статической версией libgcc по умолчанию. Это позволяет исключениям распространяться через такие общие библиотеки без наложения затрат на перемещение во время загрузки библиотеки.

Однако, если библиотека или основной исполняемый файл должны бросать или перехватывать исключения, вы должны связать их с помощью драйвера G++ или GCJ, в зависимости от используемых языков в программе, или используя параметр -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-libmpx

При линковке программы с использованием параметров -fcheck-pointer bounds и -mmpx драйвер GCC автоматически связывается с libmpx. Если libmpx доступна как общая библиотека, а параметр -static не используется, то это связывает с общей версией libmpx. Параметр -static-libmpx направляет драйвер GCC на статическую линковку libmpx без необходимости статической линковки других библиотек.

-static-libmpxwrappers

Когда используются опции -fcheck-pointer bounds и -mmpx для компоновки программы без использования -fno-chkp-use-wrappers, драйвер GCC автоматически подключает libmpxwrappers. Если libmpxwrappers доступен как общая библиотека, и опция -static не используется, то происходит подключение к общей версии libmpxwrappers. Опция -static-libmpxwrappers указывает драйверу GCC на статическую компоновку libmpxwrappers без обязательной статической компоновки других библиотек.

-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-6.5.0/gcc/Link-Options.html

Spec-Zone.ru

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