Příkazy Linux / Unix: Id

NÁZEV

ld - pomocí LD , GNU linker

SYNOPSE

ld [ možnosti ] objfile ...

POPIS

ld kombinuje řadu objektových a archivních souborů , přemístí jejich data a odkazy symbolů. Obvykle je posledním krokem při sestavování programu spuštění ld .

ld přijímá jazykové soubory příkazového řádku Linker napsané v nadpisu syntaxe příkazového jazyka příkazového editoru AT & T, které poskytuje explicitní a úplnou kontrolu nad procesem propojení.

Tato stránka mana nepopisuje příkazový jazyk; viz položka ld v "info" nebo v příručce ld: linker GNU , kde naleznete úplné informace o příkazovém jazyce a dalších aspektech linkeru GNU.

Tato verze ld používá knihovny BFD pro všeobecné použití pro práci s objekty. To umožňuje ld číst, kombinovat a psát objektové soubory v mnoha různých formátech - například COFF nebo "a.out". Různé formáty mohou být propojeny dohromady pro vytvoření jakéhokoli dostupného souboru objektů.

Kromě flexibilnosti je GNU linker užitečnější než jiné linkery při poskytování diagnostických informací. Mnoho linkerů opustí popravu okamžitě poté, co došlo k chybě; kdykoli je to možné, ld pokračuje v provádění, což umožňuje identifikovat další chyby (nebo v některých případech získat výstupní soubor i přes chybu).

GNU linker ld je určen k pokrytí širokého spektra situací a co nejblíže k ostatním linkerům. V důsledku toho máte mnoho možností, jak ovládat své chování.

MOŽNOSTI

Linker podporuje celou řadu možností příkazového řádku , ale ve skutečnosti se málo z nich používá v jakémkoli konkrétním kontextu. Například častým používáním ld je propojení standardních objektů Unix s standardním podporovaným systémem Unix . Na takovém systému propojit soubor "hello.o":

ld -o /lib/crt0.o hello.o -lc

To řekne ld, aby vytvořil soubor nazvaný výstup jako výsledek propojení souboru "/lib/crt0.o" s "hello.o" a knihovny "libc.a", která bude pocházet ze standardních vyhledávacích adresářů. (Viz diskuse o volbě -l níže.)

Některé možnosti příkazového řádku na ld mohou být zadány v libovolném okamžiku příkazového řádku. Možnosti, které se vztahují k souborům, například -l nebo -T , způsobují, že soubor bude čten v místě, kde se tato možnost zobrazí v příkazovém řádku vzhledem k souborům objektů a dalším možnostem souborů. Opakování volby, které nejsou součástí souboru, s jiným argumentem, nebudou mít žádný další účinek, ani nepřepisují předchozí výskyty (ty, které jsou dále vlevo na příkazovém řádku) této možnosti. Možnosti, které mohou být významně specifikovány více než jednou, jsou uvedeny v popisu níže.

Argumenty bez možnosti jsou soubory objektů nebo archivy, které mají být propojeny. Mohou následovat, předcházet nebo být smíchány s volbami příkazového řádku, kromě toho, že mezi volbou a jeho argumentem nesmí být umístěn argument objektu.

Obvykle je odkazovač vyvolán alespoň jedním objektem, ale můžete zadat jiné formy binárních vstupních souborů pomocí příkazů -l , -R a příkazového jazyka skriptu. Pokud nejsou zadány žádné binární vstupní soubory, linker nevytváří žádný výstup a vydá zprávu No No input files .

Pokud linker nerozpozná formát souboru objektu, předpokládá, že jde o linkerový skript. Takto zadaný skript rozšiřuje hlavní linkerový skript používaný pro odkaz (buď výchozí skript propojovacího propojovacího skriptu nebo ten, který je specifikován pomocí -T ). Tato funkce dovoluje spojovacímu prvku propojit soubor, který se jeví jako objekt nebo archiv, ale ve skutečnosti pouze definuje některé hodnoty symbolů nebo používá "INPUT" nebo "GROUP" pro načtení dalších objektů. Všimněte si, že zadání skriptu tímto způsobem pouze doplňuje hlavní skript linkeru; použijte volbu -T, chcete-li úplně nahradit výchozí skript odkazovače.

U voleb, jejichž jména jsou jediné písmeno, musí být argumenty možností buď následovány písmenem volby bez mezery, nebo mohou být uvedeny jako samostatné argumenty bezprostředně po volbě, která je vyžaduje.

U voleb, jejichž jména jsou více písmen, může předcházet název možnosti buď jedna pomlčka nebo dvě; například -trace-symbol a -trace-symbol jsou ekvivalentní. Poznámka - existuje jedna výjimka z tohoto pravidla. Možnosti více písmen, které začínají písmenem "o", lze předcházet pouze dvěma pomlčkami. Toto je omezit zmatek s volbou -o . Například -omagický nastavuje název výstupního souboru na magickou, zatímco --omagic nastavuje příznak NMAGIC na výstupu.

Argumenty pro vícepísmenové volby musí být buď odděleny od názvu možnosti znakem rovnosti, nebo mohou být uvedeny jako samostatné argumenty bezprostředně po volbě, která je vyžaduje. Například --trace-symbol foo a -trace-symbol = foo jsou ekvivalentní. Používají se jedinečné zkratky názvů několika písmen.

Poznámka: pokud je linker vyvolán nepřímo přes ovladač kompilátoru (např. Gcc ), pak by všechny volby příkazového řádku linkeru měly být předpony pomocí -Wl, (nebo co je vhodné pro konkrétní ovladač kompilátoru) takto:

gcc -Wl, - startgroup foo.o bar.o -Wl, - endgroup

To je důležité, protože v opačném případě program řidiče kompilátoru může klidně spustit volbu linkeru, což má za následek špatný odkaz.

Zde je tabulka generických přepínačů příkazového řádku přijatých linkerem GNU:

klíčové slovo

Tato možnost je podporována pro kompatibilitu s HP / UX. Argument pro klíčové slovo musí být jeden z archivů řetězce , sdílený nebo výchozí . -aarchive je funkčně ekvivalentní s -Bstatic , a další dvě klíčová slova jsou funkčně ekvivalentní k -Bodynamic . Tato volba může být použita několikrát.

- Architektura

--architecture = architektura

V současném vydání ld je tato volba užitečná pouze pro architekturu rodiny Intel 960. V této konfiguraci ld argument architektury identifikuje konkrétní architekturu rodiny 960, což umožňuje některé bezpečnostní prvky a upravuje vyhledávací cestu knihovny archivu.

Budoucí verze programu ld mohou podporovat podobné funkce pro jiné rodiny architektur.

-b vstupní formát

- formát = vstupní formát

ld může být nakonfigurován tak, aby podporoval více než jeden typ souboru objektu. Pokud je vaše ld nakonfigurováno tímto způsobem, můžete použít volbu -b pro zadání binárního formátu souborů vstupních objektů, které se podle této možnosti na příkazovém řádku zobrazují. Dokonce i když je ld nakonfigurován tak, aby podporoval formáty alternativních objektů, obvykle to není nutné specifikovat, protože ld by měl být konfigurován tak, aby očekával jako výchozí vstupní formát nejběžnější formát na každém stroji. vstupní formát je textový řetězec, název určitého formátu podporovaného knihovnami BFD. (Dostupné binární formáty můžete zobrazit pomocí příkazu objdump -i .)

Tuto možnost můžete použít, pokud propojíte soubory s neobvyklým binárním formátem. Můžete také použít -b k přepínání formátů explicitně (při propojení objektových souborů různých formátů) tím, že před každou skupinou objektových souborů v určitém formátu obsahuje formát vstupu -b .

Výchozí formát je převzat z proměnné prostředí "GNUTARGET".

Můžete také definovat vstupní formát ze skriptu pomocí příkazu "TARGET";

-c MRI-commandfile

--mri-script = MRI-příkazový soubor

