Руководства по командной строке

Man » Онлайн-руководство по ld - подробная онлайн-документация для страницы руководства ld

🌍
ld - GNU Linker

СИНТАКСИС

ld [параметры] objfile ...

ОПИСАНИЕ

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

ld принимает файлы языка команд линкера, написанные на расширенном подмножестве синтаксиса языка команд редактора ссылок AT&T, чтобы обеспечить явный и полный контроль над процессом линковки.

Эта страница руководства не описывает язык команд; подробную информацию о языке команд и других аспектах GNU Linker можно найти в "info".

Эта версия ld использует универсальные библиотеки BFD для работы с объектными файлами. Это позволяет ld читать, объединять и записывать объектные файлы в различных форматах, например, COFF или "a.out". Различные форматы могут быть скомбинированы для создания любого доступного типа объектного файла.

Помимо своей гибкости, GNU Linker более полезен, чем другие линкеры, в предоставлении диагностической информации. Многие линкеры прекращают выполнение сразу после обнаружения ошибки; ld, по возможности, продолжает выполнение, позволяя выявлять другие ошибки (или, в некоторых случаях, получать выходной файл, несмотря на ошибку).

GNU Linker ld предназначен для широкого спектра ситуаций и должен быть максимально совместим с другими линкерами. В результате у вас есть множество возможностей для управления его поведением.

ПАРАМЕТРЫ

Линкер поддерживает множество параметров командной строки, но на практике немногие из них используются в каком-либо конкретном контексте. Например, часто ld используется для линковки стандартных объектных файлов Unix в стандартной поддерживаемой системе Unix. В такой системе, чтобы слинковать файл "hello.o":

ld -o <output> /lib/crt0.o hello.o -lc

Это указывает ld создать файл с именем output в результате линковки файла "/lib/crt0.o" с "hello.o" и библиотекой "libc.a", которая будет взята из стандартных каталогов поиска. (См. обсуждение параметра -l ниже.)

Некоторые параметры командной строки ld могут быть указаны в любой точке командной строки. Однако параметры, относящиеся к файлам, такие как -l или -T, приводят к тому, что файл считывается в той точке командной строки, в которой появляется параметр, относительно объектных файлов и других файловых параметров. Повторное указание нефайловых параметров с другим аргументом либо не будет иметь дальнейшего эффекта, либо отменит предыдущие вхождения этого параметра (расположенные левее в командной строке). Параметры, которые можно осмысленно указать более одного раза, указаны в описаниях ниже.

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

Обычно компоновщик вызывается как минимум с одним объектным файлом, но вы можете указать другие формы двоичных входных файлов, используя параметры -l, -R и язык команд сценариев. Если не указано ни одного двоичного входного файла, компоновщик не создает выходной файл и выдает сообщение «Нет входных файлов».

Если компоновщик не может распознать формат объектного файла, он предполагает, что это сценарий компоновщика. Сценарий, указанный таким образом, дополняет основной сценарий компоновщика, используемый для компоновки (либо сценарий компоновщика по умолчанию, либо сценарий, указанный с помощью параметра -T). Эта функция позволяет компоновщику компоноваться с файлом, который, по-видимому, является объектным файлом или архивом, но на самом деле просто определяет некоторые значения символов или использует «INPUT» или «GROUP» для загрузки других объектов. Указание сценария таким образом просто дополняет основной сценарий компоновщика, дополнительные команды помещаются после основного сценария; используйте параметр -T, чтобы полностью заменить сценарий компоновщика по умолчанию, но обратите внимание на эффект команды «INSERT».

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

Для параметров, имена которых состоят из нескольких букв, перед именем параметра можно использовать либо один, либо два дефиса; например, -trace-symbol и --trace-symbol эквивалентны. Обратите внимание, что на это правило есть одно исключение. Параметры, состоящие из нескольких букв и начинающиеся с буквы «o», могут быть указаны только с двумя дефисами. Это делается для того, чтобы уменьшить путаницу с параметром -o. Таким образом, например, -omagic задает имя выходного файла как magic, в то время как --omagic задает флаг NMAGIC для выходного файла.

Аргументы для параметров, состоящих из нескольких букв, должны либо отделяться от имени параметра знаком равенства, либо указываться в виде отдельных аргументов, непосредственно следующих за параметром, который их требует. Например, --trace-symbol foo и --trace-symbol=foo эквивалентны. Допускаются уникальные сокращения имен параметров, состоящих из нескольких букв.

Обратите внимание, что если компоновщик вызывается косвенно, через драйвер компилятора (например, gcc), все параметры командной строки компоновщика должны быть снабжены префиксом -Wl (или любым другим, соответствующим данному драйверу компилятора), например:

gcc -Wl,--start-group foo.o bar.o -Wl,--end-group

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


gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map

Здесь представлена таблица общих параметров командной строки, принимаемых GNU-линкером:

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

Параметры в файле разделены пробелами. Пробел можно включить в параметр, заключив весь параметр в одинарные или двойные кавычки. Любой символ (включая обратную косую черту) можно включить, поставив перед символом, который нужно включить, обратную косую черту. Файл может содержать дополнительные параметры @file; любые такие параметры будут обрабатываться рекурсивно.

-a keyword
Этот параметр поддерживается для совместимости с HP/UX. Аргумент keyword должен быть одной из строк archive, shared или default. -aarchive функционально эквивалентен -Bstatic, а два других параметра функционально эквивалентны -Bdynamic. Этот параметр можно использовать любое количество раз.

--audit AUDITLIB
Добавляет AUDITLIB в запись "DT_AUDIT" в динамическом разделе. AUDITLIB не проверяется на наличие, и не будет использоваться DT_SONAME, указанный в библиотеке. Если указано несколько раз, "DT_AUDIT" будет содержать список интерфейсов аудита, разделенных двоеточием. Если линкер обнаруживает объект с записью аудита при поиске общих библиотек, он добавляет соответствующую запись "DT_DEPAUDIT" в выходной файл. Этот параметр имеет смысл только на платформах ELF, поддерживающих интерфейс rtld-audit.

-b input-format
--format=input-format
ld может быть настроен для поддержки более одного типа объектных файлов. Если ваш ld настроен таким образом, вы можете использовать параметр -b, чтобы указать формат входных объектных файлов, которые следуют за этим параметром в командной строке. Даже если ld настроен для поддержки альтернативных форматов объектов, обычно вам не нужно указывать это, поскольку ld должен быть настроен на использование наиболее распространенного формата по умолчанию на каждой машине. input-format — это текстовая строка, имя определенного формата, поддерживаемого библиотеками BFD. (Вы можете перечислить доступные двоичные форматы с помощью objdump -i).

Возможно, вам потребуется использовать этот параметр, если вы связываете файлы с необычным двоичным форматом. Вы также можете использовать -b для явного переключения форматов (при связывании объектных файлов разных форматов), добавив -b input-format перед каждой группой объектных файлов в определенном формате.

Формат по умолчанию берется из переменной окружения "GNUTARGET".

Вы также можете определить формат ввода из скрипта, используя команду "TARGET";

-c MRI-commandfile
--mri-script=MRI-commandfile
Для совместимости с линкерами, созданными MRI, ld принимает файлы скриптов, написанные на альтернативном ограниченном языке команд, описанном в разделе "Файлы скриптов, совместимых с MRI" документации GNU ld. Вводите файлы скриптов MRI с помощью параметра -c; используйте параметр -T для запуска скриптов линкера, написанных на универсальном языке скриптов ld. Если MRI-cmdfile не существует, ld ищет его в каталогах, указанных параметрами -L.

-d
-dc
-dp Эти три опции эквивалентны; поддерживаются несколько форм для совместимости с другими
линкерами. Они выделяют пространство для общих символов, даже если указан переносимый выходной файл
(с помощью -r). Команда скрипта "FORCE_COMMON_ALLOCATION" имеет тот же эффект.

--depaudit AUDITLIB
-P AUDITLIB
Добавляет AUDITLIB в запись "DT\_DEPAUDIT" динамического раздела. AUDITLIB не проверяется на
существование, и не будет использоваться DT_SONAME, указанный в библиотеке. Если указано несколько
раз, "DT_DEPAUDIT" будет содержать список интерфейсов аудита, разделенных двоеточием. Эта
опция имеет смысл только на платформах ELF, поддерживающих интерфейс rtld-audit. Опция -P
предоставляется для совместимости с Solaris.

--enable-linker-version
Включает директиву linker script "LINKER\_VERSION", описанную в разделе "Output Section Data". Если
эта директива используется в linker script и эта опция включена, то в текущую точку будет
вставлена строка, содержащая версию линкера.

Обратите внимание - местоположение этой опции в командной строке линкера имеет значение. Она будет
влиять только на linker script, которые следуют за ней в командной строке, или которые встроены в
линкер.

--disable-linker-version
Отключает директиву linker script "LINKER\_VERSION", так что она не будет вставлять строку версии.
Это значение по умолчанию.

--enable-non-contiguous-regions
Эта опция предотвращает генерацию ошибки, если входной раздел не помещается в соответствующий
выходной раздел. Линкер пытается выделить входной раздел в последующие соответствующие выходные
разделы и генерирует ошибку только в том случае, если ни один выходной раздел не достаточно велик.
Это полезно, когда доступны несколько несмежных областей памяти, и входной раздел не требует
конкретной из них. Порядок, в котором оцениваются входные разделы, не меняется, например:

MEMORY {
MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14
MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40
MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40
}
SECTIONS {
mem1 : { *(.data.*); } > MEM1
mem2 : { *(.data.*); } > MEM2
mem3 : { *(.data.*); } > MEM3
}

с входными разделами:
.data.1: размер 8
.data.2: размер 0x10
.data.3: размер 4

в результате .data.1 помещается в mem1, а .data.2 и .data.3
помещаются в mem2, даже если .data.3 поместился бы в mem3.

Эта опция несовместима с операторами INSERT, поскольку она меняет способ сопоставления входных
разделов с выходными.

--enable-non-contiguous-regions-warnings
Эта опция включает предупреждения, когда "--enable-non-contiguous-regions" допускает, возможно,
неожиданные сопоставления в разделах, что потенциально может привести к тихому отбрасыванию
раздела, а не к ошибке, потому что он не помещается ни в один выходной раздел.

-e entry
--entry=entry
Используйте указанное значение в качестве явного символа, обозначающего начало выполнения программы, вместо точки входа по умолчанию. Если символ с именем «entry» отсутствует, компоновщик попытается интерпретировать «entry» как число и использовать его в качестве адреса точки входа (число будет интерпретироваться в десятичной системе; можно использовать префикс «0x» для шестнадцатеричной системы или «0» для восьмеричной системы). Для i386 PE, «entry» также может быть исходным именем функции (без начального символа подчеркивания и/или конечного символа «stdcall @number», если применимо).

--exclude-libs lib,lib,...
Указывает список архивных библиотек, из которых символы не должны автоматически экспортироваться. Имена библиотек могут быть разделены запятыми или двоеточиями. Указание «--exclude-libs ALL» исключает символы из всех архивных библиотек из автоматического экспорта. Этот параметр доступен только для i386 PE и ELF. Для i386 PE символы, явно перечисленные в файле .def, все равно экспортируются, независимо от этого параметра. Для ELF символы, на которые влияет этот параметр, будут рассматриваться как скрытые.

--exclude-modules-for-implib module,module,...
Указывает список объектных файлов или членов архива, из которых символы не должны автоматически экспортироваться, но которые должны быть скопированы целиком в библиотеку импорта, создаваемую во время компоновки. Имена модулей могут быть разделены запятыми или двоеточиями и должны точно соответствовать именам файлов, используемым ld для открытия файлов; для членов архива это просто имя члена, но для объектных файлов имя, указанное, должно включать и точно соответствовать любому пути, используемому для указания входного файла в командной строке компоновщика. Этот параметр доступен только для i386 PE. Символы, явно перечисленные в файле .def, все равно экспортируются, независимо от этого параметра.

-E
--export-dynamic
--no-export-dynamic
При создании динамически связанного исполняемого файла использование параметра -E или --export-dynamic заставляет компоновщик добавлять все символы в динамическую таблицу символов. Динамическая таблица символов — это набор символов, которые видны из динамических объектов во время выполнения.

Если вы не используете ни один из этих параметров (или используете параметр --no-export-dynamic для восстановления поведения по умолчанию), динамическая таблица символов обычно будет содержать только те символы, на которые ссылается какой-либо динамический объект, указанный при компоновке.

Если вы используете «dlopen» для загрузки динамического объекта, которому необходимо ссылаться на символы, определенные программой, а не каким-либо другим динамическим объектом, то, скорее всего, вам потребуется использовать этот параметр при компоновке самой программы.

Вы также можете использовать динамический список для управления тем, какие символы следует добавлять в динамическую таблицу символов, если формат вывода это поддерживает. См. описание параметра --dynamic-list.

Обратите внимание, что этот параметр специфичен для ELF-ориентированных портов. PE-цели поддерживают аналогичную функцию для экспорта всех символов из DLL или EXE; см. описание --export-all-symbols ниже.

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

^ -export-dynamic-symbol-list=file Укажите --export-dynamic-symbol для каждого шаблона в файле. Формат файла такой же, как и у узла версии, без области действия и имени узла. См. раздел VERSION для получения дополнительной информации.

^ EB Связывание объектов в формате big-endian. Это влияет на формат выходных данных по умолчанию.

^ EL Связывание объектов в формате little-endian. Это влияет на формат выходных данных по умолчанию.

^ f name ^ -auxiliary=name При создании ELF-совместимого общего объекта установите внутреннее поле DT_AUXILIARY в указанное имя. Это сообщает динамическому загрузчику, что таблицу символов общего объекта следует использовать в качестве дополнительного фильтра для таблицы символов указанного общего объекта.

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

Этот параметр можно указать несколько раз. Записи DT_AUXILIARY будут создаваться в том порядке, в котором они появляются в командной строке.

^ F name ^ -filter=name При создании ELF-совместимого общего объекта установите внутреннее поле DT_FILTER в указанное имя. Это сообщает динамическому загрузчику, что таблицу символов создаваемого общего объекта следует использовать в качестве фильтра для таблицы символов указанного общего объекта.

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

В некоторых старых линкерах параметр -F использовался во всей цепочке компиляции для указания формата объектного файла как для входных, так и для выходных объектных файлов. GNU Linker использует другие механизмы для этого: параметры -b, --format, --oformat, команду TARGET в скриптах линковщика и переменную среды GNUTARGET. GNU Linker будет игнорировать параметр -F, когда он не создает ELF-совместимый общий объект.


-fini=name

При создании исполняемого файла или разделяемой библиотеки, вызывайте NAME при выгрузке исполняемого файла или разделяемой библиотеки, устанавливая DT_FINI в адрес этой функции. По умолчанию, компоновщик использует "_fini" в качестве вызываемой функции.

-g Игнорируется. Предоставлено для совместимости с другими инструментами.

-G value
--gpsize=value

Установите максимальный размер объектов, которые будут оптимизированы с использованием регистра GP, равным size. Это имеет смысл только для форматов объектных файлов, таких как MIPS ELF, которые поддерживают размещение больших и маленьких объектов в разных разделах. Для других форматов объектных файлов это игнорируется.

-h name
-soname=name

При создании ELF-разделяемой библиотеки установите внутреннее поле DT_SONAME в указанное имя. Когда исполняемый файл связан с разделяемой библиотекой, имеющей поле DT_SONAME, то при запуске исполняемого файла динамический компоновщик попытается загрузить разделяемую библиотеку, указанную в DT_SONAME, а не использовать имя файла, переданное компоновщику.

-i Выполните инкрементную компоновку (аналогично опции -r).

-init=name

При создании исполняемого файла или разделяемой библиотеки, вызывайте NAME при загрузке исполняемого файла или разделяемой библиотеки, устанавливая DT_INIT в адрес этой функции. По умолчанию, компоновщик использует "_init" в качестве вызываемой функции.

-l namespec
--library=namespec

Добавьте архив или объектный файл, указанный в namespec, в список файлов для компоновки. Эту опцию можно использовать несколько раз. Если namespec имеет вид :filename, ld будет искать в пути библиотеки файл с именем filename, в противном случае он будет искать в пути библиотеки файл с именем libnamespec.a.

