Linux / Unix команда: Id

ИМЕ

ld - Използвайки LD , GNU linker

Кратък обзор

ld [ опции ] objfile ...

ОПИСАНИЕ

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

ld приема Езикови файлове на Linker Command, написани в надпис на синтаксиса на Link & Editor Command Language на AT & T, за да осигурят ясен и пълен контрол върху процеса на свързване.

Тази страница на човека не описва команден език; вижте ld записа в "info" или в ръководството ld: GNU linker, за подробности относно команден език и други аспекти на GNU linker.

Тази версия на ld използва библиотеките с общо предназначение BFD за работа с обекти. Това позволява на ld да чете, комбинира и пише обектни файлове в много различни формати - например COFF или "a.out". Различни формати могат да бъдат свързани помежду си, за да се създаде всеки наличен вид обект файл.

Освен гъвкавостта си, GNU linker е по-полезна от другите линкери при предоставянето на диагностична информация. Много линкери изоставят изпълнението веднага след като срещнат грешка; когато е възможно, ld продължава да изпълнява, което ви позволява да идентифицирате други грешки (или, в някои случаи, да получите изходен файл въпреки грешката).

GNU linker ld е предназначен да покрива широк спектър от ситуации и да бъде възможно най-съвместим с други линкери. В резултат на това имате много възможности да контролирате поведението си.

НАСТРОИКИ

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

ld -o <изход> /lib/crt0.o hello.o -lc

Това казва на ld да произведе файл, наречен изход в резултат на свързването на файла "/lib/crt0.o" с "hello.o" и библиотеката "libc.a", която ще дойде от стандартните директории за търсене. (Вижте дискусията за опцията -l по-долу.)

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

Аргументите без опция са обектните файлове или архивите, които трябва да бъдат свързани заедно. Те могат да следват, да предхождат или да се смесват с опции на командния ред, с изключение на това, че аргументът на файловия обект не може да бъде поставен между опцията и нейния аргумент.

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

Ако линкерът не може да разпознае формата на обектен файл, той ще приеме, че е скрипт на линкер. Сценарий, посочен по този начин, увеличава основния скрипт на линкер, използван за връзката (или скрипта по подразбиране на линкер, или този, зададен чрез -T ). Тази функция позволява на линкера да се свърже с файл, който изглежда да е обект или архив, но всъщност просто определя някои символни стойности или използва "INPUT" или "GROUP" за зареждане на други обекти. Имайте предвид, че задаването на скрипт по този начин просто увеличава основния линкер скрипт; използвайте опцията -T, за да замените изцяло скрипта за линк по подразбиране.

За опции, чиито имена са една буква, аргументите на опциите трябва или да следват буквата за опции без интервал на интервалите, или да бъдат дадени като отделни аргументи непосредствено след опцията, която ги изисква.

За опции, чиито имена са няколко букви, едно или две тирета могат да предхождат името на опцията; например символът -Трасе-символ и символът -trace са еквивалентни. Забележете - има едно изключение от това правило. Опциите за множество букви, които започват с малка буква "o", могат да бъдат предшествани само от две тирета. Това ще намали объркването с опцията -o . Така например, -магничната настройка на името на изходния файл към магията, докато --omagic задава NMAGIC флага на изхода.

Аргументите за опциите с няколко букви трябва или да бъдат отделени от името на опцията чрез знак за равенство, или да бъдат дадени като отделни аргументи непосредствено след опцията, която ги изисква. Например, символите -trace-символ foo и -trace-symbol = foo са еквивалентни. Уникалните съкращения на имената на опциите с няколко букви се приемат.

Забележете - ако линкерът се извиква непряко чрез компилатор (напр. Gcc ), тогава всички опции на командния ред на линкера трябва да бъдат предварително обозначени с -Wl, (или каквото е подходящо за конкретния драйвер на компилатор) по следния начин:

gcc -Wl, - начална група foo.o bar.o -Wl, - крайна група

Това е важно, защото в противен случай програмата за програмиране на компилаторите може да изпусне мълчаливо опциите на линкера, което води до лоша връзка.

Ето таблица на генеричните комутатори на командния ред, приети от GNU linker:

- ключова дума

Тази опция се поддържа за съвместимост с HP / UX. Аргументът на ключовата дума трябва да е един от архивите на низовете , споделен или по подразбиране . -aarchive е функционално еквивалентна на -Bstatic , а другите две ключови думи са функционално еквивалентни на -Bdynamic . Тази опция може да се използва по няколко пъти.

- Архитектура

архитектура = архитектура

В текущото издание на ld тази опция е полезна само за семейството архитектури на Intel 960. В тази ld конфигурация архитектурният аргумент идентифицира конкретната архитектура в семейството 960, давайки възможност за някои предпазни мерки и модифициране на пътя за търсене на библиотеката на архива.

Бъдещите версии на ld могат да поддържат подобна функционалност за други архитектурни семейства.

-b входен формат

- формат = формат на вход

ld може да бъде конфигуриран да поддържа повече от един вид обемен файл. Ако вашият ld е конфигуриран по този начин, можете да използвате опцията -b, за да определите двоичния формат за файловете с входни обекти, които следват тази опция на командния ред. Дори когато ld е конфигуриран да поддържа алтернативни формати на обекти, обикновено не е необходимо да посочвате това, тъй като ld трябва да бъде конфигуриран да очаква като стандартен входен формат най-обичайния формат на всяка машина. входният формат е текстов низ, името на конкретен формат, поддържан от библиотеките на BFD. (Можете да посочите наличните двоични формати с objdump -i .)

Може да искате да използвате тази опция, ако свързвате файлове с необичаен бинарен формат. Можете да използвате и -b за изрично превключване на формати (когато свързвате обектни файлове с различни формати), като включвате -b формат на въвеждане преди всяка група обектни файлове в определен формат.

Форматът по подразбиране е взет от променливата "GNUTARGET".

Можете също така да дефинирате входния формат от скрипт, като използвате командата "TARGET";

-c MRI-commandfile

--mri-скрипт = MRI-commandfile

За съвместимост с линкери, произведени чрез MRI, ld приема скриптови файлове, написани на алтернативен, ограничен команден език, описан в секцията MRI Compatible Script Files на документацията на GNU ld. Въведете скриптови MRI файлове с опцията -c ; използвайте опцията -Т, за да стартирате скриптове на линкер, написани на езика за скриптове с общо предназначение. Ако MRI-cmdfile не съществува, ld го търси в директории, определени от всички опции -L .

-DC

-DP

Тези три варианта са еквивалентни; се поддържат множество формуляри за съвместимост с други линкери. Те придават пространство на общи символи, дори ако е зададен изходен файл с преместване (с -r ). Командата "FORCE_COMMON_ALLOCATION" на скрипта има същия ефект.