Pro kompatibilitu s linkery vytvořenými pomocí MRI, ld přijímá soubory skriptu napsané v alternativním, omezeném příkazovém jazyce popsaném v části Dokumenty GNU ld MRI Compatible Script Files. Vložte soubory skriptu MRI s volbou -c ; použijte volbu -T pro spouštění linkerových skriptů napsaných ve skriptovacím jazyce obecného určení. Pokud MRI-cmdfile neexistuje, ld ji vyhledá v adresářích určených libovolnými možnostmi -L .

-d

-DC

-dp

Tyto tři možnosti jsou ekvivalentní; pro kompatibilitu s ostatními linkery jsou podporovány více formulářů. Přiřazují prostor běžným symbolům, i když je určen přesunovatelný výstupní soubor (s -r ). Příkaz skriptu "FORCE_COMMON_ALLOCATION" má stejný účinek.

-e vstup

--entry = vstup

Použijte položku jako explicitní symbol pro počáteční spuštění vašeho programu spíše než výchozí vstupní bod. Pokud neexistuje symbol pojmenovaný záznam , linker se pokusí analyzovat záznam jako číslo a použije jako vstupní adresu (číslo bude interpretováno v základně 10, můžete použít přední 0x pro základnu 16 nebo vedoucí 0 pro základnu 8).

-E

--exportně dynamická

Při vytváření dynamicky propojeného spustitelného souboru přidejte všechny symboly do tabulky dynamických symbolů. Tabulka dynamických symbolů je množina symbolů, které jsou viditelné z dynamických objektů při běhu.

Pokud tuto možnost nepoužíváte, tabulka dynamických symbolů bude normálně obsahovat pouze ty symboly, na které odkazuje nějaký dynamický objekt uvedený v odkazu.

Pokud použijete "dlopen" k načtení dynamického objektu, který potřebuje odkazovat zpět na symboly definované programem, spíše než nějaký jiný dynamický objekt, pravděpodobně budete muset použít tuto možnost při propojení samotného programu.

Pomocí skriptu verze můžete také ovládat, jaké symboly by měly být přidány do tabulky dynamických symbolů, pokud to podporuje výstupní formát. Viz popis --version-script v @ ref {VERSION}.

-EB

Spojte velké objekty. To ovlivňuje výchozí formát výstupu.

-EL

Spojte malé endiánské objekty. To ovlivňuje výchozí formát výstupu.

-F

- pomocné jméno

Při vytváření sdíleného objektu ELF nastavte interní pole DT_AUXILIARY na zadaný název. To informuje dynamický linker, že tabulka symbolů sdíleného objektu by měla být použita jako pomocný filtr na tabulce symbolů názvu sdíleného objektu.

Pokud později propojíte program s tímto objektem filtru, při spuštění programu se dynamickým linkerem zobrazí pole DT_AUXILIARY. Pokud dynamický linker vyřeší nějaké symboly z objektu filtru, nejprve zkontroluje, zda existuje název sdíleného objektu. Pokud existuje, použije se namísto definice ve filtrovacím objektu. Název sdíleného objektu nemusí existovat. Název sdíleného objektu tedy může být použit k zajištění alternativní implementace určitých funkcí, snad pro ladění nebo pro specifický výkon stroje.

Tuto možnost lze zadat více než jednou. Položky DT_AUXILIARY budou vytvořeny v pořadí, ve kterém se objeví na příkazovém řádku.

-F název

- jméno filtru

Při vytváření sdíleného objektu ELF nastavte interní pole DT_FILTER na zadaný název. To informuje dynamický linker, že tabulka symbolů sdíleného objektu, který se vytváří, by měla být použita jako filtr na tabulce symbolů názvu sdíleného objektu.

Pokud později propojíte program s tímto objektem filtru, při spuštění programu se dynamickým linkerem zobrazí pole DT_FILTER. Dynamický linker vyřeší symboly podle tabulky symbolů objektu filtru jako obvykle, ale ve skutečnosti bude odkazovat na definice nalezené ve sdíleném názvu objektu. Objekt filtru lze tedy použít k výběru podmnožiny symbolů poskytnutých názvem objektu.

Někteří starší odkazující používali volbu -F v celé kompilační sadě nástrojů pro zadání formátu objektového souboru pro vstupní i výstupní objektové soubory. GNU linker používá pro tento účel další mechanismy: volby -b , -format , -format , příkaz "TARGET" v linkerových skriptech a proměnná prostředí "GNUTARGET". GNU linker ignoruje volbu -F, když nevytvoří sdílený objekt ELF.

-fini jméno

Při vytváření spustitelného nebo sdíleného objektu ELF volejte NAME, když je spustitelný nebo sdílený objekt uvolněn, nastavením DT_FINI na adresu funkce. Ve výchozím nastavení odkazovač používá funkci "_fini" jako funkci volání.

-G

Ignorováno. Za předpokladu kompatibility s jinými nástroji.

-G hodnota

--gpsize = hodnota

Nastavte maximální velikost objektů, které chcete optimalizovat, pomocí velikosti registru GP. To je smysluplné pouze pro formáty objektových souborů, jako je MIPS ECOFF, který podporuje umístění velkých a malých objektů do různých sekcí. Toto je ignorováno pro jiné formáty souborů objektů.

-h jméno

-soname = jméno

Při vytváření sdíleného objektu ELF nastavte interní pole DT_SONAME na zadaný název. Když je spustitelný soubor spojen se sdíleným objektem, který má pole DT_SONAME, pak se po spuštění spustitelného souboru dynamický linker pokusí načíst sdílený objekt zadaný pomocí pole DT_SONAME namísto použití názvu souboru daného linkeru.

-i

Proveďte přírůstkové spojení (stejně jako možnost -r ).

-init jméno

Při vytváření spustitelného nebo sdíleného objektu ELF zavolejte NAME, když je zaveden spustitelný nebo sdílený objekt, nastavením DT_INIT na adresu funkce. Ve výchozím nastavení odkazovač používá jako volání funkci "_init".

-l archiv

--library = archiv

Přidejte archiv archivních souborů do seznamu souborů, které chcete propojit. Tato volba může být použita několikrát. ld prohledá seznam svých cest pro výskyty "libarchive.a" pro každý zadaný archiv .

Na systémech, které podporují sdílené knihovny, může ld hledat také knihovny s rozšířeními jinými než ".a". Konkrétně, na systémech ELF a SunOS, ld vyhledá adresář knihovny s příponou ".so" před vyhledáním adresáře s příponou ".a". Podle konvence označuje rozšíření ".so" sdílenou knihovnu.

Linker vyhledá archiv pouze jednou, na místě, kde je zadán na příkazovém řádku. Pokud archív definuje symbol, který nebyl definován v nějakém objektu, který se objevil před archivem na příkazovém řádku, linker bude obsahovat příslušné soubory z archivu. Avšak nedefinovaný symbol v objektu, který se objeví později na příkazovém řádku, nezpůsobí, že linker znovu vyhledá archiv.