В системах, поддерживающих разделяемые библиотеки, ld также может искать файлы, отличные от libnamespec.a. В частности, в системах ELF и SunOS, ld будет искать в каталоге библиотеку с именем libnamespec.so, прежде чем искать libnamespec.a. (По соглашению, расширение ".so" указывает на разделяемую библиотеку.) Обратите внимание, что это поведение не применяется к :filename, который всегда указывает на файл с именем filename.

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

См. опцию -( для способа заставить компоновщик несколько раз искать в архивах.

Вы можете указать один и тот же архив несколько раз в командной строке.

Этот тип поиска в архивах является стандартным для Unix-компоновщиков. Однако, если вы используете ld в AIX, обратите внимание, что это отличается от поведения компоновщика AIX.

-L searchdir
--library-path=searchdir

Добавляет путь searchdir в список путей, по которым ld будет искать архивные библиотеки и скрипты управления ld. Эту опцию можно использовать любое количество раз. Каталоги просматриваются в порядке, в котором они указаны в командной строке. Каталоги, указанные в командной строке, просматриваются перед каталогами по умолчанию. Все опции -L применяются ко всем опциям -l, независимо от порядка, в котором они появляются. Опции -L не влияют на то, как ld ищет файл сценария компоновки, если не указана опция -T.

Если searchdir начинается с = или $SYSROOT, то этот префикс будет заменен префиксом sysroot, который контролируется опцией --sysroot или указывается при настройке компоновщика.

Набор путей по умолчанию, которые просматриваются (без указания с помощью -L), зависит от того, какой режим эмуляции использует ld, а в некоторых случаях также от того, как он был настроен.

Пути также можно указать в файле сценария компоновки с помощью команды SEARCH_DIR. Каталоги, указанные таким образом, просматриваются в тот момент, когда сценарий компоновки появляется в командной строке.

-m emulation

Эмулирует указанный режим эмуляции компоновщика. Вы можете получить список доступных режимов эмуляции с помощью опций --verbose или -V.

Если опция -m не используется, то режим эмуляции берется из переменной окружения LDEMULATION, если она определена.

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

--remap-inputs=pattern=filename
--remap-inputs-file=file

Эти опции позволяют изменять имена входных файлов перед тем, как компоновщик попытается их открыть. Опция --remap-inputs=foo.o=bar.o приведет к тому, что любая попытка загрузить файл с именем foo.o будет вместо этого пытаться загрузить файл с именем bar.o. Разрешены подстановочные знаки в первом имени файла, поэтому --remap-inputs=foo*.o=bar.o переименует любой входной файл, соответствующий шаблону foo*.o, в bar.o.

Альтернативная форма опции --remap-inputs-file=filename позволяет считывать переназначения из файла. Каждая строка в файле может содержать одно переназначение. Пустые строки игнорируются. Все, что находится от символа решетки (#) до конца строки, считается комментарием и также игнорируется. Шаблон сопоставления можно отделить от имени файла пробелами или знаком равенства (=).

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

Если имя заменяемого файла — /dev/null или просто NUL, то переназначение фактически приведет к тому, что входной файл будет игнорироваться. Это может быть удобным способом поэкспериментировать с удалением входных файлов из сложной среды сборки.


Обратите внимание, что этот параметр зависит от позиции и влияет только на имена файлов, следующие за ним в командной строке. Таким образом:

ld foo.o --remap-inputs=foo.o=bar.o

не будет иметь эффекта, в то время как:

ld --remap-inputs=foo.o=bar.o foo.o

переименует входной файл foo.o в bar.o.

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

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

Если включены параметры -Map или --print-map, то список переназначений будет включен в выходные данные карты.

-M
--print-map

Вывести карту компоновки в стандартный вывод. Карта компоновки предоставляет информацию о компоновке, включая следующее:

Где объектные файлы отображаются в память.

Как выделяются общие символы.

Все члены архива, включенные в компоновку, с указанием символа, который привел к включению члена архива.

Значения, присвоенные символам.

Примечание: символы, значения которых вычисляются выражением, которое включает ссылку на предыдущее значение того же символа, могут не иметь правильного результата, отображаемого в карте компоновки. Это связано с тем, что компоновщик отбрасывает промежуточные результаты и сохраняет только конечное значение выражения. В таких случаях компоновщик будет отображать конечное значение в квадратных скобках. Таким образом, например, скрипт компоновщика, содержащий:

foo = 1
foo = foo * 4
foo = foo + 8

выдаст следующий результат в карте компоновки, если используется опция -M:

000000001                foo = 0x1
[0x0000000c]                foo = (foo * 0x4)
[0x0000000c]                foo = (foo + 0x8)

См. раздел Выражения для получения дополнительной информации о выражениях в скриптах компоновщика.

Как объединяются свойства GNU.

Когда компоновщик объединяет входные разделы .note.gnu.property в один выходной раздел .note.gnu.property, некоторые свойства удаляются или обновляются. Эти действия отображаются в карте компоновки. Например:

Удалено свойство 0xc0000002 для объединения foo.o (0x1) и bar.o (не найдено)

Это указывает на то, что свойство 0xc0000002 удаляется из выходных данных при объединении свойств в foo.o, значение свойства 0xc0000002 которого равно 0x1, и bar.o, которое не имеет свойства 0xc0000002.

Обновлено свойство 0xc0010001 (0x1) для объединения foo.o (0x1) и bar.o (0x1)

Это указывает на то, что значение свойства 0xc0010001 обновляется до 0x1 в выходных данных при объединении свойств в foo.o, значение свойства 0xc0010001 которого равно 0x1, и bar.o, значение свойства 0xc0010001 которого равно 0x1.

Для некоторых ELF-целей, список исправлений, добавленных параметром --relax

foo.o: Корректировка перехода в 0x00000008 к "far" в разделе .text

Это указывает на то, что переход в 0x00000008 в foo.o, нацеленный на символ "far" в разделе .text, был заменен трамплином.


--print-map-discarded
--no-print-map-discarded

Вывести (или не выводить) список отброшенных и собранных мусором секций в карте компоновки. Включено по умолчанию.

--print-map-locals
--no-print-map-locals

Вывести (или не выводить) локальные символы в карте компоновки. Локальные символы будут иметь текст "(local)", напечатанный перед их именем, и будут перечислены после всех глобальных символов в данной секции. Временные локальные символы (обычно те, которые начинаются с .L) не будут включены в вывод. Отключено по умолчанию.

-n
--nmagic

Отключить выравнивание страниц секций и отключить связывание с общими библиотеками. Если формат вывода поддерживает Unix-подобные магические числа, пометить вывод как "NMAGIC".

-N
--omagic

Установить секции текста и данных как доступные для чтения и записи. Кроме того, не выравнивать по страницам сегмент данных и отключить связывание с общими библиотеками. Если формат вывода поддерживает Unix-подобные магические числа, пометить вывод как "OMAGIC". Обратите внимание: хотя раздел текста, доступный для записи, разрешен для целей PE-COFF, он не соответствует спецификации формата, опубликованной Microsoft.

--no-omagic

Этот параметр отменяет большую часть эффектов параметра -N. Он устанавливает секцию текста как доступную только для чтения и принудительно выравнивает сегмент данных по страницам. Обратите внимание, что этот параметр не включает связывание с общими библиотеками. Используйте -Bdynamic для этого.

-o output
--output=output

Использовать output в качестве имени программы, созданной ld; если этот параметр не указан, по умолчанию используется имя a.out. Скрипт-команда "OUTPUT" также может указать имя выходного файла.

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

Обратите внимание, что компоновщик проверит, не совпадает ли имя выходного файла с именем какого-либо из входных файлов, и это все. В частности, он не будет жаловаться, если выходной файл может перезаписать исходный файл или какой-либо другой важный файл. Поэтому в системах сборки рекомендуется использовать параметр -o в качестве последнего параметра в командной строке компоновщика. Например:

ld -o $(EXE) $(OBJS)
ld $(OBJS) -o $(EXE)

Если переменная EXE по какой-то причине не определена, первая версия команды компоновщика может привести к удалению одного из объектных файлов (первого в списке OBJS), в то время как вторая версия команды компоновщика выдаст сообщение об ошибке и ничего не удалит.

--dependency-file=depfile

Записать файл зависимостей в файл depfile. Этот файл содержит правило, подходящее для "make", описывающее выходной файл и все входные файлы, которые были прочитаны для его создания. Вывод аналогичен выводу компилятора с параметрами -M -MP. Обратите внимание, что нет параметра, подобного параметру компилятора -MM, для исключения "системных файлов" (что не является четко определенной концепцией в компоновщике, в отличие от "системных заголовков" в компиляторе). Таким образом, выходные данные из --dependency-file всегда специфичны для конкретного состояния установки, в которой они были созданы, и их не следует копировать в распространяемые файлы make без тщательного редактирования.


-O level

Если level — это числовое значение, большее нуля, ld оптимизирует выходные данные. Это может занять значительно больше времени и, следовательно, следует включать только для окончательной сборки. В настоящее время эта опция влияет только на создание общих библиотек ELF. В будущих версиях компоновщика эта опция может использоваться более широко. Кроме того, в настоящее время поведение компоновщика не отличается для разных ненулевых значений этой опции. Это также может измениться в будущих версиях.

-plugin name

Подключите плагин к процессу компоновки. Параметр name — это абсолютный путь к файлу плагина. Обычно этот параметр автоматически добавляется компилятором при использовании оптимизации времени компоновки, но пользователи также могут добавлять собственные плагины, если это необходимо.

Обратите внимание, что расположение плагинов, созданных компилятором, отличается от места, где программы ar, nm и ranlib ищут свои плагины. Чтобы эти команды могли использовать плагин, созданный компилятором, его сначала необходимо скопировать в каталог ${libdir}/bfd-plugins. Все плагины компоновщика GCC обратно совместимы, поэтому достаточно скопировать только последний.

--push-state

Опция --push-state позволяет сохранить текущее состояние флагов, управляющих обработкой входных файлов, чтобы их можно было восстановить с помощью соответствующей опции --pop-state.

Опции, на которые это влияет: -Bdynamic, -Bstatic, -dn, -dy, -call_shared, -non_shared, -static, -N, -n, --whole-archive, --no-whole-archive, -r, -Ur, --copy-dt-needed-entries, --no-copy-dt-needed-entries, --as-needed, --no-as-needed и -a.

Одной из целей этой опции является создание спецификаций для pkg-config. При использовании с опцией --libs перечисляются все необходимые библиотеки, и затем они могут быть связаны постоянно. Лучше возвращать что-то вроде следующего:

-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state

--pop-state

Отменяет действие --push-state и восстанавливает предыдущие значения флагов, управляющих обработкой входных файлов.

-q
--emit-relocs

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

Эта опция в настоящее время поддерживается только на платформах ELF.

--force-dynamic

Принудительно создает динамические разделы в выходном файле. Эта опция специфична для целей VxWorks.

-r
--relocatable

Генерирует релоцируемый выходной файл, то есть создает выходной файл, который, в свою очередь, может быть использован в качестве входных данных для ld. Это часто называют частичной связью. Как побочный эффект, в средах, поддерживающих стандартные магические числа Unix, эта опция также устанавливает магическое число выходного файла в "OMAGIC". Если эта опция не указана, создается абсолютный файл. При компоновке программ C++ эта опция не разрешает ссылки на конструкторы; для этого используйте -Ur.


Если входной файл имеет формат, отличный от выходного, частичная линковка поддерживается только в том случае, если входной файл не содержит релокаций. Различные выходные форматы могут иметь дополнительные ограничения; например, некоторые форматы на основе «a.out» вообще не поддерживают частичную линковку с входными файлами в других форматах.

Когда релоцируемый выход содержит как содержимое, требующее оптимизации времени линковки (LTO), так и содержимое, не требующее LTO, создается раздел .gnu_object_only, содержащий релоцируемый объектный файл, как если бы к нему применялась опция -r для всех релоцируемых входных файлов, не требующих LTO. При обработке релоцируемого входного файла с разделом .gnu_object_only линкер извлекает этот раздел .gnu_object_only в качестве отдельного входного файла.

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

Эта опция делает то же самое, что и -i.

-R filename
--just-symbols=filename

Считывает имена символов и их адреса из файла filename, но не выполняет релокацию и не включает его в выходные данные. Это позволяет вашему выходному файлу символически ссылаться на абсолютные адреса памяти, определенные в других программах. Эту опцию можно использовать несколько раз.

Для совместимости с другими ELF-линкерами, если после опции -R следует имя каталога, а не имя файла, она интерпретируется как опция -rpath.

--rosegment
--no-rosegment

Пытается гарантировать, что будет создан только один сегмент, доступный только для чтения и не содержащий код. Полезна только при использовании вместе с опцией -z separate-code. В результате двоичные файлы должны быть меньше, чем при использовании только опции -z separate-code. Без этой опции или если указана --no-rosegment, опция -z separate-code создаст два сегмента, доступных только для чтения, один перед сегментом кода, а другой после него.

Названия опций могут быть вводящими в заблуждение, но они были выбраны для обеспечения совместимости линкера с линкерами LLD и GOLD.

Эти опции поддерживаются только для ELF-целей.

-s
--strip-all

Удаляет всю информацию о символах из выходного файла.

-S
--strip-debug

Удаляет отладочную информацию о символах (но не все символы) из выходного файла.

--strip-discarded
--no-strip-discarded

Удаляет (или не удаляет) глобальные символы, определенные в удаленных разделах. Включено по умолчанию.

-plugin-save-temps

Сохраняет промежуточные файлы плагина, которые обычно удаляются.

-t
--trace

Выводит имена входных файлов по мере их обработки линкером ld. Если опция -t указана дважды, также выводятся элементы внутри архивов. Вывод -t полезен для создания списка всех объектных файлов и скриптов, участвующих в линковке, например, при подготовке файлов для отчета об ошибке линкера.


-T scriptfile
--script=scriptfile

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

Если файл scriptfile не существует в текущем каталоге, программа "ld" ищет его в каталогах, указанных в предыдущих параметрах -L.

Параметры командной строки, которые появляются перед параметром -T, могут влиять на сценарий, но параметры командной строки, которые появляются после него, не влияют.

Несколько параметров -T будут накапливаться, если они дополняют текущий сценарий, в противном случае будет использоваться последний, не дополняющий параметр -T.

Существуют и другие способы указания сценариев компоновщика. См.

-dT scriptfile
--default-script=scriptfile

Используйте scriptfile в качестве сценария компоновщика по умолчанию.

Этот параметр аналогичен параметру --script, за исключением того, что обработка сценария откладывается до тех пор, пока не будут обработаны все остальные параметры командной строки. Это позволяет параметрам, расположенным после параметра --default-script в командной строке, влиять на поведение сценария компоновщика, что может быть важно, когда командная строка компоновщика не может контролироваться напрямую пользователем (например, потому, что командная строка создается другим инструментом, таким как gcc).

-u symbol
--undefined=symbol

Принудительно добавьте символ в выходной файл как неопределенный символ. Это может, например, привести к тому, что будут подключены дополнительные модули из стандартных библиотек. Параметр -u может быть повторен с разными аргументами, чтобы добавить дополнительные неопределенные символы. Этот параметр эквивалентен команде "EXTERN" в сценарии компоновщика.

Если этот параметр используется для того, чтобы принудительно подключить дополнительные модули, и если возникает ошибка, когда символ остается неопределенным, следует использовать параметр --require-defined.

--require-defined=symbol

Требуется, чтобы символ был определен в выходном файле. Этот параметр аналогичен параметру --undefined, за исключением того, что если символ не определен в выходном файле, компоновщик выдаст ошибку и завершит работу. Того же эффекта можно добиться в сценарии компоновщика, используя вместе "EXTERN", "ASSERT" и "DEFINED". Этот параметр можно использовать несколько раз, чтобы потребовать дополнительные символы.

-Ur Для программ, которые не используют конструкторы или деструкторы, или для систем на базе ELF, этот параметр эквивалентен -r: он создает перекомпилируемый выходной файл, т.е. выходной файл, который, в свою очередь, может использоваться в качестве входных данных для ld. Однако для других бинарных файлов параметр -Ur аналогичен -r, но он также разрешает ссылки на конструкторы и деструкторы.

Для тех систем, где -r и -Ur ведут себя по-разному, не следует использовать -Ur для файлов, которые были скомпилированы с помощью -Ur; после того, как таблица конструкторов была создана, ее нельзя добавить. Используйте -Ur только для последней части компоновки, а -r для остальных.


--orphan-handling=MODE
Определяет, как обрабатывать «сиротские» разделы. «Сиротский» раздел — это раздел, который не указан
в скрипте компоновщика.

MODE может иметь одно из следующих значений:

"place"
«Сиротские» разделы помещаются в подходящий выходной раздел в соответствии со стратегией,
описанной в разделе «Сиротские разделы». Опция --unique также влияет на то, как размещаются разделы.

"discard"
Все «сиротские» разделы отбрасываются путем их помещения в раздел /DISCARD/.

"warn"
Компоновщик помещает «сиротский» раздел так же, как и для "place", и также выдает предупреждение.

"error"
Компоновщик завершает работу с ошибкой, если найден какой-либо «сиротский» раздел.

Если опция --orphan-handling не указана, по умолчанию используется "place".

--unique[=SECTION]
Создает отдельный выходной раздел для каждого входного раздела, соответствующего SECTION, или, если
не указан необязательный аргумент подстановочного знака SECTION, для каждого «сиротского» входного раздела. «Сиротский»
раздел — это раздел, который не указан в скрипте компоновщика. Эту опцию можно использовать несколько раз в командной строке; она предотвращает нормальное объединение входных разделов с
одинаковыми именами, переопределяя назначения выходных разделов в скрипте компоновщика.

-v
--version
-V  Отображает номер версии для ld. Опция -V также перечисляет поддерживаемые эмуляции. См. также описание опции --enable-linker-version в разделе «Параметры», «Параметры командной строки», которую можно использовать для вставки строки версии компоновщика в двоичный файл.

-x
--discard-all
Удаляет все локальные символы.

-X
--discard-locals
Удаляет все временные локальные символы. (Эти символы начинаются с системно-зависимых префиксов локальных меток, обычно .L для систем ELF или L для традиционных систем a.out).

-y symbol
--trace-symbol=symbol
Выводит имя каждого скомпонованного файла, в котором появляется символ. Эту опцию можно указать несколько раз. В многих системах необходимо добавлять перед символом символ подчеркивания.

Эта опция полезна, когда у вас есть неопределенный символ в компоновке, но вы не знаете, откуда взялась ссылка.

-Y path
Добавляет путь в путь поиска библиотеки по умолчанию. Эта опция существует для обеспечения совместимости с Solaris.

-z keyword
Распознаются следующие ключевые слова:

call-nop=prefix-addr
call-nop=suffix-nop
call-nop=prefix-byte
call-nop=suffix-byte
Указывает 1-байтовый «NOP» паддинг при преобразовании косвенного вызова в локально определенную
функцию, foo, через ее слот GOT. call-nop=prefix-addr генерирует "0x67 call foo".
call-nop=suffix-nop генерирует "call foo 0x90". call-nop=prefix-byte генерирует "byte call
foo". call-nop=suffix-byte генерирует "call foo byte". Поддерживается для i386 и x86_64.

cet-report=none
cet-report=warning
cet-report=error
Определяет, как сообщать об отсутствующих свойствах GNU_PROPERTY_X86_FEATURE_1_IBT и
GNU_PROPERTY_X86_FEATURE_1_SHSTK во входном разделе .note.gnu.property.
cet-report=none, который является значением по умолчанию, заставляет компоновщик не сообщать об отсутствующих свойствах
во входных файлах. cet-report=warning заставляет компоновщик выдавать предупреждение об отсутствующих
свойствах во входных файлах. cet-report=error заставляет компоновщик выдавать ошибку об отсутствующих
свойствах во входных файлах. Обратите внимание, что ibt отключит сообщение об отсутствующем
свойстве GNU_PROPERTY_X86_FEATURE_1_IBT, а shstk отключит сообщение об отсутствующем
свойстве GNU_PROPERTY_X86_FEATURE_1_SHSTK. Поддерживается для Linux/i386 и Linux/x86_64.

combreloc
nocombreloc

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

common
nocommon

Генерирует общие символы с типом STT_COMMON во время релоцируемой сборки. Использует тип STT_OBJECT, если указан флаг nocommon.

common-page-size=value

Устанавливает наиболее часто используемый размер страницы в значение value. Макет образа памяти будет оптимизирован для минимизации количества страниц памяти, если система использует страницы этого размера.

defs

Сообщает о неразрешенных ссылках на символы из обычных объектных файлов. Это делается даже в том случае, если компоновщик создает несимволическую общую библиотеку. Эта опция является обратной опции -z undefs.

dynamic-undefined-weak
nodynamic-undefined-weak

Преобразует неразрешенные слабые символы в динамические при создании динамического объекта, если на них есть ссылки из обычного объектного файла и они не помечены как локальные с помощью видимости символов или версионирования. Не преобразует их в динамические, если указан флаг nodynamic-undefined-weak. Если ни одна из опций не указана, целевая платформа может по умолчанию включать любую из этих опций или делать другой выбор неразрешенных слабых символов для преобразования в динамические. Не все целевые платформы поддерживают эти опции.

execstack

Помечает объект как требующий исполняемого стека.

global

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

globalaudit

Эта опция имеет смысл только при создании динамического исполняемого файла. Эта опция помечает исполняемый файл как требующий глобального аудита, устанавливая бит "DF_1_GLOBAUDIT" в динамическом теге "DT_FLAGS_1". Глобальный аудит требует, чтобы любая библиотека аудита, определенная с помощью опций командной строки --depaudit или -P, выполнялась для всех динамических объектов, загружаемых приложением.

ibtplt

Генерирует записи PLT, поддерживающие отслеживание косвенных переходов Intel (IBT). Поддерживается для Linux/i386 и Linux/x86_64.

ibt

Генерирует GNU_PROPERTY_X86_FEATURE_1_IBT в секции .note.gnu.property, чтобы указать совместимость с IBT. Это также подразумевает использование ibtplt. Поддерживается для Linux/i386 и Linux/x86_64.

indirect-extern-access
noindirect-extern-access

Генерирует GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS в секции .note.gnu.property, чтобы указать, что объектному файлу требуются канонические указатели функций и его нельзя использовать с релокацией копирования. Эта опция также подразумевает noextern-protected-data и nocopyreloc. Поддерживается для i386 и x86-64.


noindirect-extern-access   удаляет   GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS    из
раздела .note.gnu.property.

initfirst

Эта опция имеет смысл только при создании разделяемой библиотеки. Она помечает библиотеку таким образом, чтобы ее инициализация во время выполнения происходила до инициализации во время выполнения любых других библиотек, загружаемых в процесс одновременно. Аналогично, завершение работы библиотеки во время выполнения происходит после завершения работы любых других библиотек.

interpose

Укажите, что динамический загрузчик должен изменить порядок поиска символов таким образом, чтобы символы в этой разделяемой библиотеке перекрывали все остальные разделяемые библиотеки, которые также не помечены.

unique
nounique

При создании разделяемой библиотеки или другого динамически загружаемого ELF-объекта пометьте его как такой, который по умолчанию должен загружаться только один раз и только в основном пространстве имен (при использовании "dlmopen"). Это используется в основном для маркировки основных библиотек, таких как libc, libpthread и т. д., которые обычно не работают должным образом, если они не являются единственными экземплярами самих себя. Это поведение можно переопределить вызывающей стороной "dlmopen" и не применяется к определенным механизмам загрузки (например, к библиотекам аудита).

lam-u48

Создайте GNU_PROPERTY_X86_FEATURE_1_LAM_U48 в разделе .note.gnu.property, чтобы указать совместимость с Intel LAM_U48. Поддерживается для Linux/x86_64.

lam-u57

Создайте GNU_PROPERTY_X86_FEATURE_1_LAM_U57 в разделе .note.gnu.property, чтобы указать совместимость с Intel LAM_U57. Поддерживается для Linux/x86_64.

lam-u48-report=none
lam-u48-report=warning
lam-u48-report=error

Укажите, как сообщать об отсутствии свойства GNU_PROPERTY_X86_FEATURE_1_LAM_U48 во входном разделе .note.gnu.property. lam-u48-report=none, что является значением по умолчанию, заставит связующий редактор не сообщать об отсутствии свойств во входных файлах. lam-u48-report=warning заставит связующий редактор выдавать предупреждение об отсутствии свойств во входных файлах. lam-u48-report=error заставит связующий редактор выдавать ошибку об отсутствии свойств во входных файлах. Поддерживается для Linux/x86_64.

lam-u57-report=none
lam-u57-report=warning
lam-u57-report=error

Укажите, как сообщать об отсутствии свойства GNU_PROPERTY_X86_FEATURE_1_LAM_U57 во входном разделе .note.gnu.property. lam-u57-report=none, что является значением по умолчанию, заставит связующий редактор не сообщать об отсутствии свойств во входных файлах. lam-u57-report=warning заставит связующий редактор выдавать предупреждение об отсутствии свойств во входных файлах. lam-u57-report=error заставит связующий редактор выдавать ошибку об отсутствии свойств во входных файлах. Поддерживается для Linux/x86_64.

lam-report=none
lam-report=warning
lam-report=error

Укажите, как сообщать об отсутствии свойств GNU_PROPERTY_X86_FEATURE_1_LAM_U48 и GNU_PROPERTY_X86_FEATURE_1_LAM_U57 во входном разделе .note.gnu.property. lam-report=none, что является значением по умолчанию, заставит связующий редактор не сообщать об отсутствии свойств во входных файлах. lam-report=warning заставит связующий редактор выдавать предупреждение об отсутствии свойств во входных файлах. lam-report=error заставит связующий редактор выдавать ошибку об отсутствии свойств во входных файлах. Поддерживается для Linux/x86_64.


lazy

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

loadfltr

Укажите, что фильтры объекта должны быть обработаны немедленно во время выполнения.

max-page-size=value

Установите максимальный размер страницы памяти, поддерживаемый значением value.

mark-plt
nomark-plt

Пометьте записи PLT динамическими тегами, DT_X86_64_PLT, DT_X86_64_PLTSZ и DT_X86_64_PLTENT. Поскольку эта опция хранит ненулевое значение в поле r_addend релокаций R_X86_64_JUMP_SLOT, результирующие исполняемые файлы и разделяемые библиотеки несовместимы с динамическими загрузчиками, такими как те, что в старых версиях glibc, у которых отсутствует изменение, игнорирующее r_addend в релокациях R_X86_64_GLOB_DAT и R_X86_64_JUMP_SLOT, которые не игнорируют поле r_addend релокаций R_X86_64_JUMP_SLOT. Поддерживается для x86_64.

muldefs

Разрешить множественные определения.

nocopyreloc

Отключите переменные .dynbss, создаваемые компоновщиком и используемые вместо переменных, определенных в разделяемых библиотеках. Это может привести к динамическим релокациям текста.

nodefaultlib

Укажите, что динамический загрузчик при поиске зависимостей этого объекта должен игнорировать все пути поиска библиотек по умолчанию.

nodelete

Укажите, что объект не должен быть выгружен во время выполнения.

nodlopen

Укажите, что объект недоступен для "dlopen".

nodump

Укажите, что объект не может быть сброшен с помощью "dldump".

noexecstack

Помечает объект как не требующий исполняемого стека.

noextern-protected-data

Не рассматривайте защищенные символы данных как внешние при создании разделяемой библиотеки. Эта опция переопределяет значение по умолчанию для компоновщика. Ее можно использовать для обхода неправильных релокаций в отношении защищенных символов данных, создаваемых компилятором. Обновления защищенных символов данных из другого модуля не будут видны в результирующей разделяемой библиотеке. Поддерживается для i386 и x86-64.

noreloc-overflow

Отключите проверку переполнения релокаций. Это можно использовать для отключения проверки переполнения релокаций, если не будет динамического переполнения релокаций во время выполнения. Поддерживается для x86_64.

memory-seal
nomemory-seal

Укажите, что все сегменты PT_LOAD в исполняемом файле или разделяемой библиотеке должны быть запечатаны, чтобы предотвратить дальнейшие манипуляции (например, изменение флагов защиты, размера сегмента или удаление отображения). Это мера по повышению безопасности, требующая поддержки системы. Это генерирует GNU_PROPERTY_MEMORY_SEAL в разделе .note.gnu.property.

now

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


origin

Укажите, что для объекта необходимо использовать обработку $ORIGIN в путях.

pack-relative-relocs
nopack-relative-relocs

Создает компактные относительные релокации в исполняемых файлах и общих библиотеках, позиционно-независимых. Добавляет записи "DT_RELR", "DT_RELRSZ" и "DT_RELRENT" в динамический раздел. Игнорируется при создании позиционно-зависимого исполняемого файла и переносимого выходного файла. nopack-relative-relocs является значением по умолчанию, которое отключает компактные относительные релокации. При линковке с библиотекой GNU C добавляется зависимость версии символа GLIBC_ABI_DT_RELR в выходном файле для общей библиотеки C. Поддерживается для i386 и x86-64.

relro
norelro

Создает заголовок сегмента ELF "PT_GNU_RELRO" в объекте. Это указывает сегмент памяти, который должен быть сделан доступным только для чтения после релокации, если это поддерживается. Указание размера общей страницы, меньшего, чем системный размер страницы, сделает эту защиту неэффективной. Если указано norelro, заголовок сегмента ELF "PT_GNU_RELRO" не создается.

report-relative-reloc

Сообщает о динамических относительных релокациях, сгенерированных компоновщиком. Поддерживается для Linux/i386 и Linux/x86_64.

sectionheader
nosectionheader

Создает заголовок раздела. Если используется nosectionheader, заголовок раздела не создается. sectionheader является значением по умолчанию.

separate-code
noseparate-code

Создает отдельный сегмент кода "PT_LOAD" в объекте. Это указывает сегмент памяти, который должен содержать только инструкции и должен находиться в полностью раздельных страницах от любых других данных. Если используется noseparate-code, отдельный сегмент кода "PT_LOAD" не создается.

shstk

Создает GNU_PROPERTY_X86_FEATURE_1_SHSTK в разделе .note.gnu.property, чтобы указать совместимость с Intel Shadow Stack. Поддерживается для Linux/i386 и Linux/x86_64.

stack-size=value

Указывает размер стека для сегмента ELF "PT_GNU_STACK". Указание нуля отменит любое значение по умолчанию для создания сегмента "PT_GNU_STACK" ненулевого размера.

start-stop-gc
nostart-stop-gc

Когда включена опция --gc-sections, ссылка из сохраненного раздела на __start_SECNAME или __stop_SECNAME приводит к тому, что все входные разделы с именем SECNAME также сохраняются, если SECNAME может быть представлен как идентификатор C, и либо __start_SECNAME, либо __stop_SECNAME синтезируются компоновщиком. Опция -z start-stop-gc отключает этот эффект, позволяя разделам быть удаленными сборщиком мусора, как если бы специальные синтезированные символы не были определены. Опция -z start-stop-gc не оказывает влияния на определение __start_SECNAME или __stop_SECNAME в объектном файле или скрипте компоновщика. Такое определение предотвращает предоставление компоновщиком синтезированных __start_SECNAME или __stop_SECNAME соответственно, и, следовательно, специальная обработка сборщиком мусора для этих ссылок.

start-stop-visibility=value

Указывает видимость символов ELF для синтезированных символов __start_SECNAME и __stop_SECNAME. value должно быть точно равно default, internal, hidden или protected. Если опция -z start-stop-visibility не указана, для совместимости с исторической практикой используется protected. Однако настоятельно рекомендуется использовать -z start-stop-visibility=hidden в новых программах и общих библиотеках, чтобы эти символы не экспортировались между общими объектами, что обычно не предполагается.


text
notext
textoff

Сообщать об ошибке, если установлен флаг DT_TEXTREL, то есть, если позиционно-независимый или совместно используемый объект имеет динамические пересылки в секциях, доступных только для чтения. Не сообщать об ошибке, если указаны флаги notext или textoff.

undefs

Не сообщать об неразрешенных ссылках на символы из обычных объектных файлов, будь то при создании исполняемого файла или при создании общей библиотеки. Эта опция является обратной опции -z defs.

unique-symbol
nounique-symbol

Избегать дублирования локальных имен символов в таблице строк символов. При использовании unique-symbol к дублирующимся локальным именам символов добавляется ".номер". nounique-symbol является значением по умолчанию.

x86-64-baseline
x86-64-v2
x86-64-v3
x86-64-v4

Указывает необходимый уровень ISA x86-64 в секции .note.gnu.property. x86-64-baseline генерирует "GNU_PROPERTY_X86_ISA_1_BASELINE". x86-64-v2 генерирует "GNU_PROPERTY_X86_ISA_1_V2". x86-64-v3 генерирует "GNU_PROPERTY_X86_ISA_1_V3". x86-64-v4 генерирует "GNU_PROPERTY_X86_ISA_1_V4". Поддерживается для Linux/i386 и Linux/x86_64.

isa-level-report=none
isa-level-report=all
isa-level-report=needed
isa-level-report=used

Указывает, как сообщать об уровнях ISA x86-64 во входных пересылаемых файлах. isa-level-report=none, который является значением по умолчанию, не позволяет связывающему редактору сообщать об уровнях ISA x86-64 во входных файлах. isa-level-report=all заставляет связывающий редактор сообщать о необходимых и используемых уровнях ISA x86-64 во входных файлах. isa-level-report=needed заставляет связывающий редактор сообщать о необходимых уровнях ISA x86-64 во входных файлах. isa-level-report=used заставляет связывающий редактор сообщать об используемых уровнях ISA x86-64 во входных файлах. Поддерживается для Linux/i386 и Linux/x86_64.

Другие ключевые слова игнорируются для совместимости с Solaris.

--gnu-tls-tag
--no-gnu-tls-tag

Добавляет зависимость от версии "GLIBC_ABI_GNU_TLS" в выходных программах и общих библиотеках при связывании с glibc, если во входных пересылаемых объектных файлах есть вызов "___tls_get_addr". Выходные данные не будут загружаться и выполняться во время выполнения в glibc, который не определяет тег версии "GLIBC_ABI_GNU_TLS". Если только не отключено опцией --disable-gnu-tls-tag во время сборки связывающего редактора, когда не указаны опции, связывающий редактор добавит зависимость от тега версии "GLIBC_ABI_GNU_TLS", если во входных данных есть вызов "___tls_get_addr" и libc.so определяет тег версии "GLIBC_ABI_GNU_TLS". Поддерживается для Linux/i386.

--gnu2-tls-tag
--no-gnu2-tls-tag

Добавляет зависимость от версии "GLIBC_ABI_GNU2_TLS" в выходных программах и общих библиотеках при связывании с glibc, если во входных пересылаемых объектных файлах есть пересылка "R_386_TLS_DESC_CALL" или "R_X86_64_TLSDESC_CALL". Выходные данные не будут загружаться и выполняться во время выполнения в glibc, который не определяет тег версии "GLIBC_ABI_GNU2_TLS". Если не отключено опцией --disable-gnu2-tls-tag во время сборки связывающего редактора, когда не указаны опции, связывающий редактор добавит зависимость от тега версии "GLIBC_ABI_GNU2_TLS", если во входных данных есть пересылка "R_386_TLS_DESC_CALL" или "R_X86_64_TLSDESC_CALL" и libc.so определяет тег версии "GLIBC_ABI_GNU2_TLS". Поддерживается для Linux/i386 и Linux/x86_64.


-( archives -)
--start-group archives --end-group

Архивы должны представлять собой список архивных файлов. Это могут быть либо явные имена файлов, либо параметры -l.

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

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

--accept-unknown-input-arch
--no-accept-unknown-input-arch

Указывает компоновщику принимать входные файлы, архитектуру которых невозможно распознать. Предполагается, что пользователь знает, что делает, и намеренно хочет подключить эти неизвестные входные файлы. До версии 2.14 это было поведением компоновщика по умолчанию. По умолчанию, начиная с версии 2.14, такие входные файлы отклоняются, и поэтому добавлен параметр --accept-unknown-input-arch для восстановления старого поведения.

--as-needed
--no-as-needed

Этот параметр влияет на теги ELF DT_NEEDED для динамических библиотек, указанных в командной строке после параметра --as-needed. Обычно компоновщик добавляет тег DT_NEEDED для каждой динамической библиотеки, указанной в командной строке, независимо от того, требуется ли библиотека фактически или нет. Параметр --as-needed приводит к тому, что тег DT_NEEDED будет выдаваться только для библиотеки, которая в данный момент в процессе компоновки удовлетворяет неслабую неразрешенную ссылку на символ из обычного объектного файла или, если библиотека не найдена в списках DT_NEEDED других необходимых библиотек, неслабую неразрешенную ссылку на символ из другой необходимой динамической библиотеки. Объектные файлы или библиотеки, указанные в командной строке после рассматриваемой библиотеки, не влияют на то, считается ли библиотека необходимой. Это аналогично правилам извлечения объектных файлов из архивов. Параметр --no-as-needed восстанавливает поведение по умолчанию.


Примечание: в Linux-подобных системах опция `--as-needed` также влияет на поведение опций `--rpath` и `--rpath-link`. См. описание опции `--rpath-link` для получения более подробной информации.

`--add-needed`
`--no-add-needed`
Эти две опции устарели из-за сходства их названий с опциями `--as-needed` и `--no-as-needed`. Они заменены опциями `--copy-dt-needed-entries` и `--no-copy-dt-needed-entries`.

`-assert keyword`
Эта опция игнорируется для обеспечения совместимости с SunOS.

`-Bdynamic`
`-dy`
`-call_shared`
Выполнить связывание с динамическими библиотеками. Это имеет смысл только на платформах, для которых поддерживаются общие библиотеки. Обычно это является значением по умолчанию на таких платформах. Различные варианты этой опции предназначены для обеспечения совместимости с различными системами. Эту опцию можно использовать несколько раз в командной строке: она влияет на поиск библиотек для опций `-l`, следующих за ней.

`-Bgroup`
Установить флаг `DF_1_GROUP` в записи `DT_FLAGS_1` в динамическом разделе. Это приводит к тому, что во время выполнения связывания поиск в этом объекте и его зависимостях выполняется только внутри группы. Неявно подразумевается `--unresolved-symbols=report-all`. Эта опция имеет смысл только на платформах ELF, поддерживающих общие библиотеки.

`-Bstatic`
`-dn`
`-non_shared`
`-static`
Не выполнять связывание с общими библиотеками. Это имеет смысл только на платформах, для которых поддерживаются общие библиотеки. Различные варианты этой опции предназначены для обеспечения совместимости с различными системами. Эту опцию можно использовать несколько раз в командной строке: она влияет на поиск библиотек для опций `-l`. Эта опция также подразумевает `--unresolved-symbols=report-all`. Эту опцию можно использовать с `-shared`. Это означает, что создается общая библиотека, но все внешние ссылки библиотеки должны быть разрешены путем извлечения записей из статических библиотек.

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

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

`-Bno-symbolic`
Эта опция может отменить ранее указанные опции `-Bsymbolic` и `-Bsymbolic-functions`.

`--dynamic-list=dynamic-list-file`
Укажите имя файла динамического списка для связывающего редактора. Обычно это используется при создании общих библиотек для указания списка глобальных символов, ссылки на которые не должны быть привязаны к определению внутри общей библиотеки, или при создании динамически связанных исполняемых файлов для указания списка символов, которые должны быть добавлены в таблицу символов в исполняемом файле. Эта опция имеет смысл только на платформах ELF, поддерживающих общие библиотеки.

Формат динамического списка такой же, как у узла версии без области видимости и имени узла. См. раздел VERSION для получения дополнительной информации.

--dynamic-list-data

Включить все глобальные символы данных в динамический список.

--dynamic-list-cpp-new

Предоставить встроенный динамический список для операторов C++ new и delete. Это в основном полезно для создания общей библиотеки libstdc++.

--dynamic-list-cpp-typeinfo

Предоставить встроенный динамический список для определения типа во время выполнения C++.

--check-sections
--no-check-sections

Предписывает компоновщику не проверять адреса секций после их назначения, чтобы убедиться в отсутствии перекрытий. Обычно компоновщик выполняет эту проверку, и если обнаруживает какие-либо перекрытия, он выдает соответствующие сообщения об ошибках. Компоновщик знает о секциях в наложениях и учитывает их. Поведение по умолчанию можно восстановить с помощью командной строки --check-sections. Перекрытие секций обычно не проверяется для компоновки с созданием объектных файлов. Вы можете принудительно включить проверку в этом случае, используя опцию --check-sections.

--copy-dt-needed-entries
--no-copy-dt-needed-entries

Эта опция влияет на обработку динамических библиотек, на которые ссылаются теги DT_NEEDED внутри ELF-динамических библиотек, указанных в командной строке. Обычно компоновщик не добавляет тег DT_NEEDED в выходной двоичный файл для каждой библиотеки, указанной в теге DT_NEEDED во входной динамической библиотеке. Однако, если в командной строке указана опция --copy-dt-needed-entries, все динамические библиотеки, следующие за ней, будут иметь свои записи DT_NEEDED добавлены. Поведение по умолчанию можно восстановить с помощью --no-copy-dt-needed-entries.

Эта опция также влияет на разрешение символов в динамических библиотеках. При использовании --copy-dt-needed-entries динамические библиотеки, указанные в командной строке, будут рекурсивно просматриваться, переходя по их тегам DT_NEEDED к другим библиотекам, чтобы разрешить символы, необходимые выходному двоичному файлу. При настройке по умолчанию, однако, просмотр динамических библиотек, следующих за ней, прекращается на самой динамической библиотеке. Переход по ссылкам DT_NEEDED для разрешения символов не выполняется.

--cref

Вывести таблицу перекрестных ссылок. Если создается файл карты компоновщика, таблица перекрестных ссылок печатается в файл карты. В противном случае она выводится в стандартный вывод.

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


--ctf-variables
--no-ctf-variables

Формат отладочной информации CTF поддерживает раздел, в котором кодируются имена и типы переменных, найденных в программе, которые не отображаются ни в одной таблице символов. Очевидно, что эти переменные не могут быть найдены по адресу обычными отладчиками, поэтому пространство, используемое для их типов и имен, обычно тратится впустую: типы обычно малы, но имена часто нет. --ctf-variables генерирует такой раздел. Поведение по умолчанию можно восстановить с помощью --no-ctf-variables.

--ctf-share-types=method

Настройте метод, используемый для совместного использования типов между единицами перевода в CTF.

share-unconflicted

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

share-duplicated

Поместите в общий словарь только те типы, которые встречаются в нескольких единицах перевода: типы, имеющие только одно определение, помещаются в словари, специфичные для каждой единицы перевода. Типы, имеющие неоднозначные определения в нескольких единицах перевода, всегда помещаются в словари, специфичные для каждой единицы перевода. Это, как правило, увеличивает размер CTF, но может уменьшить объем CTF в общем словаре. Для очень больших проектов это может ускорить открытие CTF и сэкономить память в потребителе CTF во время выполнения.

--no-define-common

Эта опция запрещает присвоение адресов общим символам. Команда скрипта "INHIBIT_COMMON_ALLOCATION" имеет тот же эффект.

Опция --no-define-common позволяет отделить решение о присвоении адресов общим символам от выбора типа выходного файла; в противном случае неперемещаемый тип вывода заставляет присваивать адреса общим символам. Использование --no-define-common позволяет общим символам, на которые ссылаются из общей библиотеки, присваивать адреса только в основной программе.
Это устраняет неиспользуемое дублированное пространство в общей библиотеке, а также предотвращает возможную путаницу при разрешении неверного дубликата, когда существует много динамических модулей со специализированными путями поиска для разрешения символов во время выполнения.

--force-group-allocation

Эта опция заставляет компоновщик размещать элементы группы разделов как обычные входные разделы и удалять группы разделов. Это поведение по умолчанию для окончательной компоновки, но эту опцию можно использовать для изменения поведения перемещаемой компоновки (-r). Команда скрипта "FORCE_GROUP_ALLOCATION" имеет тот же эффект.

--defsym=symbol=expression

Создайте глобальный символ в выходном файле, содержащий абсолютный адрес, заданный выражением. Вы можете использовать эту опцию столько раз, сколько необходимо, чтобы определить несколько символов в командной строке. Поддерживается ограниченная форма арифметики для выражения в этом контексте: вы можете указать шестнадцатеричную константу или имя существующего символа или использовать "+" и "-" для сложения или вычитания шестнадцатеричных констант или символов. Если вам нужны более сложные выражения, рассмотрите возможность использования языка скриптов компоновщика. Обратите внимание: между символом, знаком равенства ("=") и выражением не должно быть пробелов.


Компоновщик обрабатывает аргументы --defsym и аргументы -T последовательно, помещая --defsym перед -T. Это означает, что символ будет определен до обработки скрипта компоновщика из -T, а если поместить --defsym после -T, то символ будет определен после обработки скрипта компоновщика. Эта разница имеет последствия для выражений в скрипте компоновщика, которые используют символы --defsym, и то, какой порядок является правильным, будет зависеть от того, что вы пытаетесь достичь.

^ -demangle[=style] ^ -no-demangle Эти опции управляют тем, следует ли преобразовывать имена символов в сообщениях об ошибках и других выходных данных. Когда компоновщику указано выполнить преобразование, он пытается представить имена символов в удобочитаемом формате: удаляет начальные подчеркивания, если они используются форматом объектного файла, и преобразует искаженные имена символов C++ в имена, понятные пользователю. Различные компиляторы используют разные стили искажения. Необязательный аргумент стиля преобразования можно использовать для выбора подходящего стиля преобразования для вашего компилятора. Компоновщик будет выполнять преобразование по умолчанию, если не установлена переменная среды COLLECT_NO_DEMANGLE. Эти опции можно использовать для переопределения значения по умолчанию.

^ Ifile ^ -dynamic-linker=file Устанавливает имя динамического компоновщика. Это имеет смысл только при создании динамически связанных ELF-исполняемых файлов. Динамический компоновщик по умолчанию обычно подходит; не используйте это, если вы не знаете, что делаете.

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

^ -embedded-relocs Эта опция аналогична опции --emit-relocs, за исключением того, что перестановки хранятся в разделе, специфичном для целевой платформы. Эта опция поддерживается только для целевых платформ BFIN, CR16 и M68K.

^ -disable-multiple-abs-defs Не допускайте множественных определений с символами, включенными в имя файла, указанное с помощью -R или --just-symbols.

^ -fatal-warnings ^ -no-fatal-warnings Рассматривайте все предупреждения как ошибки. Поведение по умолчанию можно восстановить с помощью опции --no-fatal-warnings.

^ w ^ -no-warnings Не отображайте никаких предупреждений или сообщений об ошибках. Это отменяет действие --fatal-warnings, если оно было включено. Эту опцию можно использовать, когда известно, что выходной двоичный файл не будет работать, но все же необходимо его создать.

^ -force-exe-suffix Убедитесь, что у выходного файла есть суффикс .exe.

Если успешно созданный, полностью скомпонованный выходной файл не имеет суффикса .exe или .dll, эта опция принудительно копирует выходной файл в файл с тем же именем с суффиксом .exe. Эта опция полезна при использовании неизмененных Unix-файлов Makefile на хосте Microsoft Windows, поскольку некоторые версии Windows не будут запускать образ, если он не заканчивается суффиксом .exe.


--gc-sections
--no-gc-sections

Включить сборку мусора неиспользуемых входных секций. Игнорируется для целевых платформ, которые не поддерживают эту опцию. Поведение по умолчанию (отсутствие сборки мусора) можно восстановить, указав --no-gc-sections в командной строке. Обратите внимание, что сборка мусора для целевых форматов COFF и PE поддерживается, но реализация в настоящее время считается экспериментальной.

--gc-sections определяет, какие входные секции используются, путем проверки символов и релокаций.

Секция, содержащая символ входа, и все секции, содержащие символы, не определенные в командной строке, будут сохранены, как и секции, содержащие символы, на которые ссылаются динамические объекты. Обратите внимание, что при создании общих библиотек линкер должен предполагать, что любой видимый символ используется. После того, как этот начальный набор секций определен, линкер рекурсивно помечает как используемые любые секции, на которые ссылаются их релокации. См. --entry, --undefined и --gc-keep-exported.

Эта опция может быть установлена при выполнении частичной линковки (включенной с помощью опции -r). В этом случае корень символов, которые необходимо сохранить, должен быть явно указан либо одной из опций --entry, --undefined или --gc-keep-exported, либо командой "ENTRY" в скрипте линкера.

Как расширение GNU, входные секции ELF, помеченные флагом "SHF_GNU_RETAIN", не будут подвергаться сборке мусора.

--print-gc-sections
--no-print-gc-sections

Перечислить все секции, удаленные сборщиком мусора. Список выводится в stderr. Эта опция эффективна только в том случае, если сборка мусора включена с помощью опции --gc-sections. Поведение по умолчанию (не выводить список удаленных секций) можно восстановить, указав --no-print-gc-sections в командной строке.

--gc-keep-exported

Когда --gc-sections включена, эта опция предотвращает сборку мусора неиспользуемых входных секций, которые содержат глобальные символы с видимостью по умолчанию или защищенной видимостью. Эта опция предназначена для использования в исполняемых файлах, где неиспользуемые секции в противном случае будут удалены сборщиком мусора, независимо от внешней видимости содержащихся в них символов. Обратите внимание, что эта опция не оказывает никакого влияния при линковке общих объектов, поскольку это уже поведение по умолчанию. Эта опция поддерживается только для целевых форматов ELF.

--print-output-format

Вывести имя формата выходного файла по умолчанию (возможно, на него влияют другие параметры командной строки). Это строка, которая будет отображаться в команде "OUTPUT_FORMAT" в скрипте линкера.

--print-memory-usage

Вывести используемый размер, общий размер и размер используемой памяти регионов, созданных командой MEMORY. Это полезно для встроенных целевых систем, чтобы быстро увидеть объем свободной памяти. Формат вывода содержит одну заголовочную строку и одну строку для каждого региона. Вот пример вывода:


Область памяти Использовано Размер области % использования ROM: 256 КБ 1 МБ 25.00% RAM: 32 Б 2 ГБ 0.00%

Примечание: если вы хотите узнать об использовании памяти самим компоновщиком, то опция --stats предоставит эту информацию.

--help

Выводит сводку командных опций в стандартный вывод и завершает работу.

--target-help

Выводит сводку всех опций, специфичных для целевой платформы, в стандартный вывод и завершает работу.

-Map=mapfile

Выводит карту компоновки в файл mapfile. См. описание опции -M, выше. Если mapfile — это просто символ "-", то карта будет записана в стандартный вывод.

Указание каталога в качестве mapfile приводит к тому, что карта компоновки записывается в файл внутри этого каталога. Обычно имя файла внутри каталога вычисляется как базовое имя выходного файла с добавлением ".map". Однако, если используется специальный символ "%", он будет заменен полным путем выходного файла. Кроме того, если после символа "%" есть какие-либо символы, то ".map" больше не будет добавляться.

-o foo.exe -Map=bar [Создает ./bar]
-o ../dir/foo.exe -Map=bar [Создает ./bar]
-o foo.exe -Map=../dir [Создает ../dir/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir [Создает ../dir/foo.exe.map]
-o foo.exe -Map=% [Создает ./foo.exe.map]
-o ../dir/foo.exe -Map=% [Создает ../dir/foo.exe.map]
-o foo.exe -Map=%.bar [Создает ./foo.exe.bar]
-o ../dir/foo.exe -Map=%.bar [Создает ../dir/foo.exe.bar]
-o ../dir2/foo.exe -Map=../dir/% [Создает ../dir/../dir2/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir/%.bar [Создает ../dir/../dir2/foo.exe.bar]

Указание более одного символа "%" является ошибкой.

Если файл карты уже существует, он будет перезаписан.

--no-keep-memory

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

--no-undefined
-z defs

Сообщает о неразрешенных ссылках на символы из обычных объектных файлов. Это делается, даже если компоновщик создает несимвольную общую библиотеку. Переключатель --[no-]allow-shlib-undefined управляет поведением при сообщении о неразрешенных ссылках, найденных в общих библиотеках, которые компонуются.

Эффект этой опции можно отменить с помощью "-z undefs".

--allow-multiple-definition
-z muldefs

Обычно, когда символ определяется несколько раз, компоновщик сообщает об ошибке. Эти опции разрешают множественные определения, и используется первое определение.

--allow-shlib-undefined
--no-allow-shlib-undefined

Разрешает или запрещает неопределенные символы в общих библиотеках. Этот переключатель аналогичен --no-undefined, за исключением того, что он определяет поведение, когда неопределенные символы находятся в общей библиотеке, а не в обычном объектном файле. Он не влияет на обработку неопределенных символов в обычных объектных файлах.


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

Причины, по которым разрешаются ссылки на неопределенные символы в общих библиотеках, указанных во время компоновки:

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

В некоторых операционных системах, например, BeOS и HPPA, наличие неопределенных символов в общих библиотеках является нормальным.

Ядро BeOS, например, изменяет общие библиотеки во время загрузки, чтобы выбрать наиболее подходящую функцию для текущей архитектуры. Это используется, например, для динамического выбора подходящей функции memset.

--error-handling-script=scriptname

Если указана эта опция, компоновщик будет вызывать scriptname при возникновении ошибки. В настоящее время поддерживаются только два типа ошибок: отсутствующие символы и отсутствующие библиотеки. В скрипт передаются два аргумента: ключевое слово "undefined-symbol" или "missing-lib" и имя неопределенного символа или отсутствующей библиотеки. Предполагается, что скрипт будет предлагать пользователю, где можно найти символ или библиотеку. После завершения работы скрипта отображается обычное сообщение об ошибке компоновщика.

Доступность этой опции определяется параметром времени настройки, поэтому она может отсутствовать в определенных реализациях.

--no-undefined-version

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

--default-symver

Создает и использует версию символа по умолчанию (soname) для неверсионированных экспортируемых символов.

--default-imported-symver

Создает и использует версию символа по умолчанию (soname) для неверсионированных импортируемых символов.

--no-warn-mismatch

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

--no-warn-search-mismatch

Обычно ld выдает предупреждение, если при поиске библиотеки он находит несовместимую библиотеку. Эта опция отключает предупреждение.

--no-whole-archive

Отключает эффект опции --whole-archive для последующих файлов архива.


--noinhibit-exec
Сохранять исполняемый выходной файл, если он все еще пригоден для использования. Обычно, если при связывании возникают ошибки, компоновщик не создает выходной файл, а завершает работу, не записывая выходной файл при возникновении любой ошибки.

-nostdlib
Искать только библиотеки в каталогах, явно указанных в командной строке. Каталоги библиотек, указанные в скриптах компоновщика (включая скрипты компоновщика, указанные в командной строке), игнорируются.

--oformat=output-format
Компоновщик может быть настроен для поддержки более одного типа объектных файлов. Если ваш компоновщик настроен таким образом, вы можете использовать опцию `--oformat` для указания двоичного формата выходного объектного файла. Даже если компоновщик настроен для поддержки альтернативных объектных форматов, обычно нет необходимости указывать это, поскольку компоновщик должен быть настроен на использование в качестве формата выходных данных по умолчанию наиболее распространенного формата на каждой машине. `output-format` — это текстовая строка, имя определенного формата, поддерживаемого библиотеками BFD. (Вы можете отобразить доступные двоичные форматы с помощью `objdump -i`). Скрипт `OUTPUT_FORMAT` также может указывать формат вывода, но эта опция переопределяет его.

--out-implib file
Создать импортную библиотеку в файле, соответствующую исполняемому файлу, который создает компоновщик (например, DLL или ELF-программу). Эту импортную библиотеку (которая должна называться "*.dll.a" или "*.a" для DLL) можно использовать для связывания клиентов с созданным исполняемым файлом; это позволяет пропустить отдельный шаг создания импортной библиотеки (например, "dlltool" для DLL). Эта опция доступна только для целевых портов i386 PE и ELF.

-pie
--pic-executable
Создать позиционно-независимый исполняемый файл. В настоящее время это поддерживается только на платформах ELF. Позиционно-независимые исполняемые файлы перенаправляются динамическим компоновщиком в виртуальный адрес, который ОС выбирает для них, и он может меняться между вызовами. Они помечены как ET_DYN в заголовке файла ELF, но отличаются от общих библиотек несколькими способами. В частности, определенные символы в PIE по умолчанию не могут быть переопределены другим объектом, как это возможно в общей библиотеке.

-no-pie
Создать позиционно-зависимый исполняемый файл. Это значение по умолчанию.

-qmagic
Эта опция игнорируется для совместимости с Linux.

-Qy
Эта опция игнорируется для совместимости с SVR4.

--relax
--no-relax
Опция с машинозависимыми эффектами. Эта опция поддерживается только на нескольких платформах.

На некоторых платформах опция `--relax` выполняет специфичные для целевой платформы глобальные оптимизации, которые становятся возможными, когда компоновщик разрешает адресацию в программе, например, ослабление режимов адресации, синтез новых инструкций, выбор более коротких версий текущих инструкций и объединение константных значений.

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

На платформах, где эта функция поддерживается, опция --no-relax отключает ее.

На платформах, где эта функция не поддерживается, и --relax, и --no-relax принимаются, но игнорируются.

^ -retain-symbols-file=filename Сохраняет только символы, перечисленные в файле filename, отбрасывая все остальные. Файл filename — это простой текстовый файл, в котором каждая строка содержит имя одного символа. Эта опция особенно полезна в средах (таких как VxWorks), где большая глобальная таблица символов накапливается постепенно, чтобы экономить память во время выполнения.

^ -retain-symbols-file не удаляет неопределенные символы или символы, необходимые для переходов.

Вы можете указать --retain-symbols-file только один раз в командной строке. Она переопределяет -s и -S.

^ rpath=dir Добавляет каталог в путь поиска библиотек во время выполнения. Это используется при связывании исполняемого файла ELF с общими объектами. Все аргументы -rpath объединяются и передаются динамическому компоновщику, который использует их для поиска общих объектов во время выполнения.

Опция -rpath также используется при поиске общих объектов, которые требуются общим объектам, явно включенным в связывание; см. описание опции -rpath-link. Поиск в -rpath таким образом поддерживается только собственными компоновщиками и кросс-компиляторами, которые были настроены с помощью опции --with-sysroot.

Если -rpath не используется при связывании исполняемого файла ELF, содержимое переменной окружения LD_RUN_PATH будет использоваться, если она определена.

Опция -rpath также может использоваться в SunOS. По умолчанию в SunOS компоновщик формирует путь поиска во время выполнения из всех опций -L, которые ему передаются. Если используется опция -rpath, путь поиска во время выполнения будет сформирован исключительно с использованием опций -rpath, игнорируя опции -L. Это может быть полезно при использовании gcc, который добавляет много опций -L, которые могут находиться в смонтированных по NFS файловых системах.

Для совместимости с другими компоновщиками ELF, если после опции -R следует имя каталога, а не имя файла, она обрабатывается как опция -rpath.

^ rpath-link=dir При использовании ELF или SunOS одна общая библиотека может требовать другую. Это происходит, когда компоновка с помощью ld -shared включает общую библиотеку в качестве одного из входных файлов.

Когда компоновщик обнаруживает такую зависимость при выполнении обычной, нединамической связки, он автоматически попытается найти требуемую общую библиотеку и включить ее в связку, если она не включена явно. В этом случае выполняется поиск в нескольких каталогах, как описано ниже. Опция -rpath-link указывает первый набор каталогов для поиска. Эта опция может указывать последовательность имен каталогов либо путем предоставления списка имен, разделенных двоеточиями, либо путем многократного использования.

В этих каталогах для поиска могут использоваться токены $ORIGIN и $LIB. Они будут заменены на полный путь к каталогу, содержащему программу или общий объект, в случае $ORIGIN, и либо lib (для 32-битных исполняемых файлов), либо lib64 (для 64-битных исполняемых файлов) в случае $LIB.


Альтернативные формы этих токенов — ${ORIGIN} и ${LIB} также могут использоваться. Токен $PLATFORM не поддерживается.

Опция --rpath-link должна использоваться с осторожностью, поскольку она переопределяет путь поиска, который мог быть жестко закодирован в общей библиотеке. В этом случае можно непреднамеренно использовать другой путь поиска, чем использовал бы динамический компоновщик во время выполнения.

Когда требуются дополнительные общие библиотеки, компоновщик будет искать каталоги в порядке, указанном ниже, чтобы найти их. Однако следует отметить, что это относится только к дополнительным библиотекам, необходимым для удовлетворения уже включенных общих библиотек. Это не относится к библиотекам, которые включаются с помощью опции командной строки -l. Поиск библиотек, указанных с помощью -l, осуществляется только в каталогах, указанных опцией -L.

Любые каталоги, указанные опциями `-rpath-link`.

Любые каталоги, указанные опциями `-rpath`. Разница между `-rpath` и `-rpath-link` заключается в том, что каталоги, указанные опциями `-rpath`, включаются в исполняемый файл и используются во время выполнения, в то время как опция `-rpath-link` эффективна только во время компоновки. Поиск по `-rpath` таким образом поддерживается только нативными компоновщиками и перекрестными компоновщиками, которые были настроены с помощью опции `--with-sysroot`.

На системе ELF, для нативных компоновщиков, если опции `-rpath` и `-rpath-link` не использовались, выполняется поиск в содержимом переменной среды `LD_RUN_PATH`.

На SunOS, если опция `-rpath` не использовалась, выполняется поиск в любых каталогах, указанных с помощью опций `-L`.

Для нативного компоновщика выполняется поиск в содержимом переменной среды `LD_LIBRARY_PATH`.

Для нативного ELF-компоновщика каталоги в `DT_RUNPATH` или `DT_RPATH` общей библиотеки ищутся для общих библиотек, необходимых для нее. Записи `DT_RPATH` игнорируются, если существуют записи `DT_RUNPATH`.

Для компоновщика системы Linux, если файл `/etc/ld.so.conf` существует, выполняется поиск в списке каталогов, найденных в этом файле. Обратите внимание: путь к этому файлу имеет префикс `sysroot`, если он определен, а затем любая строка `prefix`, если компоновщик был настроен с помощью опции `--prefix=<path>`.

Для нативного компоновщика в системе FreeBSD выполняется поиск в любых каталогах, указанных макросом `_PATH_ELF_HINTS`, определенным в файле заголовков `elf-hints.h`.

Любые каталоги, указанные командой `SEARCH_DIR` в скрипте компоновщика, указанном в командной строке, включая скрипты, указанные с помощью `-T` (но не `-dT`).

Каталоги по умолчанию, обычно `/lib` и `/usr/lib`.

Любые каталоги, указанные плагином `LDPT_SET_EXTRA_LIBRARY_PATH`.

Любые каталоги, указанные командой `SEARCH_DIR` в скрипте компоновщика по умолчанию.

Обратите внимание, что на системах на базе Linux существует дополнительное ограничение: если включена опция --as-needed и найдена общая библиотека, которая в противном случае удовлетворила бы поиск, и эта библиотека не имеет тега DT_NEEDED для libc.so, и позже в наборе каталогов поиска находится другая общая библиотека, которая также удовлетворяет поиск и имеет тег DT_NEEDED для libc.so, то будет выбрана вторая библиотека, а не первая.


Если требуемая общая библиотека не найдена, компоновщик выдаст предупреждение и продолжит процесс компоновки.

--section-ordering-file=script

Эта опция используется для расширения текущего скрипта компоновщика путем добавления дополнительных сопоставлений входных секций с выходными секциями. Этот файл должен использовать тот же синтаксис для "SECTIONS", что и в обычных скриптах компоновщика, но он должен делать только одно: помещать входные секции в выходные секции. @pxref{SECTIONS}

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

SECTIONS {
.text : { *(.text.hot) ; *(.text .text.*) }
.data : { *(.data.big) ; *(.data .data.*) }
}

Затем, если используется такой файл секций:

.text : { *(.text.first) ; *(.text.z*) }
.data : { foo.o(.data.first) ; *(.data.small) }

Это будет эквивалентно скрипту компоновщика, как этот:

SECTIONS {
.text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) }
.data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) }
}

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

