Spec-Zone.ru › GCC 4

3.13 Варианты для связывания

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

object-file-name
Имя файла, не заканчивающееся специальным распознаваемым суффиксом, считается именем файла объектного модуля или библиотеки. (Объектные файлы отличаются от библиотек линковщиком в соответствии с содержимым файла.) Если выполняется линковка, эти объектные файлы используются в качестве входных данных для линковщика.
-c
-S
-E
Если используется любой из этих параметров, то линковщик не запускается, и имена файлов объектных модулей не должны использоваться в качестве аргументов. См. Основные параметры.
-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 для более подробного обсуждения libgcc.a.) В большинстве случаев вам нужен libgcc.a, даже если вы хотите избежать использования других стандартных библиотек. Другими словами, когда вы указываете -nostdlib или -nodefaultlibs, вам обычно следует указать также -lgcc. Это гарантирует отсутствие неразрешенных ссылок на внутренние подпрограммы библиотеки GCC. (Примеры такой внутренней подпрограммы — ‘__main’, используемая для обеспечения вызова конструкторов C++; см. collect2.)

-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-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 несколько раз с различными символами, чтобы принудительно загрузить дополнительные модули библиотек.

Примечания

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

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

Spec-Zone.ru

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