Podívejte se na možnost - ( možnost, jak přinutit odkazovač několikrát vyhledávat archivy.

Stejný archiv můžete listovat vícekrát na příkazovém řádku.

Tento typ vyhledávání archivů je pro unixové linkery standardní. Pokud používáte ld onAIX, všimněte si, že se liší od chování linkeru AIX.

-L searchdir

--library-path = searchdir

Přidat path searchdir do seznamu cest, které ld vyhledá knihovny archivu a ld řídicí skripty. Tuto možnost můžete použít několikrát. Adresáře jsou prohledávány v pořadí, ve kterém jsou zadány na příkazovém řádku. Adresáře zadané na příkazovém řádku jsou prohledávány před výchozími adresáři. Všechny možnosti -L se vztahují na všechny možnosti -l bez ohledu na pořadí, ve kterém se objevují možnosti.

Pokud vyhledávací prvek začíná znakem "=", pak bude "=" nahrazeno předponou sysroot , kterou jste zadali při nakonfigurování linkeru.

Výchozí sada hledaných cest (bez zadání s -L ) závisí na tom, který emulační režim ld používá, a v některých případech také na tom, jak byl konfigurován.

Cesta může být také zadána ve skriptu odkazu s příkazem "SEARCH_DIR". Adresáře zadané tímto způsobem jsou vyhledávány v místě, kde se v příkazovém řádku objeví skript propojení.

-m emulace

Emulace spojovacího prvku emulace . Můžete uvést dostupné emulace pomocí volby --verbose nebo -V .

Pokud se volba -m nepoužívá, emulace je převzata z proměnné prostředí "LDEMULATION", pokud je definována.

V opačném případě výchozí emulace závisí na tom, jak byl nakonfigurován linker.

-M

--print-map

Vytiskněte mapu odkazů na standardní výstup. Mapa odkazů obsahuje informace o tomto odkazu, včetně následujících:

* * *

Kde jsou soubory souborů a symboly mapovány do paměti.

* * *

Jak jsou přiděleny běžné symboly.

* * *

Do tohoto odkazu byli zařazeni všichni členové archivu se zmínkou o symbolu, který způsobil, že byl archivář vložen.

-n

--nmagický

Vypněte zarovnání stránek a označte výstup jako "NMAGIC" pokud je to možné.

-N

--omagický

Nastavte textové a datové sekce, aby byly čitelné a zapisovatelné. Nezapomeňte také na segment datových segmentů a zakázat propojení se sdílenými knihovnami. Pokud výstupní formát podporuje unixové magické čísla, označte výstup jako "OMAGIC".

- neomagický

Tato možnost vylučuje většinu účinků možnosti -N . Nastaví textový oddíl tak, aby byl pouze pro čtení, a nutí datový segment, aby byl zarovnán na stránku. Poznámka - tato možnost neumožňuje propojení se sdílenými knihovnami. Použijte -Bodynamic pro toto.

-o výstup

- výstup = výstup

Použijte výstup jako název programu vytvořeného ld ; pokud tato možnost není zadána, použije se výchozí název a.out . Příkaz skriptu "OUTPUT" může také zadat název výstupního souboru.

-O úroveň

Pokud je úroveň číselných hodnot větší než nula ld, optimalizuje výstup. To může trvat podstatně déle, a proto by pravděpodobně mělo být povoleno pouze pro poslední binární.

-q

--emit-relocs

Ponechat oddíly a obsah přemístění v plně propojených exececutables. Analýza odkazů a nástroje pro optimalizaci odkazu mohou tyto informace potřebovat, aby provedly správné úpravy spustitelných souborů. Výsledkem jsou větší spustitelné soubory.

Tato možnost je v současné době podporována pouze na platformách ELF.

-r

- lze vyměnit

Vygenerujte přemístitelný výstup --- tj. Vygenerujte výstupní soubor, který může následně sloužit jako vstup do ld . Toto se často nazývá částečné propojení . Jako vedlejší efekt v prostředích podporujících standardní magické čísla Unixu tato možnost také nastavuje magické číslo výstupního souboru na hodnotu "OMAGIC". Není-li tato možnost zadána, vytvoří se absolutní soubor. Při propojení programů C ++ tato možnost nevyřeší odkazy na konstruktory; k tomu použijte -Ur .

Pokud vstupní soubor nemá stejný formát jako výstupní soubor, částečné propojení je podporováno pouze v případě, že tento vstupní soubor neobsahuje žádné přemístění. Různé výstupní formáty mohou mít další omezení; například některé formáty založené na "a.out" nepodporují částečné propojení se vstupními soubory v jiných formátech vůbec.

Tato volba dělá totéž jako -i .

-R název souboru

- just-symbols = název souboru

Přečtěte si názvy symbolů a jejich adresy z názvu souboru , ale nepřevádějte jej ani jej nezahrnujte do výstupu. To umožňuje, aby váš výstupní soubor symbolicky odkazoval na absolutní umístění paměti definované v jiných programech. Tuto možnost můžete použít více než jednou.

Pro kompatibilitu s ostatními linkery ELF, pokud je za volbou -R následováno jméno adresáře, nikoli název souboru, bude se jednat o volbu -rath .

-s

-strip-vše

Vynechat všechny informace o symbolu z výstupního souboru.

-S

-strip-ladění

Vynechat informace o symbolovém ladění (ale ne všechny symboly) z výstupního souboru.

-t

--stopa

Vytiskněte jména vstupních souborů, jak je zpracovává ld .

-T scriptfile

--script = scriptfile

Použijte soubor scriptfile jako odkazovací skript. Tento skript nahrazuje výchozí skript linkeru ld (spíše než jeho přidání), takže příkazový soubor musí specifikovat vše potřebné k popisu výstupního souboru. Pokud soubor scriptfile neexistuje v aktuálním adresáři, vyhledá to "ld" v adresářích zadaných libovolnými předcházejícími možnostmi -L . Několik možností -T se hromadí.

-u symbol

--undefined = symbol

Symbol síly je třeba zadat do výstupního souboru jako nedefinovaný symbol. K tomu může například spouštět propojení dalších modulů ze standardních knihoven. -u lze opakovat s různými argumenty možností pro zadání dalších nedefinovaných symbolů. Tato volba je ekvivalentní příkazu "EXTERN" linker script.

-Ur

Pro cokoli jiného než programy C ++ je tato volba ekvivalentní s -r : generuje přemístitelný výstup --- tj. Výstupní soubor, který může následně sloužit jako vstup do ld . Při propojení programů C ++ -Ur nerozpozná odkazy na konstruktory, na rozdíl od -r . Nepoužívá -Ur v souborech, které byly propojeny s -Ur ; jakmile byla konstruktorová tabulka postavena, nelze ji přidat. Použijte -Ur pouze pro poslední dílčí odkaz a -r pro ostatní.

--unique [= SECTION ]

Vytvoří samostatnou výstupní sekci pro každou vstupní sekci odpovídající sekci SECTION nebo pokud chybí volitelný argument SECTION wildcard pro každou sekci vstupu. Osiřelý úsek není jednoznačně uveden v skriptu linkeru. Tuto možnost můžete použít několikrát na příkazovém řádku. Zabraňuje normální slučování vstupních úseků se stejným názvem, které mají přepsané přiřazení úseků výstupu v skriptu propojky.

-proti

--verze

-PROTI

Zobrazte číslo verze pro ld . Volba -V také uvádí seznam podporovaných emulací.

-X

-diskard-vše

Smazat všechny místní symboly.

-X

- místní obyvatelé

Smazat všechny dočasné místní symboly. Pro většinu cílů jsou to všechny lokální symboly, jejichž jména začínají písmeny L.

-y symbol

--trace-symbol = symbol

Vytiskněte název každého propojeného souboru, ve kterém se objeví symbol . Tato možnost může být zadána libovolným počtem. Na mnoha systémech je nutné předcházet podtržítko.

Tato volba je užitečná, pokud máte ve svém odkazu neurčený symbol, ale nevíte, odkud odkaz pochází.

-Y cesta

Přidat cestu k výchozí cestě hledání knihovny. Tato možnost existuje pro kompatibilitu Solaris.

-z klíčové slovo

Uznávané klíčová slova jsou "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "now", " ". Ostatní ostatní klíčová slova jsou ignorována pro kompatibilitu Solaris. "initfirst" označuje objekt, který má být inicializován nejprve za běhu před jinými objekty. "interpose" označuje objekt, který se v tabulce symbolů vkládá před všechny symboly, ale primární spustitelný soubor. "loadfltr" označuje objekt, který má být zpracováván okamžitě během běhu. "nodefaultlib" označuje objekt, který bude ignorovat hledání závislostí tohoto objektu všechny výchozí cesty hledání knihovny. "nodelete" označuje, že objekt by neměl být za běhu vykládán. "nodlopen" označuje objekt, který není k dispozici pro "dlopen". "nodump" označuje, že objekt nemůže být vyhozen do "dldump". "nyní" označí objekt s ne-lazy runtime vazba. "původ" označuje objekt může obsahovat $ ORIGIN. "defs" nepovoluje nedefinované symboly. "muldefs" umožňuje několik definic. "combreloc" kombinuje více úseků přesunu a třídí je tak, aby bylo možné provést ukládání dynamických symbolů do mezipaměti.

"nocombreloc" zabraňuje kombinování více částí přemístění. "nocopyreloc" zabraňuje výrobě kopírování.

- ( archivy -)

- archiv skupiny start-end-group

Archivy by měly obsahovat seznam archivních souborů . Mohou to být buď explicitní názvy souborů nebo volby -l .

Zadané archivy jsou opakovaně prohledávány, dokud nebudou vytvořeny žádné nové nedefinované odkazy. Obvykle je archiv vyhledáván pouze jednou v pořadí, které je zadáno na příkazovém řádku. Pokud je v tomto archivu potřebný symbol pro vyřešení nedefinovaného symbolu, na který odkazuje objekt v archivu, který se objeví později na příkazovém řádku, linker by tento odkaz neuměl vyřešit. Seskupením archivů se všichni opakovaně prohledávají, dokud nebudou vyřešeny všechny možné odkazy.

Použití této možnosti má významné výkonnostní náklady. Nejlépe je použít pouze tehdy, když existují nevyhnutelné kruhové odkazy mezi dvěma nebo více archivy.

--accept-unknown-input-arch

--no-přijmout-neznámý-vstup-arch

Řekne linkeru, aby přijímal vstupní soubory, jejichž architektura nemůže být rozpoznána. Předpokladem je, že uživatel ví, co dělají, a záměrně chce propojit tyto neznámé vstupní soubory. Toto bylo výchozí chování linkeru před vydáním verze 2.14. Výchozím chováním z vydání verze 2.14 je odmítnutí takových vstupních souborů a tak byla přidána možnost -accept-unknown-input-arch pro obnovení starého chování.

- klíčové slovo

Tato možnost je ignorována pro kompatibilitu SunOS .

-Bdynamický

-dy

-call_shared

Spojení s dynamickými knihovnami. To má smysl pouze na platformách, pro které jsou podporovány sdílené knihovny . Tato možnost je zpravidla standardní pro takové platformy. Různé varianty této možnosti jsou kompatibilní s různými systémy. Tuto volbu můžete použít několikrát na příkazovém řádku: ovlivňuje vyhledávání knihovny pro volby -l, které ji následují.

-Bgroup

Nastavte příznak "DF_1_GROUP" v položce "DT_FLAGS_1" v dynamické části. To způsobí, že spojovací modul runtime zpracovává vyhledávání v tomto objektu a jeho závislosti je třeba provést pouze uvnitř skupiny. --no-nedefinováno je implicitní. Tato volba má smysl pouze na platformách ELF, které podporují sdílené knihovny .

-Bstatic

-dn

-non_shared

-statický

Nepřipojujte se ke sdíleným knihovnám. To má smysl pouze na platformách, pro které jsou podporovány sdílené knihovny. Různé varianty této možnosti jsou kompatibilní s různými systémy. Tuto volbu můžete použít několikrát na příkazovém řádku: ovlivňuje vyhledávání knihovny pro volby -l, které ji následují.

-Bsymbolický

Při vytváření sdílené knihovny vázat odkazy na globální symboly definici v rámci sdílené knihovny, pokud existuje. Obvykle je možné, že program propojený se sdílenou knihovnou přepsá definici v rámci sdílené knihovny. Tato možnost má smysl pouze na platformách ELFplatform, které podporují sdílené knihovny.

- kontrolní sekce

- nekontrolovat sekce

Požádá linker , aby nekontroloval adresy sekcí po přiřazení, aby zjistil, zda nedošlo k překrývání. Normálně linker provede tuto kontrolu a pokud zjistí nějaké překrytí, vytvoří vhodné chybové zprávy. Linker o tom ví a upravuje sekce v překryvných vrstvách. Výchozí chování lze obnovit pomocí přepínače příkazového řádku -check-sections .

--cref

Vyjměte tabulku křížových odkazů. Je-li generován soubor mapovacího odkazovače, křížová tabulka se vytiskne do souboru mapy. Jinak se tiskne na standardní výstup.

Formát tabulky je úmyslně jednoduchý, takže může být v případě potřeby snadno zpracován skriptem. Symboly jsou vytištěny, seřazeny podle názvu. U každého symbolu je uveden seznam názvů souborů. Pokud je definován symbol, první uvedený soubor je umístění definice. Zbývající soubory obsahují odkazy na symbol.

--no-define-common

Tato volba zabraňuje přiřazení adres k běžným symbolům. Příkaz skriptu "INHIBIT_COMMON_ALLOCATION" má stejný účinek.

Možnost --no-define-common umožňuje oddělit rozhodnutí přiřazení adres k běžným symbolům z výběru typu výstupního souboru; jinak nepřevoditelný typ výstupu přenáší adresy na běžné symboly. Použití --no-define-common umožňuje, aby společné symboly, které jsou odkazovány ze sdílené knihovny, byly přiřazeny adresám pouze v hlavním programu. To eliminuje nepoužívaný duplicitní prostor ve sdílené knihovně a také zabraňuje jakémukoli možnému zmatku nad vyřešením nesprávného dupliku, pokud existuje mnoho dynamických modulů se specializovanými vyhledávacími cestami pro rozlišení symbolu běhu.

--defsym symbol = výraz

Vytvořte globální symbol ve výstupním souboru obsahujícím absolutní adresu danou výrazem . Tuto možnost můžete použít tolikrát, kolikrát je potřeba pro definování více symbolů v příkazovém řádku. Pro výraz v tomto kontextu je podporována omezená forma aritmetiky: můžete zadat hexadecimální konstantu nebo název existujícího symbolu nebo použít "+" a "-" pro přidání nebo odečítání hexadecimálních konstant nebo symbolů. Pokud potřebujete mnohem propracovanější výrazy, zvažte použití příkazového jazyka linkeru ze skriptu. Poznámka: mezi symbolem , znakem rovná (`` = '') a výrazem nesmí být žádný bílý prostor.

--demangle [= style ]

--no-odizolování

Tyto možnosti určují, zda chcete v chybových zprávách a jiných výstupech odstranit názvy symbolů. Když je spojovací prvek přeměněn, snaží se prezentovat názvy symbolů čitelným způsobem: prolistuje vedoucí podtržítka, pokud jsou používány ve formátu souboru objektu, a převede názvy symbolů C ++ do uživatelsky čitelných názvů. Různí kompilátoři mají různé styly. Volitelný argument stylu vyměnitelnosti lze použít pro výběr vhodného stylu vyměnitelnosti pro kompilátor. Spojovací prvek bude výchozí, pokud není nastavena proměnná prostředí COLLECT_NO_DEMANGLE . Tyto možnosti lze použít k přepsání výchozího nastavení.

--dynamický linker

Nastavte název dynamického linkeru. To má smysl pouze při generování dynamicky spřažených spustitelných souborů ELF. Výchozí dynamický linker je normálně správný; nepoužívejte to, pokud nevíte, co děláte.

- vložené-přemístit

Tato volba je smysluplná pouze tehdy, když propojíte MIPS vložený PIC kód generovaný volbou -membedded-pic na kompilátor a assembler GNU. Způsobí, že linker vytvoří tabulku, která může být použita při běhu k přemístění všech dat, které byly staticky inicializovány na hodnoty ukazatele. Podrobné informace naleznete v kódu testsuite / ld-empic.

- varování před smrtí

Všechny varování považujte za chyby .

- force-exe-suffix

Ujistěte se, že výstupní soubor má příponu .exe.

Pokud úspěšně sestavený plně propojený výstupní soubor nemá příponu " .exe " nebo " .dll ", tato možnost nucuje linkeru zkopírovat výstupní soubor na jeden stejný název s příponou ".exe". Tato volba je užitečná při použití nemodifikovaných makefile Unix na hostiteli systému Microsoft Windows, protože některé verze systému Windows nebudou zobrazovat obraz, dokud se nezobrazí přípona ".exe".

--no-gc-sekce

--gc-sekce

Povolit sběr nepotřebných vstupních úseků. Je ignorována na cílech, které tuto možnost nepodporují. Tato volba není kompatibilní s parametrem -r , ani s dynamickým propojením. Výchozí chování (nevykonání této sbírky odpadků ) lze obnovit zadáním --no-gc-sections na příkazovém řádku.

--Pomoc

Vytiskněte souhrn možností příkazového řádku na standardní výstup a výstup.

--Target-help

Vytiskněte shrnutí všech možností pro konkrétní cíl na standardním výstupu a výstupu.

-Map mapový soubor

Vytiskněte mapu odkazů na soubor mapového souboru. Viz popis výše uvedené možnosti -M .

--no-uchovat-paměť

ld normálně optimalizuje rychlost při využití paměti tím, že ukládá tabulky symbolů vstupních souborů do paměti. Tato volba informuje, že ld místo toho optimalizuje využití paměti, tím, že podle potřeby přeformuluje tabulky symbolů. To může být nutné, pokud ld vyčerpá paměťový prostor při propojení velkého spustitelného souboru.

--no-nedefinováno

-z defs

Normálně při vytváření ne-symbolické sdílené knihovny jsou povoleny nedefinované symboly, které lze vyřešit načítacím modulem runtime. Tyto volby nepovolují takové nedefinované symboly.

--allow-multiple-definition

-z muldefs

Normálně, když je symbol definován vícekrát, odkazovač hlásí fatální chybu. Tyto možnosti umožňují několik definic a použije se první definice.

--allow-shlib-nedefinováno

Povolit nedefinované symboly ve sdílených objektech, i když je nastaveno --no-undefined. Výsledkem bude, že nedefinované symboly v běžných objektech budou ještě vyvolávat chybu, ale nedefinované symboly ve sdílených objektech budou ignorovány. Implementace no_undefined předpokládá, že runtime linker se zmáčkne na nedefinované symboly. Existuje přinejmenším jeden systém (BeOS), kde jsou nedefinované symboly v sdílených knihovnách normální, jelikož je jádro opraví při načítání, aby se zvolila, která funkce je nejvhodnější pro aktuální architekturu. IE dynamicky zvolí příslušnou funkci memset. Zřejmě je také normální, že sdílené knihovny HPPA mají neurčené symboly.

--no-nedefinovaná verze

Normálně, pokud má symbol nedefinovanou verzi, odkazovač ji bude ignorovat. Tato volba nepovoluje symboly s nedefinovanou verzí a namísto toho bude vydána fatální chyba.

--no-varování-Neshoda

Obvykle se zobrazí chybová zpráva, pokud se pokusíte spojit vstupní soubory, které jsou z nějakého důvodu nesprávné, možná proto, že byly kompilovány pro různé procesory nebo pro různé endiannesses. Tato volba říká ld , že by tyto chyby měla povolit tiše. Tato možnost by měla být používána pouze opatrně, v případech, kdy jste podnikli nějaké zvláštní kroky, které zajistí, že chyby spojovacího řetězce jsou nevhodné.

--no-celý-archiv

Vypněte efekt volby - celá archivace pro následující archivní soubory.

--noinhibit-exec

Zachovat spustitelný výstupní soubor vždy, když je stále použitelný. Obvykle linker nebude produkovat výstupní soubor, pokud narazí na chyby během procesu propojení; opustí, aniž by psal výstupní soubor, když vydává jakoukoli chybu.

-nostdlib

Na příkazovém řádku explicitně zadávejte pouze adresáře knihovny vyhledávání. Adresáře knihovny zadané v skriptech linkeru (včetně linkerových skriptů zadaných na příkazovém řádku) jsou ignorovány.

- formát formátu výstupu

ld může být nakonfigurován tak, aby podporoval více než jeden typ souboru objektu. Pokud je vaše ld takto nakonfigurováno, můžete použít volbu --oformat pro zadání binárního formátu souboru výstupního objektu. Dokonce i když je ld nakonfigurován tak, aby podporoval formáty alternativních objektů, obvykle to nemusíte specifikovat, protože ld by měl být nakonfigurován tak, aby produkoval jako výchozí výstupní formát nejběžnější formát na každém stroji. výstupní formát je textový řetězec, název určitého formátu podporovaného knihovnami BFD. (Můžete uvést dostupné binární formáty pomocí příkazu objdump -i .) Příkaz skriptu "OUTPUT_FORMAT" může také specifikovat výstupní formát, ale tato volba ho přepíše.

-qmagic

Tato možnost je ignorována pro kompatibilitu s operačním systémem Linux.

-Qy

Tato možnost je ignorována pro kompatibilitu SVR4.

--odpočinout si

Možnost s efekty závislou na stroji. Tato možnost je podporována pouze u několika cílů.

Na některých platformách prověří volba --relax globální optimalizace, která se stanou možnými, když linker řeší adresování v programu, například uvolnění adresových režimů a syntetizování nových instrukcí v souboru výstupních objektů.

Na některých platformách mohou tyto globální optimalizace vazeb času způsobit, že symbolické ladění výsledného spustitelného souboru je nemožné. To je známo, že se jedná o řadu procesorů Matsushita MN10200 a MN10300.

Na platformách, kde to není podporováno, --relax je akceptován, ale ignorován.

--retain-symbols-file název souboru

Zachovat pouze symboly uvedené v souboru název souboru , vyřadit všechny ostatní. název souboru je jednoduše plochý soubor s jedním symbolem na každý řádek. Tato volba je užitečná zejména v prostředích (např. VxWorks), kde se postupně sbírá velká globální tabulka symbolů, aby se ušetřila paměť běhu.

--retain-symbols-file neodstraňuje nedefinované symboly nebo symboly potřebné pro přemístění.

V příkazovém řádku můžete pouze zadat --retain-symbols-file . Přepíše -s a -S .

-rpath dir

Přidejte adresář do cesty hledání knihovny. Toto se používá při propojení ELFexecutable se sdílenými objekty. Argumenty všech argumentů jsou zřetězeny a předány linkeru runtime, který je používá k vyhledání sdílených objektů za běhu. Možnost -rath je také použita při hledání sdílených objektů, které jsou potřebné pro sdílené objekty explicitně zahrnuté do odkazu; viz popis možnosti -path-link . Není-li cesta použita při propojení spustitelného souboru ELF, použije se obsah proměnné prostředí "LD_RUN_PATH", pokud je definován.

Možnost -rath může být také použita na SunOS. Ve výchozím nastavení na odkazu SunOS vytvoří linker nápovědu pro vyhledávání podle runtime ze všech možností -L, které jsou uvedeny. Je-li použita volba -rath , cesta hledání bude vytvořena výhradně pomocí volby -path , ignorovat volby -L . To může být užitečné při použití příkazu gcc, který přidává mnoho možností -L, které mohou být připojeny na souborových systémech NFS.

Pro kompatibilitu s ostatními linkery ELF, pokud je za volbou -R následováno jméno adresáře, nikoli název souboru, bude se jednat o volbu -rath .

-rpath-link DIR

Pokud používáte ELF nebo SunOS, může jedna sdílená knihovna vyžadovat další. K tomu dochází, když odkaz "ld-shared" obsahuje sdílenou knihovnu jako jeden ze vstupních souborů.

Když se linker setká s takovou závislostí při provádění nesdíleného odkazu, který není přemístitelný, automaticky se pokusí nalézt požadovanou sdílenou knihovnu a zahrnout ji do odkazu, pokud není explicitně zahrnut. V takovém případě volba -path-link určuje první sadu adresářů pro vyhledávání. Možnost -path-link může určit sekvenci názvů adresářů buď zadáním seznamu názvů oddělených dvojtečkami nebo opakovaným zobrazením.

Tato možnost by měla být používána s opatrností, protože přepíše vyhledávací cestu, která byla pravděpodobně zkompilována do sdílené knihovny. V takovém případě je možné neúmyslně použít jinou vyhledávací cestu než linker runtime.

Linker používá následující vyhledávací cesty k nalezení požadovaných sdílených knihoven.

1.

Libovolné adresáře určené volbou -path-link .

2.

Libovolné adresáře určené volbou -path . Rozdíl mezi -path a -rpath-link je, že adresáře specifikované volbou -path jsou zahrnuty do spustitelného souboru a používány za běhu, zatímco volba -rpath-link je účinná pouze v čase spojení. Je to pouze nativní linker.

3.

V systému ELF, pokud nebyly použity volby -rpath a "rpath-link", vyhledejte obsah proměnné prostředí "LD_RUN_PATH". Je to pouze nativní linker.

4.

Pokud na serveru SunOS nebyla použita volba -rath , vyhledávejte libovolné adresáře zadané pomocí voleb -L .

5.

Pro nativního linkeru obsah proměnné prostředí "LD_LIBRARY_PATH".

6.

Pro přirozený odkaz ELF jsou adresáře v adresáři "DT_RUNPATH" nebo "DT_RPATH" sdílené knihovny vyhledávány pro sdílené knihovny, které potřebuje. Položky "DT_RPATH" jsou ignorovány, pokud existují položky "DT_RUNPATH".

7.

Výchozí adresáře, obvykle / lib a / usr / lib .

8.

Pro původní linker v systému ELF existuje soubor /etc/ld.so.conf , který obsahuje seznam adresářů nalezených v daném souboru.

Není-li nalezena požadovaná sdílená knihovna, odkazovač vydá varování a pokračuje v propojení.

-shared

-Barebný

Vytvořte sdílenou knihovnu. To je v současné době podporováno pouze na platformách ELF, XCOFF a SunOS. Na serveru SunOS spojovací prvek automaticky vytvoří sdílenou knihovnu, pokud není použita volba -e a na odkazu jsou neurčené symboly.

--sort-common

Tato volba udává, že ld třídí běžné symboly podle velikosti, když je umístí do příslušných výstupních sekcí. Nejprve přijdou všechny symboly jednoho bajtu, pak všechny dva byty, potom všechny čtyři bajty a pak všechno ostatní. To má zabránit mezery mezi symboly kvůli omezením zarovnání.

--split-by-file [ velikost ]

Podobně jako --split-by-reloc, ale vytvoří novou výstupní sekci pro každý vstupní soubor při dosažení velikosti . velikost je výchozí na velikost 1, pokud není zadán.

--split-by-reloc [ počet ]

Snaží se vytvořit další oddíly ve výstupním souboru tak, aby žádná samostatná část výstupu v souboru neobsahovala více než počet přemístění. To je užitečné při vytváření obrovských přemístitelných souborů pro stahování do určitých jader v reálném čase pomocí formátu souboru objektů COFF; protože COFF nemůže představovat více než 65535 přesunů v jedné sekci. Všimněte si, že to nebude fungovat s formáty souborů objektů, které nepodporují libovolné oddíly. Spojovací prvek nerozdělí jednotlivé vstupní části pro redistribuci, takže pokud jedna vstupní část obsahuje více než počet přemístění, jedna výstupní část bude obsahovat mnoho přemístění. počet výchozích hodnot je 32768.

--staty

Vypočítat a zobrazit statistiky o provozu linkeru, jako je doba provádění a využití paměti.

- tradiční formát

Pro některé cíle je výstup ld odlišný v některých ohledech od výstupu nějakého existujícího linkeru. Tento přepínač požaduje, aby místo toho používal tradiční formát.

Například na SunOS, ld kombinuje duplicitní položky v tabulce symbolů. To může snížit velikost výstupního souboru s úplnými informacemi o ladění o více než 30 procent. Bohužel, program SunOS "dbx" nemůže číst výsledný program ("gdb" nemá žádné potíže). Přepínač - tradiční formát informuje ld, že nesmí kombinovat duplicitní záznamy.

--section-start sectionname = org

Vyhledejte část ve výstupním souboru na absolutní adrese danou org . Tuto volbu můžete použít tolikrát, kolikrát je potřeba k nalezení více sekcí v příkazovém řádku. org musí být jedno hexadecimální celé číslo; pro kompatibilitu s ostatními linkery můžete vynechat přední 0x obvykle spojenou s hexadecimálními hodnotami. Poznámka: mezi názvem sekce , znakem rovnosti (`` = '') a org .

-Tbss org

-Tdata org

-Tex org

Použijte org jako výchozí adresu pro --- bss, resp. "Bss", "data" nebo "textový" segment výstupního souboru. org musí být jedno hexadecimální celé číslo; pro kompatibilitu s ostatními linkery můžete vynechat přední 0x obvykle spojenou s hexadecimálními hodnotami.

-dll-verbose

--verbose

Zobrazte číslo verze pro ld a seznam podporovaných emulací linkeru. Zobrazte, které vstupní soubory lze a nelze otevřít. Zobrazí skript propojovacího propojení, který používá linker.

--version-script = verze-scriptfile

Zadejte název skriptu verze odkazu. Toto je obvykle používáno při vytváření sdílených knihoven, které určují další informace o hierarchii verze pro vytvořenou knihovnu. Tato volba má smysl pouze na platformách ELF, které podporují sdílené knihovny.

--warn-common

Varujte, když je společný symbol kombinován s jiným běžným symbolem nebo s definicí symbolu. Unixové linkery dovolují tuto poněkud nedbalou praxi, ale linkery na některých jiných operačních systémech ne. Tato možnost vám umožní najít potenciální problémy při kombinaci globálních symbolů. Některé knihovny C bohužel tuto praxi používají, takže si můžete v knihovnách, stejně jako ve vašich programech, upozornit na symboly.

Existují tři druhy globálních symbolů, ilustrované zde v příkladech C:

int i = 1;

Definice, která se nachází v části inicializovaných dat výstupního souboru.

external int i;

Neurčený odkaz, který nevymezuje prostor. Musí existovat definice nebo společný symbol pro proměnnou někde.

int i;

Společný symbol. Pokud pro proměnnou existuje pouze jeden (nebo více) společných symbolů, jde o neinicializovanou datovou oblast výstupního souboru. Spojovací prvek spojuje více společných symbolů pro stejnou proměnnou do jediného symbolu. Jsou-li různé velikosti, vybírá největší velikost. Linker promění společný symbol do deklarace, pokud existuje definice stejné proměnné.

Možnost --warn-common může vytvořit pět druhů varování. Každé varování se skládá z dvojice řádků: první popisuje právě nalezený symbol a druhý popisuje předchozí symbol se stejným názvem. Jeden nebo oba dva symboly budou společným symbolem.

1.

Otočení společného symbolu do odkazu, protože již existuje definice symbolu.

(
): upozornění: common of ` 'přepsáno definicí (
):

2.

Otočení společného symbolu do reference, protože se vyskytne pozdější definice symbolu. Stejně jako předchozí případ, kromě toho, že se symboly vyskytují v jiném pořadí.

(
): varování: definice ` 'přepsání společného (
): varování:

3.

Sloučení společného symbolu s předchozím společným symbolem stejné velikosti.

(
): varování: více častých < (
): varování:

4.

Spojení společného symbolu s předchozím větším společným symbolem.

(
): varování: časté < je nahrazeno větším společným (
): varování:

5.

Sloučení společného symbolu s předchozím menším společným symbolem. Stejně jako předchozí případ, kromě toho, že se symboly vyskytují v jiném pořadí.

(
): varování: časté označení < 'přepsání menších společných (
):

- konstruktéry výbuchu

Upozorněte na použití globálních konstruktorů. To je užitečné pouze pro několik formátů souborů objektů. Pro formáty jako COFF nebo ELF nemůže linker zjistit použití globálních konstruktorů.

--warn-multiple-gp

Upozornění, pokud jsou ve výstupním souboru vyžadovány více hodnot globálního ukazatele. To je smysluplné pouze u některých procesorů, jako je například Alpha. Konkrétně někteří procesoři uvádějí konstanty velkých hodnot ve zvláštní sekci. Zvláštní registr (globální ukazatel) ukazuje do středu této části, takže konstanty lze efektivně načíst přes relativní režim adresování základního registru. Vzhledem k tomu, že posun v relativním režimu základny je pevný a poměrně malý (např. 16 bitů), omezuje maximální velikost konstantního fondu. Ve velkých programech je proto často potřeba použít více hodnot globálního ukazatele, aby bylo možné řešit všechny možné konstanty. Tato volba způsobí, že bude vydáno varování, kdykoli k tomu dojde.