-shared
-Bshareable

Создать общую библиотеку. В настоящее время это поддерживается только на платформах ELF, XCOFF и SunOS. На SunOS компоновщик автоматически создаст общую библиотеку, если не используется опция -e и в процессе компоновки есть неопределенные символы.

--sort-common
--sort-common=ascending
--sort-common=descending

Эта опция указывает компоновщику сортировать общие символы по выравниванию в порядке возрастания или убывания при их размещении в соответствующих выходных секциях. Рассматриваются выравнивания символов: шестнадцать байт или больше, восемь байт, четыре байта, два байта и один байт. Это делается для предотвращения разрывов между символами из-за ограничений выравнивания. Если порядок сортировки не указан, то предполагается убывающий порядок.

--sort-section=name

Эта опция применит "SORT_BY_NAME" ко всем шаблонам секций с подстановочными знаками в скрипте компоновщика.


--sort-section=alignment

Эта опция применяет "SORT_BY_ALIGNMENT" ко всем шаблонам разделов, использующим подстановочные знаки, в скрипте линкера.

--spare-dynamic-tags=count

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

--split-by-file[=size]

Аналогично --split-by-reloc, но создает новый выходной раздел для каждого входного файла, когда достигается указанный размер. Если размер не указан, по умолчанию используется значение 1.