влизане

--entry = влизане

Използвайте запис като изричен символ за начално изпълнение на програмата си, а не като начална точка за въвеждане. Ако няма символ с наименование за въвеждане , линкерът ще се опита да анализира влизането като номер и ще го използва като адрес за въвеждане (номерът ще бъде интерпретиран в база 10, може да използвате водещ 0x за база 16 или водещ 0 за база 8).

--export-динамично

Когато създавате динамично свързан изпълним файл, добавете всички символи към таблицата с динамични символи. Таблицата с динамични символи е наборът от символи, които се виждат от динамичните обекти по време на изпълнение.

Ако не използвате тази опция, таблицата с динамични символи обикновено съдържа само онези символи, които се споменават от някой динамичен обект, споменат в връзката.

Ако използвате "dlopen", за да заредите динамичен обект, който трябва да се отнася към символите, дефинирани от програмата, а не някакъв друг динамичен обект, тогава вероятно ще трябва да използвате тази опция, когато свързвате самата програма.

Можете също да използвате скрипта за версия, за да контролирате какви символи трябва да се добавят към таблицата с динамични символи, ако изходният формат го поддържа. Вижте описанието на --version-script в @ ref {VERSION}.

-eB

Връзка с големи ендийски обекти. Това се отразява на изходния формат по подразбиране.

-Ел

Свържете малко-ендийски обекти. Това се отразява на изходния формат по подразбиране.

-f

- спомагателно име

Когато създавате споделен обект ELF, задайте вътрешното поле DT_AUXILIARY на посоченото име. Това казва на динамичния линкер, че таблицата със символи на споделения обект трябва да се използва като допълнителен филтър в таблицата със символи на името на споделен обект.

Ако по-късно свържете програма срещу този филтър, тогава когато стартирате програмата, динамичният линк ще види полето DT_AUXILIARY. Ако динамичният линк решава някакви символи от филтърния обект, първо ще провери дали има определение в името на споделен обект. Ако има такава, тя ще бъде използвана вместо дефиницията във филтърния обект. Името на споделения обект не трябва да съществува. По този начин името на споделен обект може да се използва за осигуряване на алтернативно внедряване на определени функции, може би за отстраняване на грешки или за специфично изпълнение на машината.

Тази опция може да бъде зададена повече от веднъж. Записите DT_AUXILIARY ще бъдат създадени в реда, в който се показват в командния ред.

-F име

- името на филтъра

Когато създавате споделен обект ELF, задайте вътрешното поле DT_FILTER на посоченото име. Това казва на динамичния линкер, че таблицата със символи на създадения споделен обект трябва да се използва като филтър в таблицата със символи на името на споделен обект.

Ако по-късно свържете програма срещу този филтър, тогава когато стартирате програмата, динамичният линк ще види полето DT_FILTER. Динамичният линкер ще разреши символите според таблицата на символите на филтърния обект, както обикновено, но всъщност ще се свърже с дефинициите, намиращи се в името на споделен обект. Така филтърният обект може да бъде използван за избор на подмножество от символи, осигурени от името на обекта.

Някои по-стари линкери използваха опцията -F в цяла компилационна инструментална верига за задаване на обектно-файлов формат за входни и изходни обектни файлове. GNU linker използва и други механизми за тази цел: опциите -b , --format , --format , командата "TARGET" в скриптовете на линкер и променливата "GNUTARGET". Линуксът на GNU ще пренебрегне опцията -F , когато не създава ELF споделен обект.

-име име

Когато създавате ELF изпълним или споделен обект, обадете се на NAME, когато изпълнимият или споделеният обект се разтоварва, като зададете DT_FINI на адреса на функцията. По подразбиране линкерът използва функция "_fini" като функция за повикване.

-g

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

-G стойност

--gpsize = стойност

Задайте максималния размер на обектите, които да бъдат оптимизирани, като използвате GP регистъра за размера . Това е от значение само за файловите формати на обекти като MIPS ECOFF, което поддържа поставянето на големи и малки обекти в различни секции. Това се игнорира за други файлови формати на обекти.

-h име

-soname = име

Когато създавате споделен обект ELF, задайте вътрешното поле DT_SONAME на посоченото име. Когато даден изпълним файл е свързан със споделен обект, който има поле DT_SONAME, тогава когато изпълнимия файл се стартира, динамичният линкер ще се опита да зареди споделения обект, посочен от полето DT_SONAME, вместо да използва името на файла, дадено на линкера.

-i

Изпълнявайте нарастваща връзка (същото като вариант -r ).

-инато име

Когато създавате ELF изпълним или споделен обект, обадете се на NAME, когато се зареди изпълним или споделен обект, като зададете DT_INIT на адреса на функцията. По подразбиране връзката използва "_init" като функция за повикване.

-l архив

--library = архив

Добавете архивен файл архив в списъка с файлове, които да се свързват. Тази опция може да се използва по няколко пъти. ld ще търси своя списък с пътувания за появата на "libarchive.a" за всеки специфициран архив .

На системи, които поддържат споделени библиотеки, ld може също да търси библиотеки с разширения, различни от ".a". По-конкретно, при системите ELF и SunOS, ld ще търси в директория за библиотека с разширение ".so", преди да потърси такъв с разширение ".a". По споразумение, разширение ".so" означава споделена библиотека.

Линкерът ще търси в архив само веднъж, на мястото, където е посочено в командния ред. Ако архивът дефинира символ, който не е дефиниран в някакъв обект, който се появи пред архива на командния ред, линкерът ще включва подходящия файл (и) от архива. Обаче, неопределен символ в обект, който се появява по-късно на командния ред, няма да доведе до това, че линкерът отново ще търси архива.