- varování jednou

Upozorňovat pouze jednou na každý nedefinovaný symbol, spíše než na jeden modul, který se na něj vztahuje.

- zarovnání řezu

Upozorněte na změnu adresy výstupní části z důvodu zarovnání. Typicky bude zarovnání nastaveno vstupní částí. Adresa bude změněna pouze v případě, že není výslovně uvedena; že příkaz "SECTIONS" nezadává výchozí adresu pro danou sekci.

- celý archiv

Pro každý archiv uvedený na příkazovém řádku po volbě --whole-archive , zahrnout každý soubor objektu do archivu v odkazu, spíše než vyhledat archiv pro požadované soubory objektů. To se obvykle používá k přepnutí archivního souboru do sdílené knihovny, což nutí, aby každý objekt byl zahrnut do výsledné sdílené knihovny. Tuto možnost lze použít více než jednou.

Dvě poznámky při použití této možnosti z gcc: Nejprve gcc o této možnosti neví, takže musíte použít -Wl, -whole-archive . Za druhé, nezapomeňte použít soubor -Wl, -no-celý-archiv po seznamu archivů, protože gcc přidá svůj vlastní seznam archivů k vašemu odkazu a možná nebudete chtít, aby tato vlajka ovlivnila ty také.

- symbol obalu