--split-by-reloc[=count]

Пытается создать дополнительные разделы в выходном файле, чтобы ни один выходной раздел в файле не содержал более count релокаций. Это полезно при создании очень больших файлов, предназначенных для загрузки в определенные ядра реального времени с форматом объектного файла COFF, поскольку COFF не может представлять более 65535 релокаций в одном разделе. Обратите внимание, что это не будет работать с форматами объектных файлов, которые не поддерживают произвольные разделы. Линковщик не будет разделять отдельные входные разделы для перераспределения, поэтому, если один входной раздел содержит более count релокаций, один выходной раздел будет содержать это количество релокаций. По умолчанию для count используется значение 32768.

--stats[=filename]

Вычисляет и отображает статистику работы линкера, такую как время выполнения и использование памяти.

Если необязательный аргумент filename не указан, то выводится только базовая информация, и она отправляется в стандартный поток ошибок. Если указан аргумент filename, то расширенная информация записывается в указанный файл. Если filename задано только как символ, то расширенная информация отправляется в стандартный поток вывода. Если имя файла начинается с +, файл открывается в режиме добавления, а не перезаписи.

Если включена опция -Map, то информация также записывается в файл карты. Обратите внимание: если и опция --stats, и опция -Map имеют аргументы filename, и они совпадают, то информация будет записана только один раз.