Вижте опцията - ( опция за начин да принудите линкера да търси архиви няколко пъти.

Можете да посочите същия архив няколко пъти на командния ред.

Този тип архивно търсене е стандартно за Unix линкери. Ако обаче използвате ld onAIX, имайте предвид, че това е различно от поведението на линка AIX.

-L searchdir

- librarian-path = searchdir

Добавете пътя searchdir към списъка с пътища, които ld ще търсят архивни библиотеки и ld контролни скриптове. Можете да използвате тази опция многократно. Директорите се търсят в реда, в който са посочени в командния ред. Директорите, посочени в командния ред, се търсят преди директорите по подразбиране. Опциите за всички -L се отнасят за всички опции -l , независимо от реда, в който се появяват опциите.

Ако searchdir започва с "=", тогава "=" ще бъде заменен от prefix на sysroot , път, определен, когато линкерът е конфигуриран.

Стандартният набор от търсени пътища (без да е указан с -L ) зависи от режима на емулация ld , а в някои случаи и от начина, по който е конфигуриран.

Пътеките могат да бъдат посочени и в скрипт за връзка с командата "SEARCH_DIR". Директории, зададени по този начин, се търсят в точката, в която скриптът на линка се показва в командния ред.

-m емулация

Емулира емулатора linker. Можете да посочите наличните емулации с опциите --verbose или -V .

Ако опцията -m не се използва, емулацията се взема от променливата "LDEMULATION", ако е дефинирана.

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

--print-карта

Отпечатване на карта на връзката към стандартния изход. Картата на връзките предоставя информация за връзката, включително следното:

*

Където файловете и символите на обекта се картографират в паметта.

*

Как се разпределят обичайните символи.

*

Всички членове на архива, включени в линка, с посочване на символа, довел до въвеждането на архивния член.

--nmagic

Изключете изравняването на страниците на секциите и маркирайте изхода като "NMAGIC", ако е възможно.

-N

--omagic

Задайте разделите за текстове и данни да бъдат четливи и за писане. Също така не подравнявайте сегмента с данни по страница и деактивирайте свързването с споделените библиотеки. Ако изходният формат поддържа магически номера с Unix стил, маркирайте изхода като "OMAGIC".

--no-omagic

Тази опция премахва повечето от ефектите на опцията -N . Той задава текстовата секция да бъде само за четене и принуждава сегмента данни да бъде подравнен спрямо страницата. Забележка - тази опция не позволява свързването с общите библиотеки. Използвайте -Bdynamic за това.

-o изход

- изход = изход

Използвайте продукцията като име за програмата, създадена от ld ; ако тази опция не е посочена, името a.out се използва по подразбиране. Командата "OUTPUT" на скрипта може също така да посочи името на изходния файл.

-O ниво

Ако нивото е цифрова стойност по-голяма от нула ld, оптимизира изхода. Това може да отнеме значително повече време и следователно вероятно трябва да бъде разрешено само за окончателното двоично изпълнение.

-q

--emit-relocs

Оставете секции и съдържание на преместването в напълно свързани exececutables. Инструментите за анализ и оптимизация на връзките след тази връзка може да се нуждаят от тази информация, за да се извършат верни модификации на изпълнимите файлове. Това води до по-големи изпълними файлове.

Тази опция понастоящем се поддържа само от платформи ELF.

-r

--relocateable

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

Когато входен файл няма същия формат като изходния файл, частичното свързване се поддържа само ако този входен файл не съдържа премествания. Различните продуктови формати могат да имат допълнителни ограничения; например някои формати, базирани на "a.out", не поддържат частично свързване с входни файлове в други формати изобщо.

Тази опция прави същото като -i .

-R име на файл

- just-symbols = име на файла

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

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

--strip всичко

Изключете цялата информация за символите от изходния файл.

--strip-отстраняване на грешки

Изпускайте информацията от символа за отстраняване на грешки (но не всички символи) от изходния файл.

-T

--trace

Отпечатайте имената на входните файлове, като ги обработвате.

-S скриптов файл

- script = scriptfile

Използвайте scriptfile като линкер скрипт. Този скрипт замества скрипта по подразбиране на ld (вместо да го добавя), така че команден файл трябва да посочи всичко необходимо за описване на изходния файл. Ако скриптов файл не съществува в текущата директория, "ld" го търси в директории, определени от всички предишни опции -L . Опциите за множество опции се акумулират.

-u символ

--undefined = символ

Символът за сила се въвежда в изходния файл като неопределен символ. Това може например да задейства свързването на допълнителни модули от стандартните библиотеки. -u може да се повтори с различни аргументи за опции за въвеждане на допълнителни неопределени символи. Тази опция е еквивалентна на командата "EXTERN" скриптов линкер.

-Ur

За всякакви програми, различни от C ++, тази опция е еквивалентна на -r : тя генерира преместваем изход - т.е. изходен файл, който от своя страна може да служи като вход за ld . Когато свързвате C ++ програми, -Ur решава препратки към конструктори, за разлика от -r . Не работи за използване на -Ur на файлове, които са били свързани с -Ur ; след създаването на конструкторската маса не може да се добави. Използвайте -Ur само за последната частична връзка и -r за останалите.

--unique [= SECTION ]

Създава отделна секция за всеки входен раздел, съответстващ на SECTION или ако липсва опционалният аргумент SECTION за заместващ елемент, за всяка секция за вход за сираци. Секция за сираци е тази, която не е специално посочена в скрипта на линкера. Можете да използвате тази опция няколко пъти в командния ред; Предотвратява нормалното сливане на входни секции с едно и също име, превъзхождащи задачи в секция на линкер.

-V

--version

-V

Показване на номера на версията за ld . Опцията -V също изброява поддържаните емулации.

--discard всичко

Изтрийте всички местни символи.

--discard докато жителите

Изтрийте всички временни местни символи. За повечето цели това са всички местни символи, чиито имена започват с L.

-y символ

-trace-символ = символ

Отпечатайте името на всеки свързан файл, в който се появява символ . Тази опция може да бъде дадена по няколко пъти. На много системи е необходимо да подложите на подсказка.

Тази опция е полезна, когато имате недефиниран символ във връзката си, но не знаете откъде идва референцията.

-Y път

Добавете път към пътя за търсене по подразбиране на библиотеката. Тази опция съществува за съвместимост с Solaris.

-z ключова дума

Ключовите думи са "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", " ". Другите ключови думи се игнорират за Solaris съвместимост. "initfirst" маркира обекта, който трябва да се инициализира първо по време на изпълнение преди всички други обекти. "interpose" маркира обекта, който символната му таблица вмъква пред всички символи, но основния изпълним файл "loadfltr" маркира обекта, който неговите филтри да бъдат обработени незабавно по време на изпълнение "nodefaultlib" маркира обекта, който търсенето на зависимости на този обект ще игнорира всички пътища за търсене по библиотека по подразбиране. "nodelete" означава, че обектът не трябва да се разтоварва по време на изпълнение. "nodlopen" означава обекта, който не е достъпен за "dlopen". "nodump" означава, че обектът не може да бъде изхвърлен от "dldump". "now" маркира обекта с необвързаното време за изпълнение. "Origin" означава, че обектът може да съдържа $ ORIGIN. "defs" забранява неопределените символи. "muldefs" позволява множество дефиниции. "combreloc" комбинира множество секции за преместване и ги подрежда, за да направи възможно кеширането на динамичен символ.

"nocombreloc" деактивира комбинирането на множество преместващи секции. "nocopyreloc" забранява производството на копия на копия.

- ( архиви -)

- архиви на началната група - end-group

Архивите трябва да са списък с архивни файлове . Те могат да бъдат или изрични имена на файлове, или -l опции.

Посочените архиви се търсят многократно, докато не се създадат нови неопределени референции. Обикновено един архив се търси само веднъж в реда, в който е указан в командния ред. Ако в архива е необходим символ за разрешаване на неопределен символ, посочен от обект в архив, който се появява по-късно на командния ред, линкерът няма да може да разреши тази позовака. Чрез групиране на архивите всички те се претърсват многократно, докато се решат всички възможни референции.

Използването на тази опция има значителни разходи за ефективност. Най-добре е да го използвате само когато има неизбежни кръгови препратки между два или повече архива.

--accept-неизвестен вход-арка

--no-приемам-неизвестен вход-арка

Показва на линкера да приема входни файлове, чиято архитектура не може да бъде разпозната. Предполага се, че потребителят знае какво правят и съзнателно иска да се свърже в тези неизвестни входни файлове. Това беше поведението по подразбиране на линкера, преди пускането му на пазара 2.14. Стандартното поведение от изданието 2.14 нататък е отхвърлянето на такива входни файлове и затова е добавена опцията - accept-unknown-input-arch, за да се възстанови старото поведение.

- указване на ключова дума

Тази опция се игнорира за съвместимост със SunOS .

-Bdynamic

-dy

-call_shared

Връзка с динамични библиотеки. Това има смисъл само на платформи, за които се поддържат споделени библиотеки . Тази опция обикновено е по подразбиране за такива платформи. Различните варианти на тази опция са за съвместимост с различни системи. Можете да използвате тази опция няколко пъти на командния ред: тя засяга библиотеката, търсейки -l опции, които следват.

-Bgroup

Задайте флага "DF_1_GROUP" в елемента "DT_FLAGS_1" в динамичната секция. Това кара линдера по време на изпълнение да обработва търсенията в този обект и зависимостите му да се изпълняват само в групата. - не-неопределен е подразбиращ се. Тази опция има смисъл само върху платформите ELF, които поддържат споделени библиотеки .

-Bstatic

-DN

-non_shared

-static

Не препращайте към споделени библиотеки. Това има смисъл само на платформи, за които се поддържат споделени библиотеки. Различните варианти на тази опция са за съвместимост с различни системи. Можете да използвате тази опция няколко пъти на командния ред: тя засяга библиотеката, търсейки -l опции, които следват.

-Bsymbolic

Когато създавате споделена библиотека, обвързвайте позоваването на глобални символи с дефиницията в споделената библиотека, ако има такава. Обикновено е възможно програма, свързана с споделена библиотека, да замени определението в споделената библиотека. Тази опция има смисъл само върху ELFplatforms, които поддържат споделени библиотеки.

--check сечения

--no проверка сечения

Изисква линкерът да не проверява адресите на секциите, след като са били назначени, за да видят дали има някакви припокривания. Обикновено линкерът ще извърши тази проверка и ако открие каквито и да било припокривания, ще създаде подходящи съобщения за грешка. Линкерът знае и прави отстъпки за секции в наслагвания. Поведението по подразбиране може да бъде възстановено чрез използването на превключвателя на командния ред - проверете секциите .

--cref

Извежда се кръстосана референтна таблица. Ако се генерира файл с линкер, кръстосаната таблица с отпечатъци се отпечатва в картографския файл. В противен случай той се отпечатва на стандартния изход.

Форматът на таблицата е умишлено прост, за да може лесно да бъде обработен от скрипт, ако е необходимо. Символите се отпечатват, сортирани по име. За всеки символ е даден списък с имената на файловете. Ако символът е дефиниран, първият изброен файл е местоположението на дефиницията. Останалите файлове съдържат препратки към символа.

--no-определят-общ

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

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

--defsym symbol = израз

Създайте глобален символ в изходния файл, съдържащ абсолютния адрес, даден от израза . Можете да използвате тази опция толкова пъти, колкото е необходимо, за да дефинирате няколко символа в командния ред. В този контекст се поддържа ограничена форма на аритметика: може да дадете шестнадесетична константа или името на съществуващ символ или да използвате "+" и "-", за да добавите или извадите шестнадесетични константи или символи. Ако имате нужда от по-сложни изрази, помислете за използването на команден език на линкера от скрипт. Забележка: не трябва да има бяло пространство между символа , знака за равенство (`` = '') и израз .

- отхвърляне [= стил ]

--no-demangle

Тези опции контролират дали да се демят имената на символите в съобщенията за грешки и други изходи. При свързването на линкера, той се опитва да представи имената на символите по четен начин: лентите водят до долни черти, ако се използват от файловия формат на обекта и конвертират имената на символите C ++ в потребителски четими имена. Различните компилатори имат различни стилове. Аргументът за опция за демонтаж на стил може да се използва за избор на подходящ стил за размесване за вашия компилатор. Линкерът ще се деформира по подразбиране, освен ако не е зададена променливата за обкръжение COLLECT_NO_DEMANGLE . Тези опции могат да се използват за подмяна на стандартните.

- файл с динамичен линкер

Задайте името на динамичния линкер. Това има смисъл само при генериране на динамично свързани ELF изпълними файлове. Стандартният динамичен линкер обикновено е правилен; не използвайте това, освен ако не знаете какво правите.

--embedded-relocs

Тази опция има смисъл само когато свързвате MIPS вграден PIC код, генериран от опцията -membedded-pic към GNU компилатора и асемблера. То причинява на линкера да създаде таблица, която може да се използва по време на изпълнение, за да се преместят всички данни, които са статично инициализирани до стойности на показалеца. Вижте кода в testsuite / ld-empic за подробности.

--fatal-предупреждения

Отнасяйте се до всички предупреждения като грешки .

--force-Търсейки-наставка

Уверете се, че изходен файл има приставка .exe.

Ако успешно изграденият напълно свързан изходен файл няма суфикси " .exe " или " .dll ", тази опция принуждава линкера да копира изходния файл на едноименното с ".exe" суфикс. Тази опция е полезна при използване на немодифицирани makefiles на Unix на хост на Microsoft Windows, тъй като някои версии на Windows няма да показват изображение, освен ако не завършва със суфикс ".exe".

--no-GC-раздели

--gc сечения

Активирайте събирането на отпадъци от неизползвани секции. Той се игнорира по цели, които не поддържат тази опция. Тази опция не е съвместима с -r , нито трябва да се използва с динамично свързване. Поведението по подразбиране (от неизпълнение на това събиране на отпадъци ) може да бъде възстановено, като се посочат --no-gc-sections в командния ред.

--помогне

Отпечатване на обобщение на опциите от командния ред на стандартния изход и изход.

--target-помощ

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

-Разположен mappile

Отпечатайте карта на връзката към файловия файл. Вижте описанието на опцията -M , по-горе.

--no-Keep-памет

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

--no-неопределен

-z defs

Обикновено при създаването на не символична споделена библиотека се разрешават неопределени символи, които остават да бъдат разрешени от зареждащото устройство по време на изпълнение. Тези опции забраняват такива неопределени символи.

--allow-множествен определение

-z muldefs

Обикновено, когато символът се дефинира няколко пъти, линкерът ще подаде сигнал за фатална грешка. Тези опции позволяват множество дефиниции и ще се използва първата дефиниция.

--allow-shlib-неопределен

Разрешаване на неопределени символи в споделени обекти дори когато е зададено --no-undefined. Нетният резултат ще бъде, че неопределените символи в обикновените обекти все още ще предизвикат грешка, но неопределените символи в споделените обекти ще бъдат игнорирани. Изпълнението на no_undefined прави предположението, че линкерът за време на изпълнение ще задуши недефинираните символи. Въпреки това има поне една система (BeOS), където неопределените символи в споделените библиотеки са нормални, тъй като ядрото ги запълва при зареждане, за да изберете коя функция е най-подходяща за текущата архитектура. IE динамично избира подходяща функция memset. Очевидно е също така нормално споделените библиотеки на HPPA да имат неопределени символи.

--no-неопределени-версия

Обикновено, когато символът има неопределена версия, линкерът ще го игнорира. Тази опция забранява символите с недефинирана версия и вместо това ще бъде издадена фатална грешка.

--no-предупреди-несъответствие

Обикновено LD ще даде грешка, ако се опитате да свържете заедно входни файлове, които са несъвпадащи по някаква причина, може би защото са компилирани за различни процесори или за различни endiannesses. Тази опция казва на ld , че трябва мълчаливо да позволи такива възможни грешки. Тази опция трябва да се използва само внимателно, в случаите, когато сте предприели някои специални действия, които гарантират, че грешките на линкера са неподходящи.

--no-цялото архив

Изключете ефекта от опцията - цяла архива за следващите архивни файлове.

--noinhibit-EXEC

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

-nostdlib

Само директории на библиотеката за търсене са изрично посочени в командния ред. Директорите на библиотеките, посочени в скриптовете на линкер (включително скриптовете на линкер, посочени в командния ред), се игнорират.

- формат на изходния формат

ld може да бъде конфигуриран да поддържа повече от един вид обемен файл. Ако вашият ld е конфигуриран по този начин, можете да използвате опцията - оформление, за да определите двоичния формат за файла на изходния обект. Дори когато ld е конфигуриран да поддържа алтернативни формати на обекти, обикновено не е необходимо да посочвате това, тъй като ld трябва да бъде конфигуриран да произвежда като изходен формат по подразбиране най-обичайния формат на всяка машина. изходният формат е текстов низ, името на конкретен формат, поддържан от библиотеките на BFD. (Можете да посочите наличните двоични формати с objdump -i .) Командата "OUTPUT_FORMAT" на скрипта може също да посочи изходния формат, но тази опция го заменя.

-qmagic

Тази опция е игнорирана за съвместимост с Linux.

-Qy

Тази опция се игнорира за съвместимост със SVR4.

--отпуснете се

Опция, която зависи от машината. Тази опция се поддържа само за няколко цели.

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

На някои платформи тези глобални оптимизации по време на свързване могат да направят невъзможно символичното отстраняване на грешки на получения изпълним файл. Това е известно, че става дума за фамилията процесори Matsushita MN10200 и MN10300.

На платформи, където това не се поддържа, - relax се приема, но се игнорира.

- задържане на символи - име на файла

Запазете само символите, изброени в името на файла , като отхвърлите всички останали. името на файла е просто плосък файл с едно име на символ на ред. Тази опция е особено полезна в среди (като VxWorks), където постепенно се натрупва голяма глобална таблица със символи, за да се запази паметта за изпълнение.

-retain-символите-файл не изхвърля неопределени символи или символи, необходими за преместване.

Можете да зададете само - retain-symbols-file веднъж в командния ред. Той има предимство на -s и -S .

-rpath реж

Добавете директория към пътя за търсене на библиотеката по време на изпълнение. Това се използва, когато свързвате ELFexecutable със споделени обекти. Всички аргументи на думата са обединени и предадени на линкер по време на изпълнение, който ги използва за откриване на споделени обекти по време на изпълнение. Опцията -rpath се използва и при намиране на споделени обекти, които са необходими на споделените обекти, изрично включени в връзката; вижте описанието на опцията " rpath-link ". Ако " 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 определя първия набор от директории за търсене. Опцията " rpath-link " може да указва поредица от имена на директории, като посочи списък с имена, разделени с двойно, или като се появява няколко пъти.

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

Линкерът използва следните пътища за търсене, за да намери необходимите споделени библиотеки.

1.

Всички директории, посочени от опциите -rpath-link .

2.

Всички директории, посочени от опциите за отваряне . Разликата между -rpath и -rpath-link е, че директорите, определени от опциите -rpath , са включени в изпълнимия файл и се използват по време на изпълнение, докато опцията -rpath-link е ефективна само във времето на връзката. То е само за местния линкер.

3.

При система ELF, ако опциите "rpath" и "rpath-link" не бяха използвани, потърсете съдържанието на променливата "LD_RUN_PATH". То е само за местния линкер.

4.

В SunOS, ако опцията -rpath не беше използвана, търсете директории, зададени чрез опции -L .

5.

За родния линкер съдържанието на променливата "LD_LIBRARY_PATH".

6.

За локален ELF линкер директорите в "DT_RUNPATH" или "DT_RPATH" на споделена библиотека се търсят за споделените библиотеки, необходими за нея. Записите "DT_RPATH" се игнорират, ако съществуват записи "DT_RUNPATH".

7.

Директорите по подразбиране обикновено / lib и / usr / lib .

8.

За местен линкер на система ELF, ако файлът /etc/ld.so.conf съществува, списъкът с директории, намиращи се в този файл.

Ако не е намерена необходимата споделена библиотека, линкерът ще издаде предупреждение и ще продължи с връзката.

-shared

-Bshareable

Създайте споделена библиотека. Понастоящем това се поддържа само от платформите ELF, XCOFF и SunOS. В SunOS линкерът автоматично ще създаде споделена библиотека, ако опцията -e не се използва и има неопределени символи в връзката.

--Сортирай-чести

Тази опция казва на ld да сортира общите символи по размер, когато ги постави в съответните изходни секции. Най-напред идват всички символи на един байт, после и двата байта, после всичките четири байта и после всичко останало. Това е, за да се предотврати пропуски между символите поради ограничения на изравняването.

- комплект по файл [ размер ]

Подобно на --split-by-reloc, но създава нова изходна секция за всеки входен файл при достигане на размера . размер по подразбиране до размер 1, ако не е даден.

- комплект от преместване [ брой ]

Опитва се да създаде допълнителни секции в изходния файл, така че нито един изходен раздел във файла да съдържа повече от брой премествания. Това е полезно, когато се генерират огромни преносими файлове за изтегляне в определени ядра в реално време с файловия формат COFF; тъй като COFFcan не представлява повече от 65535 премествания в отделна секция. Имайте предвид, че това не може да работи с файлови формати на обекти, които не поддържат произволни секции. Линкерът няма да раздели отделните сектори за преразпределение, така че ако една секция за въвеждане съдържа повече от броя премествания, една изходяща секция ще съдържа толкова много премествания. броят по подразбиране е 32768.

--stats

Изчислете и покажете статистически данни за работата на линкера, като време за изпълнение и използване на паметта.

--traditional-формат

За някои цели продукцията на ld е различна по някакъв начин от изхода на някои съществуващи линкери. Този превключвател иска ld да използва традиционния формат вместо това.

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

- sectionction start section = org

Намерете секция в изходния файл на абсолютния адрес, даден от org . Можете да използвате тази опция толкова пъти, колкото е необходимо, за да намерите няколко секции в командния ред. org трябва да бъде едно цяло шестнадесетично число; за съвместимост с други линкери, може да пропуснете водещия 0x, обикновено свързан с шестнадесетични стойности. Забележка: Не трябва да има бяло пространство между името на секцията , знака равен (`` = '') и org .

-Tbss org

-Дата org

-Textext org

Използвайте org като начален адрес за --- съответно --- сегмента "bss", "data" или "text" на изходния файл. org трябва да бъде едно цяло шестнадесетично число; за съвместимост с други линкери, може да пропуснете водещия 0x, обикновено свързан с шестнадесетични стойности.

--dll-многословен

--verbose

Показване на номера на версията за ld и изброяване на поддържаните емулации на линкер. Показва кои входни файлове могат и не могат да бъдат отворени. Показва скрипта на линка, който се използва от линкера.

--version-script = version-scriptfile

Посочете името на скрипта на версията към линкера. Това обикновено се използва при създаване на споделени библиотеки, за да се определи допълнителна информация за версията на версията за създадената библиотека. Тази опция има смисъл само върху платформите ELF, които поддържат споделени библиотеки.

--warn-чести

Предупреждавайте, когато общ символ се комбинира с друг общ символ или със символна дефиниция. Unix линкерите позволяват тази малко променлива практика, но линкерите на някои други операционни системи не го правят. Тази опция ви позволява да откриете потенциални проблеми от комбинирането на глобални символи. За съжаление, някои C библиотеки използват тази практика, така че може да получите някои предупреждения за символите в библиотеките, както и във вашите програми.

Има три вида глобални символи, илюстрирани тук от примери C:

int i = 1;

Дефиниция, която влиза в секцията за инициализираните данни на изходния файл.

external int i;

Неопределена референция, която не разпределя пространство. Трябва да има определение или общ символ за променливата някъде.

int i;

Общ символ. Ако има само (един или повече) общи символи за променлива, то отива в областта на неинициализираните данни на изходния файл. Линкерът обединява няколко общи символа за една и съща променлива в един символ. Ако те са с различни размери, те избират най-големия размер. Линкерът превръща общ символ в декларация, ако има определение за същата променлива.

Опцията - Предупреждение често може да доведе до пет вида предупреждения. Всяко предупреждение се състои от двойка линии: първото описва символа, който току-що е срещнал, а вторият описва предишния символ, срещащ се със същото име. Един или и двата символа ще бъде общ символ.

1.

Превръщането на общ символ в справка, защото вече има определение за символа.

(
): предупреждение: често срещано за <<символ> е заменено по дефиниция (
):

2.

Превръщането на общ символ в справка, защото се среща по-късна дефиниция за символа. Това е същото като предишния случай, с изключение на това, че символите се срещат в различен ред.

(
): предупреждение: дефиниция на "<символ>" надхвърляща обща (
):

3.

Сливане на общ символ с предишен общ символ със същия размер.

(
): предупреждение: много често срещани за <<символ> < (
): предупреждение:

4.

Сливане на общ символ с предишен по-голям общ символ.

(
): предупреждение: често срещано за "<символ>" е заменено от по-голям общ (
):

5.

Сливане на общ символ с предишен по-малък общ символ. Това е същото като предишния случай, с изключение на това, че символите се срещат в различен ред.

(
): предупреждение: често срещано за <<символ> заменящо по-малък общ (
):

--warn-конструктори

Предупреждавайте, ако се използват глобални конструктори. Това е полезно само за няколко файлови формати на обекти. За формати като COFF или ELF, линкерът не може да открие използването на глобални конструктори.

--warn-множествен GP

Предупреждавайте, ако в изходния файл са необходими няколко стойности за глобален указател. Това е смислено само за някои процесори, като Alpha. По-конкретно, някои процесори поставят големи константи в специален раздел. Специален регистър (глобалният показалец) посочва в средата на този раздел, така че константите да могат да се заредят ефективно чрез режим на адресиране на базовия регистър. Тъй като отместването в относителния режим на базовия регистър е фиксирано и относително малко (напр. 16 бита), това ограничава максималния размер на константния пул. По този начин при големите програми често е необходимо да се използват множество стойности на глобалния показалец, за да може да се адресират всички възможни константи. Тази опция предизвиква предупреждение, когато това се случи.

--warn-веднъж

Предупреждавайте само веднъж за всеки неопределен символ, а не веднъж за всеки модул, който се отнася до него.

--warn сечение подравняване

Предупреждавайте, ако адресът на изходната секция е променен поради подравняване. Обикновено подравняването ще бъде зададено чрез входна секция. Адресът ще бъде променен само ако не е посочен изрично; т.е. ако командата "SECTIONS" не посочи начален адрес за секцията.

--whole-архив

За всеки архив, споменат в командния ред, след опцията -whole-archive , включете всеки обект в архива на връзката, вместо да търсите в архива за изискваните обектни файлове. Това обикновено се използва, за да се превърне архивен файл в споделена библиотека, принуждавайки всеки обект да бъде включен в получената споделена библиотека. Тази опция може да се използва повече от веднъж.

Две бележки, когато използвате тази опция от gcc: Първо, gcc не знае за тази опция, така че трябва да използвате -Wl, -whole-archive . Второ, не забравяйте да използвате -Wl, -not-whole-archive след списъка си с архиви, защото gcc ще добави свой собствен списък с архиви към връзката ви и може да не искате този флаг да повлияе и на тези.

- символ за обвивка

Използвайте функция за обвивка за символ . Всяко неопределено позоваване на символа ще бъде решено на "__ wrap_symbol". Всяко неопределено позоваване на "__real_symbol" ще бъде решен като символ .

Това може да се използва за осигуряване на обвивка за системна функция. Функцията за обвивка трябва да се нарича "__wrap_symbol". Ако иска да се обади на функцията на системата, трябва да се обади "__ real_symbol".

Ето един тривиален пример:

void * __wrap_malloc (int c) {printf ("malloc се извиква с% ld \ n", c); връщане __real_malloc (c); }

Ако свържете друг код с този файл с помощта на - wrap malloc , тогава всички повиквания към "malloc" ще се обадят на функцията "__wrap_malloc" вместо това. Обаждането до "__real_malloc" в "__wrap_malloc" ще се обади на истинската функция "malloc".

Възможно е да предоставите функция "__real_malloc", така че връзките без опцията " -wrap " да успеят. Ако направите това, не бива да поставяте определението за "__ real_malloc" в същия файл като "__wrap_malloc"; ако го направите, асемблерът може да разреши обаждането преди линкерът да има шанс да го увие в "malloc".

--enable-нови-dtags

--disable-нови-dtags

Този линкер може да създаде новите динамични маркери в ELF. Но по-старите системи ELF може да не ги разбират. Ако зададете --enable-new-dtags , динамичните маркери ще бъдат създадени според нуждите. Ако зададете --disable-new-dtags , няма да бъдат създадени нови динамични маркери. По подразбиране новите номера не се създават. Обърнете внимание, че тези опции са налице само за системите на SELF.

В i386 PE линкърът поддържа опцията " Shared ", която прави изхода да бъде динамично свързана библиотека (DLL) вместо обикновен изпълним файл. Трябва да наименувате изхода "* .dll", когато използвате тази опция. В допълнение, линкерът напълно поддържа стандартните "* .def" файлове, които могат да бъдат посочени на командния ред на линкера като файл на обект (всъщност той трябва да предхожда архивите, които изнася символите, за да се гарантира, точно като нормален обект файл).

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

--add-stdcall-псевдоним

Ако са дадени, символите със суфикс stdcall (@ nn ) ще бъдат експортирани както е и също така и със суфикса.

- файл с базови файлове

Използвайте файла като името на файл, в който да запазите базовите адреси на всички премествания, необходими за генериране на DLL с dlltool .

--dll

Създайте DLL вместо обикновен изпълним файл. Можете също така да използвате " споделена" или да зададете "LIBRARY" в даден файл ".def".

--enable-stdcall-fixup

--disable-stdcall-fixup

Ако връзката намери символ, който не може да реши, ще се опита да направи "размито", като потърси друг дефиниран символ, който се различава само във формата на името на символа (cdecl vs stdcall) и ще разреши този символ чрез свързване към мача. Например, неопределеният символ "_foo" може да бъде свързан с функцията "_foo @ 12", или неопределеният символ "_bar @ 16" може да бъде свързан с функцията "_bar". Когато линкерът направи това, той отпечатва предупреждение, тъй като обикновено не би трябвало да се свързва, но понякога импортират библиотеки, генерирани от DLL на трети страни, може да се наложи тази функция да бъде използваема. Ако зададете --enable-stdcall-fixup , тази функция е напълно активирана и предупрежденията не се отпечатват. Ако зададете --disable-stdcall-fixup , тази функция е деактивирана и такива несъответствия се считат за грешки.

--export-всички-символи

Ако са дадени, всички глобални символи в обектите, използвани за изграждане на DLL, ще бъдат експортирани от DLL. Имайте предвид, че това е по подразбиране, ако в противен случай няма да има експортирани символи. Когато символите се експортират изрично чрез DEF файлове или имплицитно се експортират чрез функционални атрибути, по подразбиране е да не се експортира нищо друго, освен ако тази опция не е дадена. Имайте предвид, че символите "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12" и "impure_ptr" няма да бъдат автоматично експортирани. Освен това символите, импортирани от други DLL, няма да бъдат реекспортирани, нито символите, определящи вътрешното оформление на DLL, като тези, започващи с "_head_" или завършващи с "_iname". Освен това няма да се експортират символи от "libgcc", "libstd ++", "libmingw32" или "crtX.o". Символите, чиито имена започват с "__rtti_" или "__builtin_", няма да бъдат експортирани, за да помогнат с C ++ DLL. И накрая, има широк списък от 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 ".

--exclude-symbols символ , символ , ...

Задава списък със символи, които не трябва да се експортират автоматично. Имената на символите могат да бъдат обозначени със запетая или двоеточие.

--exclude-libs lib , lib , ...

Посочва списък на библиотеките от архиви, от които символите не трябва да се експортират автоматично. Имената на библиотеките могат да бъдат обозначени със запетая или двоеточие. Посочването на "--exclude-libs ALL" изключва символите във всички архивни библиотеки от автоматично експортиране. Символите, изрично изброени в .def файл, все още се експортират независимо от тази опция.

--file-подравняване

Посочете подравняването на файла. Разделите във файла винаги ще започнат с компенсации на файлове, които са кратни на това число. Това по подразбиране е 512.

- Резервен резервоар

- Резервен резерв , извършете

Посочете размера на паметта, която да резервирате (и по желание да извършите), която да се използва като купчина за тази програма. Стандартът е 1Mb резервиран, 4K ангажиран.

- стойност на база изображение

Използвайте стойност като базов адрес на вашата програма или DLL. Това е най-ниското място в паметта, което ще се използва, когато програмата или DLL се зареждат. За да намалите нуждата от преместване и подобряване на производителността на вашите DLL, всеки трябва да има уникален базов адрес и да не се припокрива с други DLL. По подразбиране е 0x400000 за изпълними файлове и 0x10000000 за DLL.

--kill-на

Ако са дадени, суфиксите stdcall ( @nn ) ще бъдат премахнати от символите преди да бъдат експортирани.

--major-image-version стойност

Задава основния брой на `` версията на изображението ''. По подразбиране е 1.

--major-os-версия стойност

Задава основния брой на `` os версия ''. По подразбиране е 4.

--major-подсистема-версия стойност

Задава основния брой на `` подсистемата версия ''. По подразбиране е 4.

- стойност на мини-изображение-версия

Задава малкия номер на `` версията на изображението ''. По подразбиране е 0.

- стойност на минимум-версия

Задава малкия номер на версията "os". По подразбиране е 0.

- стойност на минимум-подсистема-версия

Задава малкия номер на `` подсистемата версия ''. По подразбиране е 0.

- файл с изходящ дефект

Линкерът ще създаде файловия файл, който ще съдържа DEF файл, съответстващ на DLL, който генерира линкер. Този DEF файл (който трябва да се нарича ".def") може да се използва за създаване на библиотека за импортиране с "dlltool" или може да бъде използвана като справка за автоматично или имплицитно експортирани символи.

- изчерпателен файл

Линкерът ще създаде файловия файл, който ще съдържа импорт на библиотека, съответстващ на DLL, който генерира линкерът. Този внос lib (който може да се нарече "* .dll.a" или "* .a") може да се използва за свързване на клиенти с генерирания DLL; това поведение дава възможност за пропускане на отделна стъпка за създаване на библиотека за импортиране на "dlltool".

--enable-авто-образ-база

Автоматично да се избере базата на изображенията за DLL, освен ако не е посочена с помощта на аргумента "--image-base". Чрез използването на хеш, генериран от dllname, за създаване на уникални бази на изображения за всеки DLL, се избягват сблъсъци и премествания в паметта, които могат да забавят изпълнението на програмата.

--disable-авто-образ-база

Не създавайте автоматично уникална база от изображения. Ако няма базирана на потребителя база данни ("--image-base"), използвайте стандартната платформа.

--dll-search-prefix string

Когато свързвате динамично с DLL без библиотека за импортиране, потърсете " .dll" вместо "lib .dll". Това поведение позволява лесно разграничаване между DLL, създадени за различните подплатформи: роден, cygwin, uwin, pw и т.н. Например cygwin DLL обикновено използват "--dll-search-prefix = cyg".

--enable-авто-внос

Направете сложно свързване на "_symbol" с "__imp__symbol" за DATA внос от DLL и създайте необходимите thunking символи при изграждането на импортните библиотеки с тези DATAexports. Това обикновено "просто работи", но понякога може да видите това съобщение:

"променливата" "не може да бъде автоматично внесена. Моля, прочетете документацията за" --ableable-auto-import "за подробности."

Това съобщение се получава, когато някои (под) изрази получават адрес, който в крайна сметка се дава от сумата от две константи (таблиците за импортиране на Win32 позволяват само един). В случаите, в които това може да се случи, се включват достъпи до полетата на членове на структурните променливи, внесени от DLL, както и използването на постоянен индекс в променлива от масива, внесена от DLL. Всяка многофункционална променлива (масиви, структури, дълги и т.н.) може да задейства това условие за грешка. Въпреки това, независимо от точния тип данни на неправилно изнесената променлива, ld винаги ще я открива, ще издава предупреждението и ще излезе.

Има няколко начина за справяне с тази трудност, независимо от вида данни на експортираната променлива:

Един от начините е да се използва --ableable-runtime-pseudo-reloc превключвател. Това оставя задачата да коригира референциите във вашия клиентски код за времеви интерфейс, така че този метод работи само когато средата на изпълнение поддържа тази функция.

Второто решение е да принудим една от "константите" да бъде променлива, т.е. неизвестна и не-оптимизираща се при компилирането. За масивите има две възможности: а) да направи индекса (адреса на масива) променлива, или б) да направи променливата "постоянен" индекс. По този начин:

външен тип external_array []; external_array [1] -> {променлив тип * t = външен_рей; t [1]}

или

външен тип external_array []; external_array [1] -> {volatile int t = 1; external_array [t]}

За структурите (и повечето други многоезични типове данни) единствената възможност е да се направи самата структура (или дългата дълга или ...) променлива:

външна структура s extern_struct; external_struct.field -> {volatile структура s * t = & extern_struct; t-> поле}

или

външен дълга дължина external_ll; external_ll -> {volatile long long * local_ll = & extern_ll; * local_ll}

Третият начин за справяне с тази трудност е да се откаже от "автоматично импортиране" за символа на нарушението и да се маркира с "__declspec (dllimport)". На практика това изисква използването на #defines за компилиране, за да се посочи дали създавате DLL, изграждате клиентски код, който ще се свърже с DLL или просто изграждане / свързване със статична библиотека. При избора между различните методи за разрешаване на проблема с "директния адрес с постоянен компенсиран", трябва да обмислите типичното използване в реалния свят:

Оригинал:

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

Решение 1:

--foo.h външно int arr []; --foo.c #include "foo.h" void main (int argc, char ** argv) {/ * Това решение е за win32 и cygwin; не "оптимизирате" * / променливата int * parr = arr; ФОРМАТ ( "% г \ п", на Parr [1]); }