Pro symbol použijte funkci obálky. Jakýkoli nedefinovaný odkaz na symbol bude vyřešen na "__ wrap_symbol". Jakýkoli nedefinovaný odkaz na "__real_symbol" bude vyřešen jako symbol .

To může být použito k poskytnutí obalu pro systémovou funkci. Funkce obalu by se měla nazývat "__wrap_symbol". Pokud si přeje volat systémovou funkci, měl by volat "__ real_symbol".

Zde je triviální příklad:

void * __wrap_malloc (int c) {printf ("volal malloc s% ld \ n", c); návrat __real_malloc (c); }}

Pokud propojíte jiný kód s tímto souborem pomocí příkazu --wrap malloc , pak budou všechny volání na "malloc" namísto toho volat funkci "__wrap_malloc". Volání na "__real_malloc" v "__wrap_malloc" vyvolá skutečnou funkci "malloc".

Můžete také poskytnout funkci "__real_malloc", takže odkazy bez možnosti --wrap budou úspěšné. Pokud tak učiníte, neměli byste definici "__ real_malloc" ve stejném souboru jako "__wrap_malloc"; pokud ano, assembler může vyřešit hovor dříve, než má linker možnost jej zabalit do "malloc".

--enable-new-dtags

--disable-new-dtags

Tento linker může vytvořit nové dynamické značky v ELF. Ale starší systémy ELF jim nemusí rozumět. Pokud zadáte --enable-new-dtags , dynamické značky budou vytvořeny podle potřeby. Pokud zadáte --disable-new-dtags , nebudou vytvořeny žádné nové dynamické značky. Ve výchozím nastavení nové dynamické značky nejsou vytvořeny. Všimněte si, že tyto možnosti jsou k dispozici pouze pro systémy BEL.