Если определена переменная среды LD_STATS, то это работает так же, как опция --stats. Если значение переменной является строкой, то эта строка будет использоваться в качестве имени файла, в который должна быть записана информация. В противном случае информация будет отправлена в стандартный поток вывода. Использование переменной среды позволяет записывать статистику без изменения командной строки линкера. Обратите внимание: если используются и переменная среды, и опция --stats, то опция --stats имеет приоритет.

Расширенная информация, которая сообщается, включает в себя время работы процессора и, если доступен системный вызов getrusage(), также регистрируется использование памяти. Эта информация сообщается для отдельных частей процесса линковки, которые называются фазами. Кроме того, информация также сообщается для специальной фазы, называемой ALL, которая охватывает весь процесс линковки. Обратите внимание, что отдельные фазы могут содержать или перекрываться друг с другом, поэтому не следует предполагать, что общие ресурсы, используемые линкером, являются суммой ресурсов, используемых отдельными фазами.


Кроме того, при отображении расширенной информации также включаются версия линкера, аргументы командной строки и время начала работы линкера. Это облегчает обработку ситуаций, когда несколько линков вызываются системой сборки, и позволяет точно определить, какие аргументы были использованы для получения сообщаемой статистики.

Расширенный вывод выглядит примерно так:

Stats: linker version: (GNU Binutils) 2.44.50.20250401
Stats: linker started: Wed Apr 2 09:36:41 2025
Stats: args: ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...]