Решение 2:

--foo.h / * Забележка: се предполага автоматично експортиране (не __declspec (dllexport)) * / #if (дефинирано (_WIN32) || дефинирано (__ CYGWIN__)) && \! (дефинирано (FOO_BUILD_DLL) )) #define FOO_IMPORT __declspec (dllimport) #else #define FOO_IMPORT #endif външен FOO_IMPORT int arr []; --foo.c #include "foo.h" void main (int argc, char ** argv) {printf ("% d \ n", arr [1]); }

Четвърти начин за избягване на този проблем е да кодирате повторно библиотеката си, за да използвате функционален интерфейс, а не интерфейс за данни за функцията на променливите (например set_foo () и get_foo () accessor).

--disable-авто-внос

Не се опитвайте да правите софистично свързване на "_symbol" с "__imp__symbol" за DATAimports от DLL.

--enable-изпълнение-псевдо-reloc

Ако вашият код съдържа изрази, описани в секцията --enable-auto-import, т.е. DATAimports от DLL с ненулев офсетов, този превключвател ще създаде вектор на "runtime pseudo relocations", който може да се използва от средата на време за изпълнение, за да коригира референциите към тези данни във вашия клиентски код.

--disable-изпълнение-псевдо-reloc

Не създавайте псевдо премествания за ненулев офсетен DATA внос от DLL. Това е по подразбиране.

--enable-екстра-PE-отстраняване на грешки

Показване на допълнителна информация за отстраняване на грешки, свързана с thunking на символите за автоматично импортиране.

--section-подравняване

Задава подравняването на секцията. Разделите в паметта винаги започват от адресите, които са множество от този номер. По подразбиране е 0x1000.

- резервен склад

- резервирайте , задръжте

Посочете размера на паметта, която да резервирате (и по желание да извършите), която да се използва като стека за тази програма. Стандартът е 2Mb резервиран, 4K ангажиран.

- подсистемата, която

- подсистема, която : голяма

- подсистема, която : голяма . незначителен

Определя подсистемата, под която програмата ще изпълнява. Правните стойности, за които са "местни", "прозорци", "конзола" и "posix". Можете да зададете и варианта на подсистемата.

Важно: Използвайте командата човек ( % man ), за да видите как се използва команда на вашия компютър.