Spojovací prvek i386 PE podporuje volbu -shared , která způsobuje, že výstup je dynamicky propojená knihovna (DLL) namísto běžného spustitelného souboru. Při použití této možnosti byste měli název výstupu "* .dll" pojmenovat. Navíc linker plně podporuje standardní soubory * .def, které mohou být zadány na příkazovém řádku linkeru jako objektový soubor (ve skutečnosti by měl předcházet archivy, ze kterých exportuje symboly, aby se zajistilo, stejně jako normální objektový soubor).

Kromě možností společných pro všechny cíle podporuje i386 PE linker další možnosti příkazového řádku, které jsou specifické pro cíl PE pro i386. Možnosti, které berou hodnoty, mohou být odděleny od jejich hodnot buď znakem mezery, nebo znaménkem.

--add-stdcall-alias

Pokud jsou zadány, symboly s příponou stdcall (@ nn ) budou exportovány jako-is a také s příponou stripped.

- soubor s databázovými soubory

Použijte soubor jako název souboru, ve kterém chcete uložit základní adresy všech přemístění potřebných pro generování DLL pomocí dlltool .

--dll

Vytvořte knihovnu DLL namísto běžného spustitelného souboru. Můžete také použít sdílené položky nebo určit "LIBRARY" v daném souboru ".def".

--ableable-stdcall-fixup

--disable-stdcall-fixup

Pokud odkaz nalezne symbol, který nemůže vyřešit, pokusí se "fuzzy linking" hledat jiný definovaný symbol, který se liší pouze ve formátu názvu symbolu (cdecl vs stdcall) a vyřeší tento symbol propojením k zápasu. Například nedefinovaný symbol "_foo" může být spojen s funkcí "_foo @ 12", nebo nedefinovaný symbol "_bar @ 16" může být spojen s funkcí "_bar". Když to linker provede, vytiskne varování, protože by se normálně nemělo propojit, ale někdy importovat knihovny generované z dll jiných výrobců může vyžadovat, aby byla tato funkce použitelná. Pokud zadáte --enable-stdcall-fixup , tato funkce je plně povolena a varování se nevytisknou. Pokud zadáte --disable-stdcall-fixup , tato funkce je zakázána a takové chyby se považují za chyby.

- export-všechny-symboly

Pokud jsou uvedeny všechny globální symboly v objektech použitých k sestavení knihovny DLL budou vygenerovány DLL. Všimněte si, že je to výchozí, pokud by jinak nebyly exportovány žádné symboly. Pokud jsou symboly explicitně exportovány prostřednictvím souborů DEF nebo jsou implicitně exportovány pomocí atributů funkcí, není výchozí exportovat nic jiného, ​​pokud není tato možnost uvedena. Všimněte si, že symboly "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12" a "impure_ptr" nebudou automaticky exportovány. Také symboly importované z jiných knihoven DLL nebudou reexportovány ani nebudou symboly specifikující vnitřní rozložení knihovny DLL, například ty, které začínají "_head_" nebo končí "_iname". Kromě toho nebudou exportovány žádné symboly z "libgcc", "libstd ++", "libmingw32" nebo "crtX.o". Symboly, jejichž názvy začínají slovy "__rtti_" nebo "__builtin_", nebudou exportovány, aby pomohly s knihovnami C ++. Konečně existuje rozsáhlý seznam symbolů cygwin-private, které nejsou exportovány (samozřejmě to platí i při vytváření knihoven DLL pro cíle cygwin).

Tyto cygwin-vyloučeny jsou: "_cygwin_dll_entry @ 12", "_cygwin_crt0_common @ 8", "cygwin_premina1", "cygwin_premain2", "cygwin_premain3" "a" environ ".

--exclude-symbols symbol , symbol , ...

Určuje seznam symbolů, které by neměly být automaticky exportovány. Názvy symbolů mohou být vymezeny čárkami nebo dvojtečkami.

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

Určuje seznam archivních knihoven, ze kterých by symboly neměly být automaticky exportovány. Názvy knihoven mohou být vymezeny čárkami nebo dvojtečkami. Zadání příkazu "-exclude-libs ALL" vylučuje symboly ve všech archivních knihovnách z automatického exportu. Symboly explicitně uvedené v souboru .def jsou stále exportovány bez ohledu na tuto možnost.

- zarovnání souboru

Určete zarovnání souborů. Sekce v souboru se vždy začínají v odsazených souborech, které jsou násobky tohoto čísla. Výchozí hodnota je 512.

- rezervní rezerva

- rezervní rezerva , potvrzení

Určete množství paměti, které chcete rezervovat (a volitelně potvrzovat), které chcete použít jako haldu pro tento program. Výchozí hodnota je 1Mb vyhrazena a 4k závazná.

--imákladní hodnota