Stats: phase               cpu time    memory      user time    system time
Stats: name                (microsec)   (KiB)      (seconds)      (seconds)
Stats: ALL                   390082    217740              0              0
Stats: ctf processing            12         0              0              0
Stats: string merge            1324         0              0              0
Stats: parsing                  349       288              0              0
Stats: plugins                    1         0              0              0
Stats: processing files      259616    214524              0              0
Stats: write                 116493         0              0              0

--no-stats

Отключает отчет об использовании статистики, если она была включена с помощью опции командной строки --stats или переменной окружения LD_STATS.

--sysroot=directory

Использует указанный каталог в качестве расположения sysroot, переопределяя значение по умолчанию, заданное во время настройки. Эта опция поддерживается только для линкеров, которые были настроены с помощью --with-sysroot.

--task-link

Используется для целевых платформ COFF/PE для создания объектного файла с привязкой задач, где все глобальные символы преобразуются в статические.

--traditional-format

Для некоторых целевых платформ вывод ld отличается от вывода некоторых существующих линкеров. Этот параметр запрашивает использование ld традиционного формата.

Например, в SunOS ld объединяет повторяющиеся записи в таблице строк символов. Это может уменьшить размер выходного файла с полной отладочной информацией более чем на 30 процентов. К сожалению, программа SunOS "dbx" не может читать полученную программу ("gdb" не испытывает проблем). Параметр --traditional-format указывает ld не объединять повторяющиеся записи.

--section-start=sectionname=org

Размещает раздел в выходном файле по абсолютному адресу, заданному в org. Вы можете использовать этот параметр столько раз, сколько необходимо, для размещения нескольких разделов в командной строке. org должен быть единственным шестнадцатеричным числом; для совместимости с другими линкерами можно опустить начальный "0x", обычно связанный с шестнадцатеричными значениями. Обратите внимание: между sectionname, знаком равенства ("=") и org не должно быть пробелов.


--image-base=org

При использовании ELF, аналогично -Ttext-segment, обе опции фактически устанавливают базовый адрес исполняемого файла ELF.

При использовании PE, используйте это значение в качестве базового адреса вашей программы или DLL. Это наименьшее место в памяти, которое будет использоваться при загрузке вашей программы или DLL. Чтобы уменьшить необходимость в переназначении адресов и повысить производительность ваших DLL, каждая из них должна иметь уникальный базовый адрес и не перекрываться с другими DLL. По умолчанию для исполняемых файлов используется 0x400000, а для DLL — 0x10000000.

-Tbss=org
-Tdata=org
-Ttext=org

Аналогично --section-start, где ".bss", ".data" или ".text" — имя секции.

-Ttext-segment=org

При создании исполняемого файла ELF это установит адрес первого байта первой секции. Обратите внимание, что при использовании -pie вместе с -Ttext-segment=org, выходной исполняемый файл будет отмечен как ET_EXEC, чтобы гарантировать, что адрес первого байта текстового сегмента будет равен org во время выполнения.

-Trodata-segment=org

При создании исполняемого файла ELF или разделяемой библиотеки для целевой платформы, где данные, доступные только для чтения, находятся в отдельной секции, отличной от секции исполняемого кода, это установит адрес первого байта секции данных, доступных только для чтения.

-Tldata-segment=org

При создании исполняемого файла ELF или разделяемой библиотеки для x86-64 с моделью памяти «medium», это установит адрес первого байта секции ldata.

--unresolved-symbols=method

Определяет, как обрабатывать неразрешенные символы. Существует четыре возможных значения для параметра method:

ignore-all

Не сообщать о неразрешенных символах.

report-all

Сообщать обо всех неразрешенных символах. Это значение используется по умолчанию.

ignore-in-object-files

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

ignore-in-shared-libs

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

Поведение для разделяемых библиотек также можно контролировать с помощью опции --[no-]allow-shlib-undefined.

Обычно компоновщик генерирует сообщение об ошибке для каждого сообщаемого неразрешенного символа, но опция --warn-unresolved-symbols может изменить это на предупреждение.

--dll-verbose
--verbose[=NUMBER]

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

--version-script=version-scriptfile

Указывает имя файла скрипта версий для компоновщика. Обычно это используется при создании разделяемых библиотек для указания дополнительной информации об иерархии версий создаваемой библиотеки. Эта опция полностью поддерживается только на платформах ELF, поддерживающих разделяемые библиотеки; см. VERSION. Она частично поддерживается на платформах PE, которые могут использовать скрипты версий для фильтрации видимости символов в режиме автоматического экспорта: любые символы, отмеченные как локальные в скрипте версий, не будут экспортироваться.


--warn-common

Выводить предупреждение, когда общий символ объединяется с другим общим символом или с определением символа. В Unix-линкерах допускается эта не слишком аккуратная практика, но в линкерах некоторых других операционных систем это запрещено. Эта опция позволяет выявить потенциальные проблемы, связанные с объединением глобальных символов. К сожалению, некоторые библиотеки C используют эту практику, поэтому вы можете получить предупреждения о символах в библиотеках, а также в ваших программах.

Существует три типа глобальных символов, которые иллюстрируются здесь примерами на C:

int i = 1;

Определение, которое помещается в инициализированный раздел данных выходного файла.

extern int i;

Неопределенная ссылка, которая не выделяет место. Должно быть либо определение, либо общий символ для переменной где-то.

int i;

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

Опция --warn-common может генерировать пять типов предупреждений. Каждое предупреждение состоит из пары строк: первая описывает только что встреченный символ, а вторая описывает предыдущий символ, встреченный с тем же именем. Один или оба из этих двух символов будут общими символами.

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

<файл>(<раздел>): предупреждение: общий символ `<символ>'
    заменяется определением
<файл>(<раздел>): предупреждение: определен здесь

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

<файл>(<раздел>): предупреждение: определение `<символ>'
    заменяет общий символ
<файл>(<раздел>): предупреждение: общий символ здесь

     Объединение общего символа с предыдущим общим символом того же размера.

<файл>(<раздел>): предупреждение: несколько общих символов
    `<символ>'
<файл>(<раздел>): предупреждение: предыдущий общий символ здесь

     Объединение общего символа с предыдущим большим общим символом.

<файл>(<раздел>): предупреждение: общий символ `<символ>'
    заменяется большим общим символом
<файл>(<раздел>): предупреждение: больший общий символ здесь

     Объединение общего символа с предыдущим меньшим общим символом. Это то же самое, что и в предыдущем случае, только символы встречаются в другом порядке.

