Spec-Zone.ru › GCC 5

3.13 Параметры для компоновки

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

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 или параметры модели), когда вы указываете этот параметр линковщика.

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

При использовании опций -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-5.5.0/gcc/Link-Options.html

Spec-Zone.ru

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