Použijte hodnotu jako základní adresu vašeho programu nebo dll. Toto je nejnižší umístění paměti, které bude použito při načítání programu nebo dll. Chcete-li snížit potřebu přemísťovat a zlepšit výkon vašich DLL, měli byste mít jedinečnou základní adresu a nepřekrývat žádné další DLL. Výchozí hodnota je 0x400000 pro spustitelné soubory a 0x10000000 pro dll.

- Kill-at

Pokud jsou zadány, budou přípony stdcall (@ nn ) odstraněny ze symbolů předtím, než budou exportovány.

--major-image-version value

Nastavuje hlavní číslo "verze obrázku". Výchozí hodnota je 1.

--major-os-verze

Nastavuje hlavní číslo verze OS. Výchozí hodnota je 4.

--maximální hodnota subsystému - verze

Nastaví hlavní číslo verze subsystému. Výchozí hodnota je 4.

--minor-image-version hodnota

Nastaví menší číslo verze `` image ''. Výchozí hodnota je 0.

--minor-os-verze

Nastaví menší číslo verze OS. Výchozí hodnota je 0.

--minor-subsystém - hodnota verze

Nastaví menší číslo verze subsystému. Výchozí hodnota je 0.

Soubor --output-def

Linker vytvoří soubor souboru, který bude obsahovat soubor DEF odpovídající knihovně DLL, kterou linker generuje. Tento soubor DEF (který by měl být nazván "* .def") může být použit k vytvoření importní knihovny s "dlltool" nebo může být použit jako odkaz na automaticky nebo implicitně exportované symboly.

--out-implib soubor

Linker vytvoří soubor souboru, který bude obsahovat import lib odpovídající DLL, který linker generuje. Tento import lib (který by měl být nazván "* .dll.a" nebo "* .a") může být použit k propojení klientů proti generované knihovně DLL, toto chování umožňuje přeskočit samostatný krok vytvoření knihovny importu "dlltool".

--enable-auto-image-base

Automaticky zvolit základnu obrázků pro knihovny DLL, pokud není zadán parametr "-image-base". Pomocí hash vygenerovaného z dllname pro vytvoření jedinečných základen pro každou knihovnu DLL se zabrání kolizím a přemístěním v paměti, které mohou zpomalit provádění programu.

--disable-auto-image-base

Nevytvářejte automaticky jedinečnou základnu obrazu. Pokud neexistuje žádná uživatelsky specifikovaná základna obrazu ("--image-base"), použijte výchozí platformu.

řetězec --dll-search-prefix

Při dynamickém propojení s adresářem DLL bez knihovny importu vyhledejte " .dll" před "lib .dll". Toto chování umožňuje snadné rozlišení mezi knihovnami DLL vytvořenými pro různé subplatformy: native, cygwin, uwin, pw atd. Například cygwin DLL obvykle používají "--dll-search-prefix = cyg".

--enable-auto-import

Do sofistikovaného propojení "_symbol" s "__imp__symbol" pro DATA import z DLL a vytvoření potřebných thunking symbolů při vytváření importních knihoven s těmito DATAexports. Toto obvykle "pracuje", ale někdy se může zobrazit tato zpráva:

"proměnná" "nemůže být automaticky importována. Pro detaily si přečtěte dokumentaci pro" -enable-auto-import ".

Tato zpráva se vyskytuje, když některé (pod) výrazy přistupují k adrese, která je nakonec daná součtem dvou konstant (importní tabulky Win32 povolí pouze jednu). Případy, kde se může vyskytnout, zahrnují přístupy k polím členů strukturálních proměnných importovaných z knihovny DLL a také pomocí konstantního indexu do proměnné pole importovaného z knihovny DLL. Jakákoli víceúčelová proměnná (pole, struktura, dlouhá délka atd.) Může tuto chybovou podmínku spustit. Nicméně, bez ohledu na přesný typ dat exportované proměnné, ld bude vždy detekovat, vydá varování a ukončí.

Existuje několik způsobů, jak řešit tuto obtížnost, bez ohledu na typ dat exportované proměnné:

Jedním ze způsobů je použití přepínače --enable-runtime-pseudo-reloc. Toto ponechává úlohu úpravy referencí ve vašem klientském kódu pro běhové prostředí, takže tato metoda funguje pouze tehdy, když tato funkce podporuje runtime environtment.

Druhým řešením je přinutit jednu z "konstant" být proměnná - to je, neznámé a ne-optimalizovatelné v době kompilace. U polí jsou dvě možnosti: a) provést indexee (adresu pole) proměnnou nebo b) vytvořit "konstantní" index proměnnou. Tím pádem:

externí typ externí_array []; external_array [1] -> {volatilní typ * t = externí_array; t [1]}

nebo

externí typ externí_array []; external_array [1] -> {volatilní int t = 1; external_array [t]}

Pro strukty (a většinu dalších vícezónových datových typů) jedinou možností je vytvořit samotnou strukturu (nebo dlouhou dlouhou nebo ...) proměnnou:

externí struktura external_struct; external_struct.field -> {volatile struktura s * t = & external_struct; t-> pole}

nebo

externí dlouho dlouhá external_ll; external_ll -> {volatile long long * local_ll = & external_ll; * local_ll}

Třetím způsobem řešení této obtížnosti je opustit "auto-import" pro symbol, který se dopustil trestné činnosti, a označit jej "__declspec (dllimport)". V praxi to však vyžaduje použití definic #defines k určení, zda vytváříte knihovnu DLL, budování kódu klienta, který bude odkazovat na knihovnu DLL nebo stačí vytvořit nebo propojit statickou knihovnu. Při výběru mezi různými způsoby řešení problému "přímá adresa s konstantním posunem" byste měli zvážit typické použití v reálném světě:

Originál:

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

Řešení 1:

--foo.h externí int arr []; --foo.c #include "foo.h" void main (int argc, char ** argv) {/ * Toto řešení je pro win32 a cygwin; ne "optimalizovat" * / volatile int * parr = arr; printf ("% d \ n", parr [1]); }}

Řešení 2:

--foo.h / * Poznámka: předpokládá se automatický export (ne __declspec (dllexport)) * / #if (definováno (_WIN32) || definováno (__CYGWIN__)) && \! (definováno (FOO_BUILD_DLL) )) #definovat FOO_IMPORT __declspec (dllimport) #helse #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]); }}

Čtvrtým způsobem, jak se tomuto problému vyhnout, je rekodifikovat knihovnu pomocí funkčního rozhraní namísto datového rozhraní pro funkce proměnných, které porušují (např. Funkce set_foo () a get_foo () accessor).

--disable-auto-import

Nepokoušejte se sophisticalted propojení "_symbol" s "__imp__symbol" pro DATAimports z DLL.

--enable-runtime-pseudo-reloc

Pokud váš kód obsahuje výrazy popsané v sekci --enable-auto-import, tj. DATAimports z DLL s nenulovým posunem, vytvoří tento přepínač vektor "runtime pseudo relocations", který může být použit v prostředí runtime pro úpravu odkazů k takovým údajům v kódu klienta.

--disable-runtime-pseudo-reloc

Nevytvářejte pseudo relokace pro nenulový kompenzovaný import DATA z DLL. Toto je výchozí nastavení.

--enable-extra-pe-debug

Zobrazit další informace o ladění týkající se automatického importu symbolů.

- zarovnání úseku

Nastaví zarovnání úseku. Sekce v paměti se vždy začínají na adresách, které jsou násobkem tohoto čísla. Výchozí hodnota je 0x1000.

- rezervní rezerva

- rezervní rezerva , potvrzení

Určete velikost paměti, kterou chcete rezervovat (a volitelně potvrzovat), která se použije jako zásobník tohoto programu. Výchozí nastavení je 2Mb vyhrazeno a 4k závazné.

- subsystém, který

- subsystém, který : hlavní

- subsystém, který : hlavní . menší

Určuje subsystém, pod kterým bude program spouštět. Právní hodnoty jsou "původní", "okna", "konzole" a "posix". Volitelně můžete také nastavit verzi subsystému.

Důležité: Použijte příkaz man ( % man ), abyste zjistili, jaký příkaz se používá v konkrétním počítači.