<файл>(<раздел>): предупреждение: общий элемент для `<символа>'
переопределяет более мелкий общий элемент
<файл>(<раздел>): предупреждение: более мелкий общий элемент здесь

--warn-constructors
Выводить предупреждение, если используются глобальные конструкторы. Это полезно только для некоторых форматов объектных файлов.
Для форматов, таких как COFF или ELF, компоновщик не может обнаружить использование глобальных конструкторов.

--warn-execstack
--warn-execstack-objects
--no-warn-execstack
На платформах ELF компоновщик может генерировать предупреждающие сообщения, если ему предложено создать выходной файл, содержащий исполняемый стек.
Существует три возможных состояния:

Не генерировать никаких предупреждений.

Всегда генерировать предупреждения, даже если исполняемый стек запрошен с помощью опции командной строки -z execstack.

Генерировать предупреждение только в том случае, если объектный файл запрашивает исполняемый стек, но не в том случае, если используется опция -z execstack.

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

Примечание: входные файлы формата ELF могут указывать, что им нужен исполняемый стек, содержащий раздел .note.GNU-stack, в котором установлен бит исполняемости в флагах раздела. Они могут указать, что им не нужен исполняемый стек, имея тот же раздел, но без установленного бита исполняемости. Если во входном файле нет раздела .note.GNU-stack, то поведение по умолчанию зависит от целевой платформы. Для некоторых целевых платформ отсутствие такого раздела означает, что требуется исполняемый стек. Это часто является проблемой для вручную создаваемых файлов ассемблера.

--error-execstack
--no-error-execstack
Если компоновщик собирается генерировать предупреждающее сообщение об исполняемом стеке, то опция --error-execstack преобразует это предупреждение в ошибку. Обратите внимание, что эта опция не изменяет состояние генерации предупреждений о исполняемом стеке компоновщика. Используйте --warn-execstack или --warn-execstack-objects, чтобы установить конкретное состояние предупреждений.

Опция --no-error-execstack восстанавливает поведение по умолчанию, при котором генерируются предупреждающие сообщения.

--warn-multiple-gp
Выводить предупреждение, если в выходном файле требуется несколько значений глобального указателя. Это имеет смысл только для определенных процессоров, таких как Alpha. В частности, некоторые процессоры помещают большие значения в специальный раздел. Специальный регистр (глобальный указатель) указывает на середину этого раздела, так что константы можно эффективно загружать с помощью адресации относительно базового регистра. Поскольку смещение в режиме адресации относительно базового регистра фиксировано и относительно невелико (например, 16 бит), это ограничивает максимальный размер пула констант. Таким образом, в больших программах часто необходимо использовать несколько значений глобального указателя, чтобы иметь возможность адресовать все возможные константы. Эта опция вызывает вывод предупреждения каждый раз, когда это происходит.

--warn-once
Выводить предупреждение только один раз для каждого неопределенного символа, а не для каждого модуля, который на него ссылается.

--warn-rwx-segments
--no-warn-rwx-segments
Выводить предупреждение, если компоновщик создает загружаемый сегмент ненулевого размера, у которого установлены все три флага разрешений: чтение, запись и выполнение. Такой сегмент представляет собой потенциальную уязвимость безопасности. Кроме того, будут генерироваться предупреждения, если будет создан сегмент локального хранилища потоков с установленным флагом разрешения на выполнение, независимо от того, установлены или нет флаги чтения и/или записи.

Эти предупреждения включены по умолчанию. Их можно отключить с помощью опции `--no-warn-rwx-segments` и повторно включить с помощью опции `--warn-rwx-segments`.

--error-rwx-segments
--no-error-rwx-segments
Если компоновщик собирается генерировать сообщение о предупреждении об исполняемом, записываемом сегменте или исполняемом сегменте TLS, опция `--error-rwx-segments` преобразует это предупреждение в ошибку. Опция `--no-error-rwx-segments` восстанавливает поведение по умолчанию, при котором генерируется только сообщение о предупреждении.

Обратите внимание, что опция `--error-rwx-segments` сама по себе не включает предупреждения об этих сегментах. Эти предупреждения либо включены по умолчанию, если компоновщик был настроен таким образом, либо с помощью опции командной строки `--warn-rwx-segments`.

--warn-section-align
Выводить предупреждение, если адрес выходного раздела изменяется из-за выравнивания. Обычно выравнивание задается входным разделом. Адрес будет изменен только в том случае, если он не указан явно, то есть если команда "SECTIONS" не указывает начальный адрес раздела.

--warn-textrel
Выводить предупреждение, если компоновщик добавляет DT\_TEXTREL в позиционно-независимый исполняемый файл или общую библиотеку.

--warn-alternate-em
Выводить предупреждение, если объект имеет альтернальный машинный код ELF.

--warn-unresolved-symbols
Если компоновщик собирается сообщать о неразрешенном символе (см. опцию `--unresolved-symbols`), он обычно генерирует ошибку. Эта опция заставляет его генерировать вместо этого предупреждение.

--error-unresolved-symbols
Эта опция восстанавливает поведение компоновщика по умолчанию, при котором генерируются ошибки при сообщении о неразрешенных символах.

--whole-archive
Для каждого архива, указанного в командной строке после опции `--whole-archive`, включать каждый объектный файл в архиве в компоновку, а не искать в архиве необходимые объектные файлы. Обычно это используется для преобразования архивного файла в общую библиотеку, заставляя включать каждый объект в результирующую общую библиотеку. Эту опцию можно использовать несколько раз.

Два замечания при использовании этой опции из gcc: во-первых, gcc не знает об этой опции, поэтому ее необходимо использовать с помощью `-Wl,-whole-archive`. Во-вторых, не забудьте использовать `-Wl,-no-whole-archive` после вашего списка архивов, потому что gcc добавит свой собственный список архивов в вашу компоновку, и вы можете не захотеть, чтобы этот флаг влиял на них.

--wrap=symbol

Используйте функцию-оболочку для symbol. Любая неопределенная ссылка на symbol будет разрешена в "__wrap_symbol". Любая неопределенная ссылка на "__real_symbol" будет разрешена в symbol.

Это можно использовать для предоставления оболочки для системной функции. Функция-оболочка должна называться "__wrap_symbol". Если она хочет вызвать системную функцию, ей следует вызывать "__real_symbol".

Вот тривиальный пример:

void *
__wrap_malloc (size_t c)
{
printf ("malloc вызвана с %zu\n", c);
return __real_malloc (c);
}

Если вы связываете другой код с этим файлом, используя --wrap malloc, то все вызовы "malloc" будут вызывать функцию "__wrap_malloc" вместо этого. Вызов "__real_malloc" в "__wrap_malloc" вызовет реальную функцию "malloc".

Возможно, вы захотите предоставить функцию "__real_malloc" также, чтобы связи без опции --wrap были успешными. Если вы это сделаете, вам не следует помещать определение "__real_malloc" в тот же файл, что и "__wrap_malloc"; если вы это сделаете, ассемблер может разрешить вызов до того, как компоновщик получит возможность обернуть его в "malloc".

Только неопределенные ссылки заменяются компоновщиком. Таким образом, ссылки, внутренние для модуля перевода, на symbol, не разрешаются в "__wrap_symbol". В следующем примере вызов "f" в "g" не разрешается в "__wrap_f".

int
f (void)
{
return 123;
}

int
g (void)
{
return f();
}

--eh-frame-hdr
--no-eh-frame-hdr

Запросить (--eh-frame-hdr) или подавить (--no-eh-frame-hdr) создание раздела ".eh_frame_hdr" и заголовка сегмента ELF "PT_GNU_EH_FRAME".

--no-ld-generated-unwind-info

Запросить создание информации о размотке ".eh_frame" для разделов кода, сгенерированных компоновщиком, таких как PLT. Эта опция включена по умолчанию, если компоновщик поддерживает создание информации о размотке. Эта опция также контролирует создание информации о трассировке стека ".sframe" для разделов кода, сгенерированных компоновщиком, таких как PLT.

--enable-new-dtags
--disable-new-dtags

Этот компоновщик может создавать новые динамические теги в ELF. Но более старые системы ELF могут их не понимать. Если вы укажете --enable-new-dtags, новые динамические теги будут созданы по мере необходимости, а старые динамические теги будут опущены. Если вы укажете --disable-new-dtags, новые динамические теги создаваться не будут. По умолчанию новые динамические теги не создаются. Обратите внимание, что эти параметры доступны только для систем ELF.

--hash-size=number

Установите размер хеш-таблиц компоновщика по умолчанию на простое число, близкое к number. Увеличение этого значения может сократить время, необходимое компоновщику для выполнения своих задач, за счет увеличения требований к памяти компоновщика. Аналогично, уменьшение этого значения может уменьшить требования к памяти за счет снижения скорости. Значение по умолчанию составляет 4051 в обычных условиях и 1021, если используется параметр командной строки --reduce-memory-overheads.


--hash-style=style

Задает тип хэш-таблицы линкера. style может быть либо "sysv" для классического ELF-раздела ".hash", либо "gnu" для нового раздела GNU ".gnu.hash", либо "both" для обоих: классического ELF-раздела ".hash" и нового раздела GNU ".gnu.hash". Значение по умолчанию зависит от того, как был настроен линкер, но для большинства систем на базе Linux это будет "both".

--compress-debug-sections=none
--compress-debug-sections=zlib
--compress-debug-sections=zlib-gnu
--compress-debug-sections=zlib-gabi
--compress-debug-sections=zstd

В ELF-системах эти параметры управляют тем, как секции отладки DWARF сжимаются с использованием zlib.

--compress-debug-sections=none      не      сжимает      секции      отладки      DWARF.
--compress-debug-sections=zlib-gnu сжимает секции отладки DWARF и переименовывает их, чтобы они начинались с .zdebug вместо .debug. --compress-debug-sections=zlib-gabi также сжимает секции отладки DWARF, но вместо их переименования устанавливает флаг SHF_COMPRESSED в заголовках секций.

Параметр --compress-debug-sections=zlib является синонимом для --compress-debug-sections=zlib-gabi.

--compress-debug-sections=zstd сжимает секции отладки DWARF с использованием zstd.

Обратите внимание, что этот параметр переопределяет любое сжатие во входных секциях отладки, поэтому, если двоичный файл скомпилирован с помощью --compress-debug-sections=none, все сжатые секции отладки во входных файлах будут распакованы перед копированием в выходной двоичный файл.

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

--reduce-memory-overheads

Этот параметр уменьшает требования к памяти во время выполнения линкера, за счет снижения скорости линковки. Он был введен для выбора старого алгоритма O(n^2) для создания файла карты ссылок, вместо нового алгоритма O(n), который использует примерно на 40% больше памяти для хранения символов.

Другой эффект переключателя заключается в установке размера хэш-таблицы по умолчанию равным 1021, что также позволяет экономить память за счет увеличения времени работы линкера. Однако это не происходит, если используется переключатель --hash-size.

Переключатель --reduce-memory-overheads также может использоваться для включения других компромиссов в будущих версиях линкера.

--max-cache-size=size

Обычно ld кэширует информацию о релокации и таблицы символов входных файлов в памяти с неограниченным размером. Этот параметр устанавливает максимальный размер кэша равным size. Обратите внимание, что если использовался параметр командной строки --no-keep-memory, то линкер ведет себя так, как будто максимальный размер кэша установлен на 0, то есть ничего не сохраняется.

--build-id
--build-id=style

Запрашивает создание ELF-раздела ".note.gnu.build-id" или раздела COFF ".buildid". Содержимое заметки представляет собой уникальные биты, идентифицирующие этот скомпилированный файл. style может быть "uuid" для использования 128 случайных битов, "sha1" для использования 160-битной SHA1-хеш-функции, "md5" для использования 128-битной MD5-хеш-функции или "xx" для использования 128-битной XXHASH-функции на нормативных частях выходного содержимого или "0xhexstring" для использования выбранной битовой строки, указанной в виде четного числа шестнадцатеричных цифр ("-" и ":" между парами цифр игнорируются). Если style не указан, используется "sha1".


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

Передача "none" для стиля отключает настройку из любых опций "--build-id", указанных ранее в командной строке.

--package-metadata=JSON
Запрашивает создание раздела ELF-ноты ".note.package". Содержимое ноты имеет формат JSON, как указано в спецификации метаданных пакета. Для получения дополнительной информации смотрите: https://systemd.io/ELF_PACKAGE_METADATA/. Аргумент JSON поддерживает кодировку в процентах и следующую %[string] (где string относится к имени в именованных ссылках на символы HTML): %[comma] для ,, %[lbrace] для {, %[quot] для ", %[rbrace] для } и %[space] для символа пробела. Если аргумент JSON отсутствует/пуст, это отключит создание ноты метаданных, если она была включена ранее опцией --package-metadata. Если компоновщик был скомпилирован с использованием libjansson, строка JSON будет проверена.

Компоновщик i386 PE поддерживает опцию -shared, которая приводит к тому, что выходным файлом становится динамически связанная библиотека (DLL) вместо обычного исполняемого файла. При использовании этой опции следует называть выходной файл "*.dll". Кроме того, компоновщик полностью поддерживает стандартные файлы "*.def", которые можно указать в командной строке компоновщика, как и объектный файл (фактически, он должен предшествовать архивам, из которых он экспортирует символы, чтобы гарантировать, что они будут связаны, как и обычный объектный файл).

В дополнение к опциям, общим для всех целевых платформ, компоновщик i386 PE поддерживает дополнительные параметры командной строки, специфичные для целевой платформы i386 PE. Опции, принимающие значения, могут быть разделены от их значений либо пробелом, либо знаком равенства.

--add-stdcall-alias

Если указано, символы с суффиксом stdcall (@nn) будут экспортироваться как есть, а также с удаленным суффиксом. [Эта опция специфична для порта компоновщика, предназначенного для i386 PE].

--base-file file

Используйте файл в качестве имени файла, в котором следует сохранить базовые адреса всех релокаций, необходимых для создания DLL с помощью dlltool. [Это опция, специфичная для i386 PE].

--dll

Создайте DLL вместо обычного исполняемого файла. Вы также можете использовать -shared или указать "LIBRARY" в данном файле ".def". [Эта опция специфична для порта компоновщика, предназначенного для i386 PE].


--enable-long-section-names
--disable-long-section-names

В вариантах PE объектного формата COFF добавлено расширение, позволяющее использовать имена секций длиной более восьми символов, что является обычным ограничением для COFF. По умолчанию эти имена разрешены только в объектных файлах, поскольку полностью связанные исполняемые образы не содержат таблицу строк COFF, необходимую для поддержки более длинных имен. Как расширение GNU, можно разрешить их использование и в исполняемых образах или (вероятно, бессмысленно!) запретить в объектных файлах, используя эти два параметра. Исполняемые образы, сгенерированные с использованием этих длинных имен секций, немного не соответствуют стандарту, поскольку содержат таблицу строк, и могут генерировать запутанные выходные данные при просмотре с помощью инструментов, не поддерживающих PE GNU, таких как просмотрщики файлов и дамперы. Однако GDB использует длинные имена секций PE для поиска разделов отладочной информации Dwarf-2 в исполняемом образе во время выполнения, поэтому, если ни один из параметров не указан в командной строке, ld включит длинные имена секций, отменяя поведение по умолчанию и технически правильное поведение, когда обнаруживает наличие информации об отладке при связывании исполняемого образа и не удаляет символы. [Этот параметр действителен для всех PE-ориентированных портов компоновщика]

--enable-stdcall-fixup
--disable-stdcall-fixup

Если компоновщик обнаруживает символ, который не может разрешить, он попытается выполнить «нечеткое связывание», искав другой определенный символ, который отличается только в формате имени символа (cdecl против stdcall), и свяжет его с этим соответствующим символом. Например, неопределенный символ "_foo" может быть связан с функцией "_foo@12", или неопределенный символ "_bar@16" может быть связан с функцией "_bar". Когда компоновщик делает это, он выводит предупреждение, поскольку обычно он должен был завершить связывание с ошибкой, но иногда для использования могут потребоваться импортные библиотеки, сгенерированные из сторонних DLL, и тогда эта функция должна быть включена. Если вы укажете --enable-stdcall-fixup, эта функция будет полностью включена, и предупреждения не будут выводиться. Если вы укажете --disable-stdcall-fixup, эта функция будет отключена, и такие несовпадения будут рассматриваться как ошибки. [Этот параметр специфичен для PE-ориентированного порта компоновщика i386]

--leading-underscore
--no-leading-underscore

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

--export-all-symbols

Если указано, все глобальные символы в объектах, используемых для создания DLL, будут экспортированы из DLL. Обратите внимание, что это является значением по умолчанию, если в противном случае не будет экспортированы никакие символы. Когда символы явно экспортируются через DEF-файлы или неявно экспортируются через атрибуты функций, по умолчанию не экспортировать ничего, если только не указан этот параметр. Кроме того, символы "DllMain@12", "DllEntryPoint@0", "DllMainCRTStartup@12" и "impure_ptr" не будут автоматически экспортированы. Также символы, импортированные из других DLL, не будут повторно экспортированы, и символы, определяющие внутреннюю структуру DLL, такие как символы, начинающиеся с "head" или заканчивающиеся на "iname", также не будут экспортированы. Кроме того, символы из "libgcc", "libstd++", "libmingw32" или "crtX.o" не будут экспортированы. Символы, имена которых начинаются с "__rtti" или "__builtin_", не будут экспортированы, чтобы упростить работу с DLL C++. Наконец, существует обширный список символов, специфичных для Cygwin, которые не экспортируются (очевидно, это относится к созданию DLL для целевых систем Cygwin). Эти символы, исключенные из Cygwin: "_cygwin_dll_entry@12", "_cygwin_crt0_common@8", "_cygwin_noncygwin_dll_entry@12", "_fmode", "_impure_ptr", "cygwin_attach_dll", "cygwin_premain0", "cygwin_premain1", "cygwin_premain2", "cygwin_premain3" и "environ". [Этот параметр специфичен для PE-ориентированного порта компоновщика i386]


--exclude-symbols symbol,symbol,...
Указывает список символов, которые не должны автоматически экспортироваться. Имена символов могут быть разделены запятыми или двоеточиями. [Эта опция предназначена для i386 PE-версии компоновщика]

--exclude-all-symbols
Указывает, что ни один символ не должен автоматически экспортироваться. [Эта опция предназначена для i386 PE-версии компоновщика]

--file-alignment
Указывает выравнивание файла. Секции в файле всегда будут начинаться с смещений, кратных этому числу. По умолчанию используется 512. [Эта опция предназначена для i386 PE-версии компоновщика]

--heap reserve
--heap reserve,commit
Указывает количество байтов памяти, которые необходимо зарезервировать (и, возможно, выделить) для использования в качестве кучи для этой программы. По умолчанию зарезервировано 1 МБ, выделено 4 КБ. [Эта опция предназначена для i386 PE-версии компоновщика]

--kill-at
Если указано, суффиксы stdcall (@nn) будут удалены из символов перед их экспортом. [Эта опция предназначена для i386 PE-версии компоновщика]

--large-address-aware
Если указано, соответствующий бит в поле "Характеристики" COFF-заголовка устанавливается, чтобы указать, что эта исполняемая программа поддерживает виртуальные адреса, превышающие 2 гигабайта. Это следует использовать в сочетании с переключателем /3GB или /USERVA=value мегабайтов в разделе "[операционные системы]" файла BOOT.INI. В противном случае этот бит не имеет эффекта. [Эта опция предназначена для PE-версий компоновщика]

--disable-large-address-aware
Отменяет эффект предыдущей опции --large-address-aware. Это полезно, если --large-address-aware всегда устанавливается драйвером компилятора (например, Cygwin gcc), и исполняемая программа не поддерживает виртуальные адреса, превышающие 2 гигабайта. [Эта опция предназначена для PE-версий компоновщика]

--major-image-version value
Устанавливает основное число "версии образа". По умолчанию равно 1. [Эта опция предназначена для i386 PE-версии компоновщика]

--major-os-version value

Устанавливает основную версию «операционной системы». По умолчанию — 4. [Этот параметр специфичен для i386 PE-версии линкера]

--major-subsystem-version value

Устанавливает основную версию «подсистемы». По умолчанию — 4. [Этот параметр специфичен для i386 PE-версии линкера]

--minor-image-version value

Устанавливает младшую версию «версии образа». По умолчанию — 0. [Этот параметр специфичен для i386 PE-версии линкера]

--minor-os-version value

Устанавливает младшую версию «операционной системы». По умолчанию — 0. [Этот параметр специфичен для i386 PE-версии линкера]

--minor-subsystem-version value

Устанавливает младшую версию «подсистемы». По умолчанию — 0. [Этот параметр специфичен для i386 PE-версии линкера]

--output-def file

Линкер создаст файл file, который будет содержать DEF-файл, соответствующий DLL, которую линкер генерирует. Этот DEF-файл (который должен называться "*.def") можно использовать для создания импортной библиотеки с помощью "dlltool" или использовать в качестве справочного материала для автоматического или неявного экспорта символов. [Этот параметр специфичен для i386 PE-версии линкера]

--enable-auto-image-base
--enable-auto-image-base=value

Автоматически выбирает базовый адрес образа для DLL, опционально начиная со значения base, если он не указан с помощью аргумента "--image-base". Используя хеш, сгенерированный из имени DLL, для создания уникальных базовых адресов для каждой DLL, удается избежать конфликтов в памяти и перемещений, которые могут задержать выполнение программы. [Этот параметр специфичен для i386 PE-версии линкера]

--disable-auto-image-base

Не генерировать автоматически уникальный базовый адрес образа. Если не указан пользовательский базовый адрес ("--image-base"), использовать базовый адрес платформы по умолчанию. [Этот параметр специфичен для i386 PE-версии линкера]

--dll-search-prefix string

При динамической линковке с DLL без импортной библиотеки, искать ".dll" вместо "lib.dll". Это позволяет легко отличать DLL, созданные для различных «подплатформ»: native, cygwin, uwin, pw и т. д. Например, для DLL Cygwin обычно используется "--dll-search-prefix=cyg". [Этот параметр специфичен для i386 PE-версии линкера]

--enable-auto-import

Выполнять интеллектуальную линковку "_symbol" в "__imp__symbol" для импорта ДАННЫХ из DLL, что позволяет обойти механизм dllimport на стороне пользователя и ссылаться на имена символов без изменений. [Этот параметр специфичен для i386 PE-версии линкера]

Следующие замечания относятся к исходной реализации функции и в настоящее время устарели для Cygwin и MinGW.

Примечание: использование расширения 'auto-import' приведет к тому, что текстовый раздел файла
образа станет доступным для записи. Это не соответствует спецификации PE-COFF, опубликованной
Microsoft.

Примечание: использование расширения «автоматический импорт» также приведет к тому, что данные, которые обычно помещаются в раздел .rdata, будут помещены в раздел .data. Это делается для обхода проблемы с константами, которая описана здесь: http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html

Обычно использование «автоматического импорта» будет «просто работать», но иногда вы можете увидеть следующее сообщение:

«Переменная '<var>' не может быть автоматически импортирована. Пожалуйста, прочитайте документацию для флага ld "--enable-auto-import" для получения подробной информации».

Это сообщение появляется, когда какая-либо (под)выражение обращается к адресу, который в конечном итоге является суммой двух констант (таблицы импорта Win32 допускают только одну). Примеры, когда это может произойти, включают доступ к полям-членам структуры, импортированной из DLL, а также использование константного индекса в массиве, импортированном из DLL. Любая многословная переменная (массивы, структуры, long long и т. д.) может вызвать эту ошибку. Однако, независимо от точного типа данных проблемной экспортируемой переменной, ld всегда обнаружит ее, выдаст предупреждение и завершит работу.

Существует несколько способов решения этой трудности, независимо от типа данных экспортируемой переменной:

Один из способов — использовать флаг --enable-runtime-pseudo-reloc. Это оставляет задачу корректировки ссылок в вашем клиентском коде для среды выполнения, поэтому этот метод работает только в том случае, если среда выполнения поддерживает эту функцию.

Второе решение — сделать одну из «констант» переменной, то есть неизвестной и неоптимизируемой во время компиляции. Для массивов есть два варианта: a) сделать индекс (адрес массива) переменной или b) сделать «константный» индекс переменной. Таким образом:

extern type extern_array[];
extern_array[1] -->
{ volatile type *t=extern_array; t[1] }

или

extern type extern_array[];
extern_array[1] -->
{ volatile int t=1; extern_array[t] }

Для структур (и для большинства других многословных типов данных) единственный вариант — сделать саму структуру (или long long и т. д.) переменной:

extern struct s extern_struct;
extern_struct.field -->
{ volatile struct s *t=&extern_struct; t->field }

или

extern long long extern_ll;
extern_ll -->
{ volatile long long * local_ll=&extern_ll; *local_ll }

Третий метод решения этой трудности — отказаться от «автоматического импорта» для проблемного символа и пометить его с помощью __declspec(dllimport). Однако на практике это требует использования определяемых во время компиляции #define, чтобы указать, создаете ли вы DLL, создаете ли вы клиентский код, который будет связываться с DLL, или просто создаете/связываете со статической библиотекой. При выборе между различными методами решения проблемы «прямого адреса с постоянным смещением», вам следует учитывать типичное использование в реальном мире:


Оригинал:

--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}

Решение 1:

--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
/* Эта обходная схема предназначена для Win32 и Cygwin; не "оптимизируйте" */
volatile int *parr = arr;
printf("%d\n",parr[1]);
}

Решение 2:

--foo.h
/* Примечание: предполагается автоматический экспорт (без __declspec(dllexport)) */
#if (defined(_WIN32) || defined(__CYGWIN__)) && \
!(defined(FOO_BUILD_DLL) || defined(FOO_STATIC))
#define FOO_IMPORT __declspec(dllimport)
#else
#define FOO_IMPORT
#endif
extern FOO_IMPORT int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}

Четвертый способ избежать этой проблемы — переработать вашу библиотеку, чтобы использовать функциональный интерфейс,
а не интерфейс данных для проблемных переменных (например, функции доступа set_foo() и get_foo()).

--disable-auto-import
Не пытайтесь выполнить сложную привязку "\_symbol" к "\_\_imp\_\_symbol" для импорта ДАННЫХ
из DLL. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

--enable-runtime-pseudo-reloc
Если ваш код содержит выражения, описанные в разделе --enable-auto-import, то есть импорт ДАННЫХ из DLL с ненулевым смещением,
то эта опция создаст вектор «псевдо-перемещений во время выполнения», которые могут быть использованы средой выполнения
для корректировки ссылок на такие данные в вашем клиентском коде. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

--disable-runtime-pseudo-reloc
Не создавайте псевдо-перемещения для импорта ДАННЫХ из DLL с ненулевым смещением. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

--enable-extra-pe-debug
Отображение дополнительной информации отладки, связанной с автоматическим импортом символов. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

--section-alignment
Устанавливает выравнивание секции. Секции в памяти всегда начинаются по адресам, которые являются кратным этому числу.
По умолчанию 0x1000. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

--stack reserve
--stack reserve,commit
Укажите количество байтов памяти, которые необходимо зарезервировать (и, необязательно, выделить) для использования в качестве стека
для этой программы. По умолчанию зарезервировано 2 МБ, выделено 4 КБ. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

--subsystem which
--subsystem which:major
--subsystem which:major.minor
Указывает подсистему, в которой будет выполняться ваша программа. Допустимые значения для which: «native», «windows», «console», «posix» и «xbox».
Вы также можете необязательно указать версию подсистемы. Числовые значения также принимаются для which. [Эта опция специфична для i386 PE-ориентированной версии компоновщика]

Следующие параметры устанавливают флаги в поле «DllCharacteristics» заголовка PE-файла:
[Эти параметры специфичны для PE-ориентированных версий компоновщика]

--high-entropy-va
--disable-high-entropy-va

Образ совместим с 64-битной схемой случайной организации адресного пространства (ASLR). Эта опция включена по умолчанию для 64-битных PE-образов в MinGW.

Эта опция также подразумевает --dynamicbase и --enable-reloc-section.

--dynamicbase
--disable-dynamicbase

Базовый адрес образа может быть изменен с помощью схемы случайной организации адресного пространства (ASLR). Эта функция была представлена в MS Windows Vista для 32-битных PE-образов. Эта опция включена по умолчанию для MinGW, но может быть отключена с помощью опции --disable-dynamicbase. Эта опция также подразумевает --enable-reloc-section.

--forceinteg
--disable-forceinteg

Включены проверки целостности кода. Эта опция отключена по умолчанию.

--nxcompat
--disable-nxcompat

Образ совместим с технологией предотвращения выполнения данных (Data Execution Prevention). Эта функция была представлена в MS Windows XP SP2 для 32-битных PE-образов. Опция включена по умолчанию для MinGW.

--no-isolation
--disable-no-isolation

Хотя образ поддерживает изоляцию, не изолируйте его. Эта опция отключена по умолчанию.

--no-seh
--disable-no-seh

Образ не использует SEH. Из этого образа не может быть вызван обработчик SEH. Эта опция отключена по умолчанию.

--no-bind
--disable-no-bind

Не связывайте этот образ. Эта опция отключена по умолчанию.

--wdmdriver
--disable-wdmdriver

Драйвер использует модель драйверов MS Windows. Эта опция отключена по умолчанию.

--tsaware
--disable-tsaware

Образ совместим с сервером терминалов. Эта опция отключена по умолчанию.

--insert-timestamp
--no-insert-timestamp

Вставьте в образ реальную временную метку. Это поведение по умолчанию, поскольку оно соответствует устаревшему коду и означает, что образ будет работать с другими проприетарными инструментами. Проблема с этим значением по умолчанию заключается в том, что каждый раз, когда одни и те же исходные файлы связываются, будут создаваться слегка отличающиеся образы. Опция --no-insert-timestamp может быть использована для вставки нулевого значения для временной метки, что гарантирует, что двоичные файлы, созданные из идентичных исходных файлов, будут идентичны при сравнении.

Если --insert-timestamp активна, то вставляется либо время, когда происходит связывание, либо, если определена переменная среды "SOURCE_DATE_EPOCH", количество секунд с момента эпохи Unix, как указано в этой переменной.

--enable-reloc-section
--disable-reloc-section

Создайте таблицу базовых перемещений, которая необходима, если образ загружается по другому базовому адресу образа, чем указано в PE-заголовке. Эта опция включена по умолчанию.

Цель C6X uClinux использует двоичный формат, называемый DSBT, для поддержки общих библиотек. Каждая общая библиотека в системе должна иметь уникальный индекс; все исполняемые файлы используют индекс 0.

--dsbt-size size

Эта опция устанавливает количество записей в DSBT текущего исполняемого файла или общей библиотеки равным size. По умолчанию создается таблица с 64 записями.


--dsbt-index index

Эта опция задает индекс DSBT для текущего исполняемого файла или разделяемой библиотеки равным index. Значение по умолчанию — 0, что подходит для создания исполняемых файлов. Если разделяемая библиотека создается с индексом DSBT, равным 0, релокации "R_C6000_DSBT_INDEX" копируются в выходной файл.

--no-merge-exidx-entries

Эта опция отключает объединение смежных записей exidx в информации для размотки стека.

--branch-stub

Эта опция включает в себя релаксацию переходов в связке путем вставки секций переходов при необходимости для расширения диапазона переходов. Эта опция обычно не требуется, поскольку C-SKY поддерживает инструкции перехода и вызова, которые могут обращаться ко всему диапазону памяти, и релаксация переходов обычно выполняется компилятором или ассемблером.

--stub-group-size=N

Эта опция позволяет более точно управлять созданием переходов в связке. Она задает максимальный размер группы входных секций, которые могут быть обработаны одной секцией переходов. Отрицательное значение N помещает секции переходов после соответствующих переходов, в то время как положительное значение позволяет секциям переходов появляться либо до, либо после переходов. Значения 1 или -1 указывают, что связчик должен выбирать подходящие значения по умолчанию.

Связчики для 68HC11 и 68HC12 поддерживают специальные опции для управления отображением переключения банков памяти и генерацией кода-переходника.

--no-trampoline

Эта опция отключает генерацию кода-переходника. По умолчанию для каждой удаленной функции, вызываемой с помощью инструкции "jsr" (это происходит, когда берется указатель на удаленную функцию), генерируется код-переходник.

--bank-window name

Эта опция указывает связчику имя области памяти в спецификации MEMORY, которая описывает окно банков памяти. Определение такой области затем используется связчиком для вычисления разбиения на страницы и адресов в окне памяти.

Следующие опции поддерживаются для управления генерацией GOT при связывании для целевых платформ 68K.

--got=type

Эта опция сообщает связчику, какую схему генерации GOT использовать. type должен быть одним из значений single, negative, multigot или target. Для получения дополнительной информации обратитесь к записи Info для ld.

Следующие опции поддерживаются для управления генерацией микро-MIPS-инструкций и проверок релаксации переходов для переходов между режимами ISA при связывании для целевых платформ MIPS.

--insn32
--no-insn32

Эти опции управляют выбором микро-MIPS-инструкций, используемых в коде, генерируемом связчиком, например, в PLT или в заглушках для отложенной привязки или при релаксации. Если используется --insn32, то связчик использует только 32-битные кодировки инструкций. По умолчанию или если используется --no-insn32, используются все кодировки инструкций, включая 16-битные, когда это возможно.

--ignore-branch-isa
--no-ignore-branch-isa

Эти опции управляют проверками релаксации переходов для недопустимых переходов между режимами ISA. Если используется --ignore-branch-isa, то связчик принимает любые релакации переходов, и любые необходимые переходы между режимами ISA теряются при вычислении релакаций, за исключением некоторых случаев инструкций "BAL", которые соответствуют условиям релаксации и преобразуются в эквивалентные инструкции "JALX", поскольку соответствующая релакация вычисляется. По умолчанию или если используется --no-ignore-branch-isa, выполняется проверка, в результате которой потеря перехода между режимами ISA приводит к ошибке.


--compact-branches
--no-compact-branches

Эти опции управляют генерацией компактных инструкций компоновщиком в записях PLT для MIPS R6.

Для целевой платформы pdp11-aout можно создать три варианта выходного формата, выбираемых следующими опциями. Вариант по умолчанию для pdp11-aout — --omagic, в то время как для других целевых платформ — --nmagic. Опция --imagic определена только для целевой платформы pdp11-aout, в то время как остальные описаны здесь в том виде, в котором они применяются к целевой платформе pdp11-aout.

-N
--omagic

Пометить выходной файл как "OMAGIC" (0407) в заголовке a.out, чтобы указать, что текстовый сегмент не должен быть защищен от записи и использоваться совместно. Поскольку как текстовый, так и секции данных доступны для чтения и записи, секция данных выделяется непосредственно после текстового сегмента. Это самый старый формат для исполняемых программ PDP11 и является форматом по умолчанию для ld в PDP11 Unix с момента его появления до версии 2.11BSD.

-n
--nmagic

Пометить выходной файл как "NMAGIC" (0410) в заголовке a.out, чтобы указать, что при выполнении выходного файла текстовая часть будет доступна только для чтения и совместно использоваться всеми процессами, выполняющими один и тот же файл. Это включает в себя перемещение областей данных вверх до первой возможной границы в 8 КБ после конца текста. Эта опция создает чистый исполняемый формат.

-z
--imagic

Пометить выходной файл как "IMAGIC" (0411) в заголовке a.out, чтобы указать, что при выполнении выходного файла программа, текст и области данных будут загружены в отдельные адресные пространства с использованием инструкции разделения инструкций и данных в блоке управления памятью в более крупных моделях PDP11. Это удваивает адресное пространство, доступное для программы. Текстовый сегмент снова является чистым, защищенным от записи и совместно используемым. Единственная разница в формате вывода между этой опцией и другими, помимо магического числа, заключается в том, что как текстовый, так и секции данных начинаются с адреса 0. Опция -z выбирала этот формат в 2.11BSD. Эта опция создает отдельный исполняемый формат.

--no-omagic

Эквивалентно --nmagic для pdp11-aout.

ОКРУЖАЮЩАЯ СРЕДА

Вы можете изменить поведение ld с помощью переменных среды "GNUTARGET", "LDEMULATION" и "COLLECT_NO_DEMANGLE".

"GNUTARGET" определяет формат входного файла объекта, если вы не используете -b (или его синоним --format). Его значение должно быть одним из имен BFD для формата ввода. Если переменная среды "GNUTARGET" не установлена, ld использует естественный формат целевой платформы. Если "GNUTARGET" установлено значение "default", BFD пытается определить формат ввода, проверяя двоичные входные файлы; этот метод часто успешен, но существуют потенциальные неоднозначности, поскольку нет способа гарантировать, что магическое число, используемое для указания форматов объектных файлов, будет уникальным. Однако процедура настройки BFD в каждой системе помещает обычный формат для этой системы первым в списке поиска, поэтому неоднозначности разрешаются в пользу устоявшейся практики.

"LDEMULATION" определяет эмуляцию по умолчанию, если не используется опция `-m`. Эмуляция может влиять на различные аспекты поведения компоновщика, особенно на скрипт компоновщика по умолчанию. Вы можете получить список доступных эмуляций с помощью опций `--verbose` или `-V`. Если опция `-m` не используется, и переменная среды "LDEMULATION" не определена, эмуляция по умолчанию зависит от того, как был настроен компоновщик.

Обычно компоновщик по умолчанию выполняет деманглирование символов. Однако, если в среде определена переменная "COLLECT_NO_DEMANGLE", то он не будет выполнять деманглирование символов. Эта переменная среды используется аналогичным образом программой-оболочкой компоновщика "gcc". Значение по умолчанию можно переопределить с помощью опций `--demangle` и `--no-demangle`.

Если активна специфичная для PE/COFF опция `--insert-timestamp` и определена переменная среды `SOURCE_DATE_EPOCH`, то значение времени, содержащееся в этой переменной, будет вставлено в заголовок COFF вместо текущего времени.

Если определена переменная среды "LD_STATS", то информация об использовании ресурсов компоновщиком будет записана, как если бы использовалась опция `--stats`. Если переменная "LD_STATS" имеет строковое значение, то это значение будет использоваться в качестве имени файла, в который должна быть сохранена информация. В противном случае информация будет отправлена в стандартный поток вывода.

СМОТРИТЕ ТАКЖЕ

ar(1), nm(1), objcopy(1), objdump(1), readelf(1) и разделы Info для binutils и ld.

АВТОРСКИЕ ПРАВА

Copyright (c) 1991-2025 Free Software Foundation, Inc.

Разрешается копировать, распространять и/или изменять этот документ в соответствии с условиями лицензии GNU Free Documentation License, версии 1.3 или любой более поздней версии, опубликованной Free Software Foundation; без неменяемых разделов, без текста для обложки и без текста для задней обложки. Копия лицензии включена в раздел под названием "GNU Free Documentation License".