Comandă Linux / Unix: Id

NUME

ld - Folosind LD , link-ul GNU

REZUMAT

ld [ opțiuni ] objfile ...

DESCRIERE

ld combină un număr de fișiere obiect și arhivă, le relochează datele și leagă referințele de simboluri. De obicei ultimul pas în compilarea unui program este de a rula ld .

ld acceptă fișierele lingvistice ale comenzilor Linker scrise într-o suprasetare a sintaxei Limbaj de comandă al editorului de legături AT & T, pentru a oferi un control explicit și total asupra procesului de conectare.

Această pagină de om nu descrie limba de comandă; consultați intrarea ld din "info" sau manualul ld: link-ul GNU , pentru detalii complete despre limba de comandă și despre alte aspecte ale linker-ului GNU.

Această versiune a ld utilizează bibliotecile BFD cu scop general pentru a funcționa pe fișiere obiect. Acest lucru permite ld să citească, să combine și să scrie fișiere obiect în multe formate diferite - de exemplu, COFF sau "a.out". Diferite formate pot fi legate împreună pentru a produce orice tip de fișier obiect disponibil.

În afară de flexibilitatea sa, link-ul GNU este mai util decât alte linkere în furnizarea de informații de diagnosticare. Mulți linkeri abandonează executarea imediat după întâmpinarea unei erori; ori de câte ori este posibil, ld continuă să execute, permițându-vă să identificați alte erori (sau, în unele cazuri, să obțineți un fișier de ieșire în ciuda erorii).

GNU linker ld este destinat să acopere o gamă largă de situații și să fie cât mai compatibil cu ceilalți linkeri. Ca rezultat, aveți multe opțiuni pentru a-ți controla comportamentul.

OPȚIUNI

Linkerul suportă o multitudine de opțiuni de linie de comandă , dar în practică, puțini dintre aceștia sunt utilizați într-un anumit context. De exemplu, o utilizare frecventă a ld este de a conecta fișiere obiect standard Unix pe un sistem Unix standard, suportat. Pe un astfel de sistem, pentru a conecta un fișier "hello.o":

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

Acest lucru îi spune lui ld să producă un fișier numit ieșire ca urmare a conectării fișierului "/lib/crt0.o" cu "hello.o" și a bibliotecii "libc.a", care va proveni din directoarele de căutare standard. (Vedeți discuția despre opțiunea -l de mai jos.)

Unele dintre opțiunile din linia de comandă pentru ld pot fi specificate în orice punct al liniei de comandă. Cu toate acestea, opțiunile care se referă la fișiere, cum ar fi -l sau -T , determină citirea fișierului în punctul în care opțiunea apare în linia de comandă, în raport cu fișierele de obiecte și alte opțiuni de fișier. Repetarea opțiunilor non-fișier cu un argument diferit nu va avea niciun efect suplimentar sau nu va suprascrie evenimentele precedente (cele din partea stângă din linia de comandă) a acelei opțiuni. Opțiunile care pot fi specificate în mod semnificativ de mai multe ori sunt menționate în descrierile de mai jos.

Argumentele non-opțiune sunt fișiere obiect sau arhive care trebuie să fie legate între ele. Acestea pot urma, precede sau pot fi amestecate cu opțiuni de linie de comandă, cu excepția faptului că un argument de fișier obiect nu poate fi plasat între o opțiune și argumentul acesteia.

De obicei, link-ul este invocat cu cel puțin un fișier obiect, dar puteți specifica alte forme de fișiere de intrare binare utilizând -l , -R și limba de comandă a scriptului. Dacă nu sunt specificate niciun fișier de intrare binar, linkerul nu produce nici o ieșire și emite mesajul Fără fișiere de intrare .

Dacă linkerul nu poate recunoaște formatul unui fișier obiect, acesta va presupune că este un script de legătură. Un script specificat în acest mod mărește scriptul principal de linker folosit pentru link (fie scriptul implicit de linker, fie cel specificat prin utilizarea -T ). Această caracteristică permite linkerului să facă legătura cu un fișier care pare să fie un obiect sau o arhivă, dar de fapt definește doar câteva valori ale simbolurilor sau utilizează "INPUT" sau "GROUP" pentru a încărca alte obiecte. Rețineți că specificarea unui script în acest fel doar mărește scriptul principal de linker; utilizați opțiunea -T pentru a înlocui în întregime scriptul de link implicit.

Pentru opțiunile ale căror nume sunt o singură literă, opțiunile argumentele trebuie fie să urmeze litera opțiunii fără spațiu alb, fie să fie date ca argumente separate imediat după opțiunea care le cere.

Pentru opțiunile ale căror nume sunt mai multe litere, o bordură sau două pot precede numele opțiunii; de exemplu, simbolul -trace și simbolul -trace sunt echivalente. Notă - există o excepție de la această regulă. Opțiunile pentru mai multe litere care încep cu un litere mici "o" pot fi precedate numai de două liniuțe. Aceasta este de a reduce confuzia cu opțiunea -o . De exemplu, setul -imagic afișează numele fișierului de ieșire la magie, în timp ce --omagic stabilește pavilionul NMAGIC pe ieșire.

Argumentele pentru opțiunile cu mai multe litere trebuie fie să fie separate de numele opțiunii printr-un semn egal, fie să fie date ca argumente separate imediat după opțiunea care le cere. De exemplu, --trace-simbol foo și -trace-symbol = foo sunt echivalente. Sunt acceptate abrevieri unice ale numelor opțiunilor cu mai multe litere.

Notă - dacă linkerul este invocat indirect, printr-un driver de compilator (de exemplu, gcc ), toate opțiunile liniei de comandă linker ar trebui să fie prefixate cu -Wl, (sau orice este potrivit pentru driverul compilator particular), astfel:

gcc -Wl, - grupul de start foo.o bar.o -Wl, - endgroup

Acest lucru este important, pentru că în caz contrar, programul de compilatoare poate să scadă în tăcere opțiunile de linker, ducând la o legătură necorespunzătoare.

Iată o tabelă a comutatoarelor liniei de comandă generice acceptate de link-ul GNU:

- un cuvânt cheie

Această opțiune este acceptată pentru compatibilitatea HP / UX. Argumentul cuvântului cheie trebuie să fie unul dintre arhivele de coarde , partajat sau implicit . -arhiva este echivalentă funcțional cu -Bstatic , iar celelalte două cuvinte cheie sunt echivalente funcțional cu -Bodynamic . Această opțiune poate fi utilizată de mai multe ori.

- O arhitectură

- arhitectura

În versiunea curentă a ld , această opțiune este utilă numai pentru familia de arhitecturi Intel 960. În acea configurație ld , argumentul arhitecturii identifică arhitectura specifică din familia 960, permițând unele măsuri de siguranță și modificând calea de căutare arhivă-bibliotecă.

Versiunile viitoare ale ld pot susține funcționalități similare pentru alte familii de arhitecturi.

-b format de intrare

--format = formatul de intrare

ld poate fi configurat pentru a suporta mai mult de un fel de fișier obiect. Dacă ld este configurat în acest fel, puteți utiliza opțiunea -b pentru a specifica formatul binar pentru fișierele de intrare care urmează această opțiune pe linia de comandă. Chiar și atunci când ld este configurat să suporte formate de obiecte alternative, de obicei, nu trebuie să specificați acest lucru, deoarece ld ar trebui configurat să aștepte ca format de intrare implicit cel mai obișnuit format pe fiecare aparat. formatul de intrare este un șir de text, numele unui anumit format acceptat de bibliotecile BFD. (Puteți lista formatele binare disponibile cu objdump -i .)

Poate doriți să utilizați această opțiune dacă vă conectați fișiere cu un format binar neobișnuit. De asemenea, puteți utiliza -b pentru a schimba explicit formatele (când se leagă fișiere obiect de diferite formate), prin includerea formatului de intrare -b înaintea fiecărui grup de fișiere obiect într-un anumit format.

Formatul implicit este preluat din variabila de mediu "GNUTARGET".

De asemenea, puteți defini formatul de intrare dintr-un script folosind comanda "TARGET";

-c MRI-comanda de comenzi

--mri-script = fișier de comandă RMN

Pentru compatibilitatea cu linkerele produse de RMN, ld acceptă fișiere de script scrise într-un limbaj de comandă alternativ, limitat, descris în secțiunea Fișiere Script Compatibil Script din documentația GNU ld. Introduceți fișiere script MRI cu opțiunea -c ; utilizați opțiunea -T pentru a rula scripturile de link-uri scrise în limbajul de scripting de uz general. Dacă RMN-cmdfile nu există, ld o caută în directoarele specificate de opțiunile -L .

-d

-DC

-DP

Aceste trei opțiuni sunt echivalente; formularele multiple sunt acceptate pentru compatibilitatea cu alte linkere. Ele atribuie spațiu simbolurilor comune chiar dacă este specificat un fișier de ieșire relocabil (cu -r ). Comanda scriptului "FORCE_COMMON_ALLOCATION" are același efect.

-e intrare

- intrare = intrare

Utilizați intrarea ca simbol explicit pentru începerea execuției programului, mai degrabă decât punctul de intrare implicit. Dacă nu există nici un simbol cu ​​numele de intrare , linkerul va încerca să parseze intrarea ca număr și să o folosească ca adresă de intrare (numărul va fi interpretat în baza 10; puteți folosi un 0x de bază pentru baza 16 sau un 0 pentru baza 8).

-E

--export-dinamică

Când creați un executabil legat dinamic, adăugați toate simbolurile în tabela simbolurilor dinamice. Tabela simbolică dinamică este setul de simboluri care sunt vizibile din obiectele dinamice la momentul executării.

Dacă nu utilizați această opțiune, tabela simbolului dinamic va conține în mod obișnuit numai acele simboluri care sunt menționate de un obiect dinamic menționat în link.

Dacă utilizați "dlopen" pentru a încărca un obiect dinamic care trebuie să se refere la simbolurile definite de program, mai degrabă decât un alt obiect dinamic, probabil că va trebui să utilizați această opțiune atunci când conectați programul în sine.

De asemenea, puteți utiliza scriptul de versiune pentru a controla ce simboluri ar trebui adăugate la tabela simbolurilor dinamice dacă formatul de ieșire îl acceptă. Vedeți descrierea scriptului -versiune în @ ref {VERSION}.

-EB

Link obiecte mari-endian. Acest lucru afectează formatul de ieșire implicit.

-el

Legați obiecte mici-endian. Acest lucru afectează formatul de ieșire implicit.

-f

- nume auxiliar

Când creați un obiect partajat ELF, setați câmpul DT_AUXILIARY intern la numele specificat. Acest lucru indică linkerului dinamic că tabela simbolică a obiectului partajat ar trebui utilizată ca filtru auxiliar pe tabela simbolică a numelui obiectului partajat.

Dacă mai târziu leagă un program împotriva acestui obiect filtru, atunci când executați programul, link-ul dinamic va vedea câmpul DT_AUXILIARY. Dacă linkerul dinamic rezolvă orice simbol din obiectul de filtrare, acesta va verifica mai întâi dacă există o definiție în numele obiectului partajat. Dacă există una, va fi utilizată în locul definiției în obiectul de filtrare. Numele obiectului partajat nu trebuie să existe. Astfel, numele obiectului partajat poate fi folosit pentru a oferi o implementare alternativă a anumitor funcții, probabil pentru depanare sau pentru performanța specifică mașinii.

Această opțiune poate fi specificată de mai multe ori. Înregistrările DT_AUXILIARY vor fi create în ordinea în care apar pe linia de comandă.

-F nume

- numele filtrului

Când creați un obiect distribuit ELF, setați câmpul DT_FILTER intern la numele specificat. Aceasta indică linkerului dinamic că tabela simbolică a obiectului partajat care este creat ar trebui să fie folosit ca un filtru în tabela simbolică a numelui obiectului partajat.

Dacă legați mai târziu un program de acest obiect filtru, atunci când executați programul, linkerul dinamic va vedea câmpul DT_FILTER. Link-ul dinamic va rezolva simbolurile în funcție de tabela simbolică a obiectului filtru ca de obicei, dar va lega efectiv de definițiile găsite în numele obiectului partajat. Astfel, obiectul filtru poate fi folosit pentru a selecta un subset al simbolurilor furnizate de numele obiectului.

Unii linkeri mai vechi au folosit opțiunea -F pe parcursul unui set de instrumente de compilare pentru a specifica formatul de fișier obiect pentru fișiere obiect de intrare și ieșire. Legătura GNU folosește și alte mecanisme pentru acest scop: opțiunile -b , --format , --oformate , comanda "TARGET" în scripturile linker și variabila de mediu "GNUTARGET". Legătura GNU va ignora opțiunea -F atunci când nu creează un obiect partajat ELF.

-Fini nume

Când creați un obiect executabil sau obiect ELF, apelați NAME când obiectul executabil sau partajat este descărcat, prin setarea DT_FINI la adresa funcției. Implicit, linkerul folosește funcția "_fini" ca funcție de apelare.

-g

Ignorat. Oferit pentru compatibilitate cu alte instrumente.

-G valoare

--gpsize = valoare

Setați dimensiunea maximă a obiectelor care urmează să fie optimizate utilizând registrul GP pentru a mări . Acest lucru este semnificativ numai pentru formatele de fișiere obiect, cum ar fi MIPS ECOFF, care acceptă introducerea obiectelor mari și mici în secțiuni diferite. Acest lucru este ignorat pentru alte formate de fișiere obiect.

-h nume

-soname = nume

Când creați un obiect comun ELF, setați câmpul DT_SONAME intern la numele specificat. Atunci când un executabil este legat cu un obiect partajat care are un câmp DT_SONAME, atunci când se execută executabilul linkerul dinamic va încerca să încarce obiectul partajat specificat de câmpul DT_SONAME, mai degrabă decât folosind numele fișierului dat linkerului.

-i

Efectuați o legătură incrementală (aceeași ca opțiunea -r ).

- Numele tău

Când creați un obiect executabil sau obiect ELF, apelați NAME la încărcarea obiectului executabil sau partajat, setând DT_INIT la adresa funcției. Implicit, linkerul folosește funcția "_init" ca funcție de apel.

- Arhiva l

--library = arhiva

Adăugați arhiva de fișiere arhivă în lista de fișiere de conectat. Această opțiune poate fi utilizată de mai multe ori. ld va căuta lista de cale pentru apariția "libarchive.a" pentru fiecare arhivă specificată.

În sistemele care acceptă biblioteci partajate, ld poate căuta și biblioteci cu extensii, altele decât ".a". În mod specific, pe sistemele ELF și SunOS, ld va căuta un director pentru o bibliotecă cu o extensie de ".so" înainte de a căuta un director cu extensia ".a". Prin convenție, o extensie ".so" indică o bibliotecă partajată.

Linkerul va căuta o arhivă o singură dată, în locația în care este specificată pe linia de comandă. Dacă arhiva definește un simbol care nu a fost definit într-un obiect care a apărut înaintea arhivei pe linia de comandă, linkerul va include fișierele corespunzătoare din arhivă. Cu toate acestea, un simbol nedefinit dintr-un obiect care apare ulterior pe linia de comandă nu va determina linkerul să caute arhiva din nou.

Consultați opțiunea - ( opțiune pentru un mod de a forța linkerul să caute arhive de mai multe ori.

Puteți arăta aceeași arhivă de mai multe ori pe linia de comandă.

Acest tip de căutare arhivă este standard pentru link-urile Unix. Cu toate acestea, dacă utilizați ld onAIX, rețineți că acesta este diferit de comportamentul linkerului AIX.

-L căutaredir

- calea- bibliotecă = searchdir

Adăugați calea searchdir la lista de căi pe care ld va căuta bibliotecile arhive și scripturile de control ld . Puteți utiliza această opțiune de mai multe ori. Directoarele sunt căutate în ordinea în care sunt specificate pe linia de comandă. Directoarele specificate pe linia de comandă sunt căutate înaintea directoarelor implicite. Toate opțiunile -L se aplică tuturor opțiunilor de tip "l", indiferent de ordinea în care apar opțiunile.

Dacă searchdir începe cu "=", atunci "=" va fi înlocuit de prefixul sysroot , o cale specificată când link-ul este configurat.

Setul implicit de căi căutate (fără a fi specificat cu -L ) depinde de modul de emulare ld și, în unele cazuri, și de modul în care a fost configurat.

Căile pot fi specificate și într-un script de legătură cu comanda "SEARCH_DIR". Directoarele specificate în acest mod sunt căutate în punctul în care apare scriptul de linker în linia de comandă.

-m emulare

Emulați link-ul de emulare . Puteți lista emulațiile disponibile cu opțiunile --verbose sau -V .

Dacă opțiunea -m nu este utilizată, emulația este preluată din variabila de mediu "LDEMULATION", dacă este definită.

În caz contrar, emularea implicită depinde de modul în care link-ul a fost configurat.

-M

--print-map

Imprimați o hartă a link-urilor la ieșirea standard. O hartă a legăturilor oferă informații despre link, inclusiv următoarele:

*

În cazul în care fișierele obiect și simbolurile sunt mapate în memorie.

*

Cum sunt alocate simbolurile comune.

*

Toți membrii arhivării au fost incluși în legătură, menționând simbolul care a cauzat aderarea arhivei.

-N

--nmagic

Opriți alinierea paginilor de secțiuni și marcați semnalul de ieșire ca "NMAGIC", dacă este posibil.

-N

--omagic

Setați secțiunile de text și de date pentru a fi citite și scriitoare. De asemenea, nu aliniați segmentul de date în pagină și dezactivați legătura între bibliotecile partajate. Dacă formatul de ieșire acceptă numere magice de stil Unix, marcați ieșirea ca "OMAGIC".

--no-omagic

Această opțiune anulează majoritatea efectelor opțiunii -N . Setează secțiunea de text pentru a fi citită numai și forțează segmentul de date să fie aliniat la pagini. Notă - această opțiune nu permite conectarea la biblioteci partajate. Utilizați -Bodynamic pentru acest lucru.

- o ieșire

- ieșire = ieșire

Folosiți ieșirea ca nume pentru programul produs de ld ; dacă această opțiune nu este specificată, numele a.out este utilizat în mod implicit. Comanda scriptului "OUTPUT" poate specifica și numele fișierului de ieșire.

-O nivel

Dacă nivelul este o valoare numerică mai mare decât zero ld optimizează ieșirea. Acest lucru poate dura mult mai mult și, prin urmare, ar trebui să fie activat numai pentru binarul final.

-q

--emit-relocs

Lăsați secțiunile de relocare și conținutul în exececutables complet legat. Analiza legăturii postale și instrumentele de optimizare ar putea avea nevoie de aceste informații pentru a efectua modificări corecte ale executabililor. Acest lucru are ca rezultat executabile mai mari.

Această opțiune este în prezent acceptată numai pe platformele ELF.

-r

--relocateable

Generați ieșire relocabilă --- ie, generați un fișier de ieșire care poate, la rândul său, să servească ca intrare pentru ld . Aceasta este adesea numită legătură parțială . Ca efect secundar, în medii care suportă numere standard de magie Unix, această opțiune stabilește de asemenea numărul magic al fișierului de ieșire la "OMAGIC". Dacă această opțiune nu este specificată, se produce un fișier absolut. La conectarea programelor C ++, această opțiune nu va rezolva referințele la constructori; pentru a face asta, utilizați -Ur .

Când un fișier de intrare nu are același format ca fișierul de ieșire, legarea parțială este acceptată numai dacă acel fișier de intrare nu conține delocalizări. Diferitele formate de ieșire pot avea restricții suplimentare; de exemplu, unele formate bazate pe "a.out" nu acceptă deloc conectarea parțială cu fișierele de intrare în alte formate.

Această opțiune are același lucru cu -i .

-R numele fișierului

- just-symbols = numele fișierului

Citiți numele simbolurilor și adresele acestora din numele fișierului , dar nu îl mutați sau îl includeți în ieșire. Aceasta permite ca fișierul dvs. de ieșire să se refere simbolic la locațiile absolute ale memoriei definite în alte programe. Puteți utiliza această opțiune de mai multe ori.

Pentru compatibilitatea cu alte link-uri ELF, dacă opțiunea -R este urmată de un nume de director, mai degrabă decât de un nume de fișier, este tratată ca opțiunea -rpath .

-s

--strip-toate

Omiteți toate informațiile despre simboluri din fișierul de ieșire.

-S

--strip-depanare

Omiteți informațiile din simbolul debugger (dar nu toate simbolurile) din fișierul de ieșire.

-t

--urmă

Tipăriți numele fișierelor de intrare așa cum le procesează ld .

-Scriptfile

--script = scriptfile

Utilizați scriptfile ca script de legătură. Acest script înlocuiește scriptul de link implicit al ld (mai degrabă decât adăugarea la acesta), astfel încât comanda trebuie să specifice tot ceea ce este necesar pentru a descrie fișierul de ieșire. Dacă scriptfile-ul nu există în directorul curent, "ld" îl caută în directoarele specificate de opțiunile L precedente. Opțiunile multiple -T se acumulează.

-u simbol

--undefined = simbol

Forța de simbol să fie introdusă în fișierul de ieșire ca un simbol nedefinit. Acest lucru poate, de exemplu, să declanșeze legarea modulelor suplimentare de bibliotecile standard. -u se poate repeta cu argumente diferite de opțiune pentru a introduce simboluri nedefinite. Această opțiune este echivalentă cu comanda "EXTERN" script script.

-Ur

Pentru orice altceva decât programele C ++, această opțiune este echivalentă cu -r : generează ieșiri relocabile - adică un fișier de ieșire care, la rândul său, poate servi ca intrare pentru ld . Când se leagă programele C ++, -Ur rezolvă referințele la constructori, spre deosebire de -r . Nu funcționează pentru a utiliza -Ur pe fișierele care au fost ele însele legate de -Ur ; odată ce masa constructorului a fost construită, nu poate fi adăugată la. Utilizați -Ur numai pentru ultima legătură parțială și -r pentru celelalte.

--unique [= SECTION ]

Creează o secțiune de ieșire separată pentru fiecare secțiune de intrare care se potrivește cu SECȚIUNEA sau dacă lipseste argumentul SECTION wildcard opțional pentru fiecare secțiune de intrare orfană. O secțiune orfană este una care nu este specificată într-un script de legătură. Puteți utiliza această opțiune de mai multe ori pe linia de comandă; Împiedică fuzionarea obișnuită a secțiunilor de intrare cu același nume, asignarea secțiunilor de ieșire într-un script de legătură.

-v

--versiune

-V

Afișați numărul versiunii pentru ld . Opțiunea -V afișează de asemenea emulațiile acceptate.

-X

--discard-toate

Ștergeți toate simbolurile locale.

-X

--discard-localnici

Ștergeți toate simbolurile locale temporare. Pentru majoritatea țintelor, toate acestea sunt simboluri locale ale căror nume încep cu L.

-un simbol

-trace-symbol = simbol

Imprimați numele fiecărui fișier conectat în care apare simbolul . Această opțiune poate fi furnizată de mai multe ori. În multe sisteme este necesar să se predea o subliniere.

Această opțiune este utilă atunci când aveți un simbol nedefinit în linkul dvs., dar nu știți de unde provine referința.

- Calea

Adăugați calea către calea implicită de căutare a bibliotecii. Această opțiune există pentru compatibilitatea Solaris.

-z cuvânt cheie

Cuvintele cheie recunoscute sunt "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "nowop", "nocombreloc" “. Celelalte cuvinte cheie sunt ignorate pentru compatibilitatea Solaris. "initfirst" marchează obiectul care urmează să fie inițializat primul la runtime înainte de orice alte obiecte. "interpose" marchează obiectul pe care tabela simbolică îl interpune înaintea tuturor simbolurilor, dar executabilul principal. "loadfltr" marchează obiectul că fișierele sale vor fi procesate imediat în timpul execuției "nodefaultlib" marchează obiectul pe care îl va ignora căutarea dependențelor acestui obiect orice căi implicite de căutare a bibliotecii. "nodelete" marchează faptul că obiectul nu trebuie descărcat la rulare. "nodlopen" marchează obiectul care nu este disponibil pentru "dlopen". "nodump" marchează faptul că obiectul nu poate fi eliminat prin "dldump". "acum" marcheaza obiectul cu legarea non-lenes runtime. "originea" marcheaza ca obiectul poate contine $ ORIGIN. "defs" nu permite simbolurile nedefinite. "muldefs" permite mai multe definiții. "combreloc" combină mai multe secțiuni de relocare și le sortează pentru a face posibilă cache-ul de căutare din simboluri dinamice.

"nocombreloc" dezactivează combinarea mai multor secțiuni de relocare. "nocopyreloc" dezactivează producția de copiatoare.

- ( arhive -)

- arhive de grup inițial - end-group

Arhivele ar trebui să fie o listă de fișiere de arhivă . Acestea pot fi nume de fișiere explicite sau opțiuni -l .

Arhivele specificate sunt căutate în mod repetat până când nu sunt create noi referințe nedefinite. În mod normal, o arhivă este căutată o singură dată în ordinea în care este specificată pe linia de comandă. Dacă un simbol din acea arhivă este necesar pentru a rezolva un simbol nedefinit la care se referă un obiect dintr-o arhivă care apare mai târziu pe linia de comandă, linkerul nu ar fi capabil să rezolve această referință. Prin gruparea arhivelor, toate acestea sunt căutate în mod repetat până când toate referințele posibile sunt rezolvate.

Utilizarea acestei opțiuni are un cost semnificativ de performanță. Cel mai bine este să îl utilizați numai atunci când există referințe circulante inevitabile între două sau mai multe arhive.

--accept-necunoscut-intrare-arc

--no-accepta-necunoscut-intrare-arc

Spune linkerului să accepte fișierele de intrare a căror arhitectură nu poate fi recunoscută. Presupunerea este că utilizatorul știe ce fac și intenționează în mod deliberat să lege în aceste fișiere de intrare necunoscute. Acesta a fost comportamentul implicit al linker-ului, înainte de lansarea lui 2.14. Comportamentul implicit din lansarea 2.14 este respingerea unor astfel de fișiere de intrare și astfel a fost adăugată opțiunea --accept-unknown-input-arch, pentru a restaura vechiul comportament.

- cuvânt cheie cheie

Această opțiune este ignorată pentru compatibilitatea SunOS .

-Bdynamic

-dy

-call_shared

Legătura cu bibliotecile dinamice. Acest lucru are sens numai pe platformele pentru care sunt acceptate bibliotecile partajate . Această opțiune este în mod normal implicită pentru astfel de platforme. Diferitele variante ale acestei opțiuni sunt compatibile cu diferite sisteme. Puteți utiliza această opțiune de mai multe ori pe linia de comandă: afectează biblioteca căutând opțiunile -l care o urmează.

-Bgroup

Setați pavilionul "DF_1_GROUP" din secțiunea "DT_FLAGS_1" din secțiunea dinamică. Acest lucru determină link-ul runtime să se ocupe de căutările în acest obiect și dependențele acestuia să fie efectuate numai în interiorul grupului. - ne-nedefinit este implicit. Această opțiune este semnificativă doar pentru platformele ELF care acceptă bibliotecile partajate .

-Bstatic

-dn

-non_shared

-static

Nu faceți legătura cu bibliotecile partajate. Acest lucru are sens numai pe platformele pentru care sunt acceptate bibliotecile partajate. Diferitele variante ale acestei opțiuni sunt compatibile cu diferite sisteme. Puteți utiliza această opțiune de mai multe ori pe linia de comandă: afectează biblioteca căutând opțiunile -l care o urmează.

-Bsymbolic

Când creați o bibliotecă partajată, legați referințele la simbolurile globale la definiția din biblioteca partajată, dacă există. În mod normal, este posibil ca un program legat de o bibliotecă partajată să suprascrie definiția din biblioteca partajată. Această opțiune este semnificativă numai pentru platformele ELFplatform care acceptă bibliotecile partajate.

--check-sectiuni

secțiuni --no-check

Solicită linker-ului să nu verifice adresele secțiunilor după ce au fost atribuite pentru a vedea dacă există suprapuneri. În mod normal linkerul va efectua această verificare și, dacă găsește orice suprapunere, va produce mesaje de eroare adecvate. Linkerul știe și face diferențe pentru secțiunile din suprapuneri. Comportamentul implicit poate fi restabilit utilizând butoanele switch - line -check .

--cref

Realizați o tabelă de referință încrucișată. Dacă se generează un fișier hartă linker, tabela de referință este imprimată în fișierul hărții. În caz contrar, este imprimat pe ieșirea standard.

Formatul tabelului este intenționat simplu, astfel încât să poată fi ușor procesat printr-un scenariu, dacă este necesar. Simbolurile sunt tipărite, sortate după nume. Pentru fiecare simbol se afișează o listă cu numele fișierelor. Dacă simbolul este definit, primul fișier listat este locația definiției. Fișierele rămase conțin referințe la simbol.

--no-defini-comune

Această opțiune împiedică atribuirea adreselor simbolurilor comune. Comanda scriptului "INHIBIT_COMMON_ALLOCATION" are același efect.

Opțiunea --no-define-common permite decuplarea deciziei de atribuire a adreselor simbolurilor comune de la alegerea tipului de fișier de ieșire; în caz contrar, un tip de ieșire care nu poate fi relocat forțează forțarea adreselor simbolurilor comune. Folosind --no-define-common permite simbolurilor comune care se referă dintr-o bibliotecă partajată să li se atribuie adrese numai în programul principal. Acest lucru elimină spațiul duplicat neutilizat din biblioteca partajată și previne, de asemenea, orice posibilă confuzie în ceea ce privește rezolvarea duplicatului greșit atunci când există multe module dinamice cu căi de căutare specializate pentru rezolvarea simbolurilor runtime.

- simbol defectuos = expresie

Creați un simbol global în fișierul de ieșire, care conține adresa absolută dată de expresie . Puteți utiliza această opțiune de câte ori este necesar pentru a defini mai multe simboluri în linia de comandă. O formă limitată de aritmetică este acceptată pentru expresie în acest context: puteți să dați o constantă hexazecimală sau numele unui simbol existent sau să utilizați "+" și "-" pentru a adăuga sau a scădea constantele sau simbolurile hexazecimale. Dacă aveți nevoie de expresii mai elaborate, luați în considerare utilizarea limbajului de comandă a linker-ului dintr-un script. Notă: nu trebuie să existe un spațiu alb între simbol , semnul egal (`` = '') și expresie .

--demangle [= stil ]

--no-demangle

Aceste opțiuni controlează dacă trebuie să eliminați denumirile simbolurilor din mesajele de eroare și din alte ieșiri. Atunci când li se spune că linkerul este demontat, acesta încearcă să prezinte nume de simboluri într-un mod lizibil: scade sublinierile de conducere dacă sunt folosite de formatul de fișier obiect și convertesc numele de simboluri C ++ în nume care pot fi citite de utilizator. Diferitele compilatoare au diferite stiluri de mangling. Argumentul de stil de demutare opțional poate fi folosit pentru a alege un stil de demagnetizare adecvat pentru compilatorul dvs. Linkerul va fi demontat în mod prestabilit dacă nu este setată variabila de mediu COLLECT_NO_DEMANGLE . Aceste opțiuni pot fi utilizate pentru a înlocui setările implicite.

- fișierul dynamic-linker

Setați numele linkerului dinamic. Acest lucru are sens numai atunci când se generează executabile ELF dinamic conectate. Link-ul dinamic implicit este în mod normal corect; nu folosiți acest lucru decât dacă știți ce faceți.

--embedded-relocs

Această opțiune are sens numai atunci când se face legătura între codul PIC încorporat MIPS, generat de opțiunea -membedded-pic la compilarea GNU și asamblor. Aceasta determină linkerul să creeze o tabelă care poate fi folosită la timpul de execuție pentru a muta orice date care au fost inițializate static la valorile indicatoarelor. Vedeți codul din testsuite / ld-empic pentru detalii.

--fatal-avertismente

Tratează toate avertismentele drept erori .

--force-exe-sufix

Asigurați-vă că un fișier de ieșire are un sufix .exe.

Dacă un fișier de ieșire complet conectat cu succes nu are sufixul " .exe " sau " .dll ", această opțiune obligă linkerul să copieze fișierul de ieșire la unul cu același nume cu un sufix ".exe". Această opțiune este utilă atunci când se utilizează fișierele de configurare unmodified Unix pe o gazdă Microsoft Windows, deoarece unele versiuni de Windows nu vor rula o imagine decât dacă se termină cu un sufix ".exe".

--no-gc secțiuni

--gc-sectiuni

Activați colectarea gunoiului de secțiuni de intrare neutilizate. Se ignoră obiectivele care nu acceptă această opțiune. Această opțiune nu este compatibilă cu -r , nici nu ar trebui utilizată cu legături dinamice. Comportamentul implicit (de a nu efectua această colecție de gunoi ) poate fi restabilit prin specificarea secțiunilor --no-gc din linia de comandă.

--Ajutor

Imprimați un sumar al opțiunilor din linia de comandă pe ieșirea standard și pe ieșire.

--target-ajutor

Imprimați un sumar al tuturor opțiunilor specifice țintă pe ieșirea standard și pe ieșire.

-Mapă map

Imprimați o hartă de link-uri către fișierul map file. Vedeți descrierea opțiunii -M , de mai sus.

--no-keep-memorie

În mod normal, se optimizează viteza de utilizare a memoriei prin cachearea tabelelor de simboluri ale fișierelor de intrare din memorie. Această opțiune le spune ld să se optimizeze în mod optim pentru utilizarea memoriei, reeducând tabelele cu simboluri după cum este necesar. Acest lucru poate fi necesar dacă ld se epuizează spațiul de memorie în timpul conectării unui executabil mare.

--no-nedefinite

-z defs

În mod normal, la crearea unei biblioteci partajate non-simbolice, simbolurile nedefinite sunt permise și lăsate pentru a fi rezolvate de încărcătorul runtime. Aceste opțiuni nu permit astfel de simboluri nedefinite.

--allow-multiple-definition

- Muldefs

În mod normal, atunci când un simbol este definit de mai multe ori, linkerul va raporta o eroare fatală. Aceste opțiuni permit definiții multiple și va fi utilizată prima definiție.

--allow-shlib-nedefinite

Permiteți simbolurile nedefinite în obiecte partajate, chiar dacă este setat --no-undefined. Rezultatul net va fi acela că simbolurile nedefinite în obiectele obișnuite vor declanșa încă o eroare, dar simbolurile nedefinite în obiectele partajate vor fi ignorate. Punerea în aplicare a no_undefined face presupunerea că link-ul runtime se va umfla pe simboluri nedefinite. Cu toate acestea, există cel puțin un sistem (BeOS) unde simbolurile nedefinite în bibliotecile partajate sunt normale, deoarece nucleul le păstrează la momentul încărcării pentru a selecta funcția cea mai potrivită pentru arhitectura curentă. IE selectați în mod dinamic o funcție memset corespunzătoare. Se pare că este, de asemenea, normal ca bibliotecile partajate HPPA să aibă simboluri nedefinite.

--no-undefined-versiune

În mod normal, atunci când un simbol are o versiune nedefinită, linkerul îl va ignora. Această opțiune nu permite simbolurile cu versiune nedefinită și va fi emisă o eroare fatală.

--no-avertiza-asimetrie

În mod normal, ld va da o eroare dacă încercați să conectați împreună fișierele de intrare care sunt necorespunzătoare din anumite motive, probabil pentru că au fost compilate pentru diferite procesoare sau pentru diferite endiannesses. Această opțiune spune că ar trebui să permită în mod tacit astfel de posibile erori. Această opțiune ar trebui utilizată numai cu grijă, în cazurile în care ați făcut anumite acțiuni speciale care să garanteze că erorile de linker nu sunt adecvate.

--no-ansamblu-arhivă

Dezactivați efectul opțiunii - full-archive pentru următoarele fișiere de arhivă.

--noinhibit-exec

Păstrați fișierul de ieșire executabil ori de câte ori este încă utilizabil. În mod normal, linkerul nu va produce un fișier de ieșire dacă întâmpină erori în timpul procesului de conectare; acesta iese fără scrierea unui fișier de ieșire atunci când emite orice eroare.

-nostdlib

Doar directoare de bibliotecă de căutare specificate explicit pe linia de comandă. Bibliotecile specificate în script-urile de link-uri (inclusiv script-urile de link-uri specificate pe linia de comandă) sunt ignorate.

- formatul de ieșire formatat

ld poate fi configurat pentru a suporta mai mult de un fel de fișier obiect. Dacă ld este configurat în acest fel, puteți utiliza opțiunea --oformat pentru a specifica formatul binar pentru fișierul obiect de ieșire. Chiar și atunci când ld este configurat să suporte formate alternative de obiect, de obicei, nu trebuie să specificați acest lucru, deoarece ld ar trebui configurat să producă ca format de ieșire implicit cel mai obișnuit format pe fiecare aparat. formatul de ieșire este un șir de text, denumirea unui anumit format acceptat de bibliotecile BFD. (Aveți posibilitatea să listați formatele binare disponibile cu objdump -i .) Comanda script "OUTPUT_FORMAT" poate specifica, de asemenea, formatul de ieșire, dar această opțiune o suprascrie.

-qmagic

Această opțiune este ignorată pentru compatibilitatea cu Linux.

-Qy

Această opțiune este ignorată pentru compatibilitatea SVR4.

--relaxa

O opțiune cu efecte dependente de mașină. Această opțiune este acceptată numai pentru câteva obiective.

Pe unele platforme, opțiunea --relax efectuează optimizări globale care devin posibile atunci când linkerul rezolvă adresarea în program, cum ar fi relaxarea modurilor de adresă și sintetizarea de noi instrucțiuni în fișierul obiect de ieșire.

Pe unele platforme, aceste optimizări globale ale timpului de legătură pot face imposibilă depanarea simbolică a executabilului rezultat. Acest lucru este cunoscut pentru cazul familiei de procesoare Matsushita MN10200 și MN10300.

Pe platforme unde acest lucru nu este acceptat, --relax este acceptat, dar este ignorat.

- reține-simboluri-fișier numele fișierului

Păstrați numai simbolurile listate în fișierul de fișier , aruncând toate celelalte. numele fișierului este pur și simplu un fișier plat, cu un singur nume de simbol pe linie. Această opțiune este utilă în special în medii (cum ar fi VxWorks) unde se acumulează treptat o masă globală de simboluri globale, pentru a conserva memoria de rulare.

- reține-simboluri-fișierul nu elimină simbolurile nedefinite sau simbolurile necesare pentru relocări.

Puteți să specificați numai - reține-simboluri-fișier o dată în linia de comandă. Se suprascrie - s și -S .

-directia dir

Adăugați un director în calea de căutare a bibliotecii runtime. Acest lucru este folosit atunci când un ELFexecutable cu obiecte partajate. Argumentele pentru toate rapoartele sunt concatenate și transmise link-ului de execuție, care le utilizează pentru a localiza obiecte partajate în timpul rulării. Opțiunea -rath este de asemenea utilizată atunci când găsiți obiecte partajate care sunt necesare de obiecte partajate explicit incluse în link; consultați descrierea opțiunii " rpath-link" . Dacă nu este folosită rpath atunci când se leagă un executabil ELF, conținutul variabilei de mediu "LD_RUN_PATH" va fi utilizat dacă este definit.

Opțiunea -rath poate fi folosită și pe SunOS. În mod implicit, pe SunOS, linkerul va forma un patch de căutare runtime din toate opțiunile -L pe care le este dat. Dacă se folosește opțiunea -rath , calea de căutare runtime va fi formată exclusiv folosind opțiunile -rpath , ignorând opțiunile -L . Acest lucru poate fi util atunci când se utilizează gcc, care adaugă multe opțiuni -L, care pot fi sisteme de fișiere montate pe NFS.

Pentru compatibilitatea cu alte link-uri ELF, dacă opțiunea -R este urmată de un nume de director, mai degrabă decât de un nume de fișier, este tratată ca opțiunea -rpath .

-rpath-link DIR

Când utilizați ELF sau SunOS, o bibliotecă partajată poate necesita o altă bibliotecă. Acest lucru se întâmplă atunci când o legătură "ld-shared" include o bibliotecă partajată ca unul dintre fișierele de intrare.

Atunci când linkerul întâlnește o astfel de dependență atunci când face o legătură ne-comună, care nu poate fi mutată, va încerca automat să localizeze biblioteca partajată necesară și să o includă în legătură, dacă nu este inclusă în mod explicit. Într-un astfel de caz, opțiunea -rpath-link specifică primul set de directoare pentru căutare. Opțiunea " rpath-link" poate specifica o secvență de nume de directoare fie prin specificarea unei liste de nume separate prin colonii, fie prin apariția de mai multe ori.

Această opțiune ar trebui utilizată cu prudență, deoarece suprascrie calea de căutare care poate fi compilată într-o bibliotecă partajată. Într-un astfel de caz, este posibil să se folosească neintenționat o cale de căutare diferită decât link-ul runtime-ului.

Linkerul folosește următoarele căi de căutare pentru a găsi bibliotecile partajate necesare.

1.

Toate directoarele specificate de opțiunile "rpath-link" .

2.

Toate directoarele specificate de opțiunile " rpath" . Diferența dintre rpath și -rpath-link este că directoarele specificate de opțiunile " -path" sunt incluse în executabil și folosite la rulare, în timp ce opțiunea -rpath-link este eficientă numai la timpul de conectare. Este doar pentru linkerul nativ.

3.

Pe un sistem ELF, dacă opțiunile "rpath" și "rpath-link" nu au fost utilizate, căutați conținutul variabilei de mediu "LD_RUN_PATH". Este doar pentru linkerul nativ.

4.

În SunOS, dacă opțiunea " rpath" nu a fost utilizată, căutați orice directoare specificate utilizând opțiunile " L" .

5.

Pentru un linker nativ, conținutul variabilei de mediu "LD_LIBRARY_PATH".

6.

Pentru un linker ELF nativ, directoarele din "DT_RUNPATH" sau "DT_RPATH" ale unei biblioteci partajate sunt căutate pentru bibliotecile partajate necesare. Înregistrările "DT_RPATH" sunt ignorate dacă există intrări "DT_RUNPATH".

7.

Directoarele implicite, în mod normal / lib și / usr / lib .

8.

Pentru un linker nativ pe un sistem ELF, dacă fișierul /etc/ld.so.conf există, lista directoarelor găsite în acel fișier.

Dacă biblioteca partajată necesară nu este găsită, linkerul va emite un avertisment și va continua cu linkul.

-impartit

-Bshareable

Creați o bibliotecă partajată. Acest lucru este în prezent acceptat numai pe platformele ELF, XCOFF și SunOS. Pe SunOS, linkerul va crea automat o bibliotecă partajată dacă opțiunea -e nu este utilizată și există simboluri nedefinite în legătură.

--sort-comună

Această opțiune le spune ld să sorteze simbolurile comune după mărime atunci când le plasează în secțiunile de ieșire corespunzătoare. Mai întâi veniți toate simbolurile de un octet, apoi cele două octeți, apoi cele patru octeți și apoi orice altceva. Aceasta este pentru a preveni decalajele dintre simboluri datorită constrângerilor de aliniere.

--split-by-file [ dimensiune ]

Similar cu -split-by-reloc, dar creează o nouă secțiune de ieșire pentru fiecare fișier de intrare atunci când dimensiunea este atinsă. dimensiunea implicită la o mărime de 1 dacă nu este dată.

--split-by-reloc [ număr ]

Se testează pentru a crea secțiuni suplimentare în fișierul de ieșire, astfel încât nici o singură secțiune de ieșire din fișier să nu conțină mai mult decât numărul de relocări. Acest lucru este util atunci când se generează fișiere uriașe care pot fi mutate pentru a fi descărcate în anumite kernel-uri în timp real cu formatul de fișier obiect COFF; deoarece COFF nu poate reprezenta mai mult de 65535 relocări într-o singură secțiune. Rețineți că aceasta nu va funcționa cu formate de fișiere obiect care nu acceptă secțiuni arbitrare. Linkerul nu va împărți secțiunile de intrare individuale pentru redistribuire, deci dacă o singură secțiune de intrare conține mai multe relocări de numărare, o secțiune de ieșire va conține multe relocări. numără valori implicite la o valoare de 32768.

--stats

Calculați și afișați statistici despre funcționarea linkerului, cum ar fi timpul de execuție și utilizarea memoriei.

--traditional format

Pentru unele ținte, ieșirea lui ld este diferită în anumite privințe de ieșirea unui linker existent. Acest comutator cere ld să folosească în schimb formatul tradițional.

De exemplu, pe SunOS, ld combină intrările duplicate în tabela cu simboluri de simboluri. Acest lucru poate reduce dimensiunea unui fișier de ieșire cu informații complete de depanare cu peste 30%. Din păcate, programul SunOS "dbx" nu poate citi programul rezultat ("gdb" nu are probleme). Comutatorul cu format tradițional spune că ld nu trebuie să combine intrările duplicate.

- secțiune -start sectionname = org

Găsiți o secțiune în fișierul de ieșire la adresa absolută dată de org . Puteți utiliza această opțiune de câte ori este necesar pentru a localiza mai multe secțiuni în linia de comandă. org trebuie să fie un număr întreg hexazecimal; pentru compatibilitatea cu alte linkere, puteți omite 0x de conducere asociat de obicei cu valori hexazecimale. Notă: nu trebuie să existe un spațiu alb între numele secțiunii , semnul egal (`` = '') și org .

-Tbss org

-Tdata org

-Tr. Org

Utilizați orgul ca adresă de pornire pentru --- respectiv --- "bss", "data" sau "textul" segmentului fișierului de ieșire. org trebuie să fie un număr întreg hexazecimal; pentru compatibilitatea cu alte linkere, puteți omite 0x de conducere asociat de obicei cu valori hexazecimale.

--dll-verbose

--verbose

Afișați numărul versiunii pentru ld și listați emulațiile linkerului acceptate. Afișați fișierele de intrare care pot fi deschise și nu pot fi deschise. Afișați scriptul de linker folosit de linker.

--version-script = versiunea-scriptfile

Specificați numele unui script de versiune la linker. Acest lucru este folosit în mod obișnuit atunci când creați biblioteci partajate pentru a specifica informații suplimentare despre heirarhia versiunii pentru biblioteca creată. Această opțiune este semnificativă doar pentru platformele ELF care acceptă bibliotecile partajate.

--warn-comună

Avertizați când un simbol comun este combinat cu un alt simbol comun sau cu o definiție a simbolului. Link-urile Unix permit această practică oarecum neclară, dar link-urile pe alte sisteme de operare nu. Această opțiune vă permite să găsiți probleme potențiale din combinarea simbolurilor globale. Din păcate, unele biblioteci C utilizează această practică, astfel încât este posibil să primiți câteva avertismente despre simboluri atât în ​​biblioteci, cât și în programele dvs.

Există trei tipuri de simboluri globale, ilustrate aici prin exemplele C:

int i = 1;

O definiție, care merge în secțiunea de date inițializată a fișierului de ieșire.

extern int i;

O referință nedefinită, care nu alocă spațiu. Trebuie să existe fie o definiție, fie un simbol comun pentru variabila undeva.

int i;

Un simbol comun. Dacă există doar una sau mai multe simboluri comune pentru o variabilă, aceasta se află în zona de date neinitializată a fișierului de ieșire. Linkerul îmbină mai multe simboluri comune pentru aceeași variabilă într-un singur simbol. Dacă au dimensiuni diferite, alege cea mai mare dimensiune. Linkerul transformă un simbol comun într-o declarație, dacă există o definiție a aceleiași variabile.

Opțiunea - avertisment-comună poate produce cinci tipuri de avertismente. Fiecare avertizare constă dintr-o pereche de linii: prima descrie simbolul întâlnit și cel de-al doilea descrie simbolul anterior întâlnit cu același nume. Unul sau ambele simboluri vor fi un simbol comun.

1.

Transformarea unui simbol comun într-o referință, deoarece există deja o definiție a simbolului.

(): avertisment: comun al "" înlocuit prin definiție (
):

2.

Transformarea unui simbol comun într-o referință, deoarece se întâlnește o definiție ulterioară a simbolului. Acesta este același lucru cu cel precedent, cu excepția faptului că simbolurile sunt întâlnite într-o ordine diferită.

(): avertisment: definirea "" suprasolicitând common (
): warning: common

3.

Îmbinarea unui simbol comun cu un simbol comun de același tip.

(): avertisment: mai multe comune ale < (
): avertisment:

4.

Îmbinarea unui simbol comun cu un simbol comun mai mare anterior.

(): avertisment: comun al "" înlocuit de mai mare (): avertisment:

5.

Îmbinarea unui simbol comun cu un simbol comun anterior mai mic. Acesta este același lucru cu cel precedent, cu excepția faptului că simbolurile sunt întâlnite într-o ordine diferită.

(): avertisment: common of ` 'suprasolicitând (
) mai mic: avertisment:

--warn constructori

Avertizați dacă sunt utilizați constructori globali. Acest lucru este util doar pentru câteva formate de fișier obiect. Pentru formate precum COFF sau ELF, linkerul nu poate detecta utilizarea constructorilor globali.

--warn-multiple-gp

Avertizați dacă sunt necesare mai multe valori ale indicatorului global în fișierul de ieșire . Acest lucru este semnificativ doar pentru anumiți procesatori, cum ar fi Alpha. În mod specific, unii procesori plasează constante cu valoare mare într-o secțiune specială. Un registru special (indicatorul global) indică în mijlocul acestei secțiuni, astfel încât constantele să poată fi încărcate eficient printr-un mod de adresare relativă de bază. Deoarece decalajul în modul relativă de bază este fix și relativ mic (de exemplu, 16 biți), acest lucru limitează dimensiunea maximă a bazei constante. Astfel, în programele mari, este adesea necesar să se utilizeze mai multe valori globale ale indicelui pentru a putea aborda toate constantele posibile. Această opțiune face ca un avertisment să fie emis ori de câte ori apare acest caz.

--warn- o dată

Avertizați o singură dată pentru fiecare simbol nedefinit, mai degrabă decât o dată pe modul care se referă la acesta.

--warn-sectiune-align

Avertizați dacă adresa unei secțiuni de ieșire este modificată din cauza alinierii. În mod obișnuit, alinierea va fi setată de o secțiune de intrare. Adresa va fi modificată numai dacă nu este specificată explicit; adică dacă comanda "SECTIONS" nu specifică o adresă de pornire pentru secțiune.

--whole-arhiva

Pentru fiecare arhivă menționată în linia de comandă după opțiunea --while-archive , includeți fiecare fișier obiect din arhiva în link, mai degrabă decât căutarea arhivei pentru fișierele obiect necesare. Acest lucru este folosit în mod normal pentru a transforma un fișier de arhivă într-o bibliotecă partajată, forțând fiecare obiect să fie inclus în biblioteca partajată rezultată. Această opțiune poate fi utilizată de mai multe ori.

Două note când se utilizează această opțiune din gcc: Mai întâi, gcc nu știe despre această opțiune, deci trebuie să utilizați -Wl, -whole-archive . În al doilea rând, nu uitați să utilizați -Wl, -no-întreg-arhivă după lista de arhive, deoarece gcc va adăuga propria listă de arhive la link-ul dvs. și este posibil să nu doriți ca acest steag să le afecteze și pe acestea.

- simbolul garniturii

Utilizați o funcție de împachetare pentru simbol . Orice referință nedefinită la simbol va fi rezolvată la "__ wrap_symbol". Orice referință nedefinită la "__real_symbol" va fi rezolvată ca simbol .

Aceasta poate fi utilizată pentru a furniza un pachet pentru o funcție de sistem. Funcția de înfășurare ar trebui să fie numită "__wrap_symbol". Dacă dorește să apeleze funcția sistemului, ar trebui să sune "__ real_symbol".

Iată un exemplu trivial:

void * __wrap_malloc (int c) {printf ("malloc numit cu% ld \ n", c); retur __real_malloc (c); }

Dacă legați alt cod cu acest fișier utilizând --wrap malloc , atunci toate apelurile către "malloc" vor apela funcția "__wrap_malloc". Apelul la "__real_malloc" în "__wrap_malloc" va apela funcția reală "malloc".

S-ar putea să doriți să oferiți și o funcție "__real_malloc", astfel încât linkurile fără opțiunea -wrap să reușească. Dacă faceți acest lucru, nu ar trebui să puneți definiția "__ real_malloc" în același fișier ca "__wrap_malloc"; dacă se întâmplă, asamblorul poate rezolva apelul înainte ca linkerul să aibă șansa să-l înfășoare în "malloc".

--enable-noi-dtags

--disable-noi-dtags

Acest linker poate crea noile etichete dinamice în ELF. Dar sistemele ELF mai vechi ar putea să nu le înțeleagă. Dacă specificați --enable-new-dtags , etichetele dinamice vor fi create după cum este necesar. Dacă specificați --disable-new-dtags , nu vor fi create noi etichete dinamice. În mod prestabilit, noile etichete dinamice nu sunt create. Rețineți că aceste opțiuni sunt disponibile numai pentru sistemeleELF.

Linkerul i386 PE acceptă opțiunea partajată , care determină ca ieșirea să fie o bibliotecă (DLL) conectată dinamic în loc de executabil normal. Ar trebui să denumiți ieșirea "* .dll" atunci când utilizați această opțiune. În plus, linkerul acceptă pe deplin fișierele standard "* .def", care pot fi specificate pe linia de comandă a linkerului ca un fișier obiect (de fapt ar trebui să preceadă arhivele pe care le exportă din simboluri, pentru a se asigura că sunt conectate, la fel ca un fișier obișnuit de obiect).

În plus față de opțiunile comune pentru toate țintele, link-ul i386 PE suportă opțiuni de linii de comandă suplimentare care sunt specifice destinației i386 PE. Opțiunile care iau valori pot fi separate de valorile lor fie printr-un spațiu, fie printr-un semnal egal.

--add-stdcall-alias

Dacă sunt date, simbolurile cu un sufix stdcall (@nn) vor fi exportate ca-este și, de asemenea, cu sufixul dezbrăcat.

- fișier de fișier-bază

Utilizați fișierul ca numele unui fișier în care să salvați adresele de bază ale tuturor relocațiilor necesare pentru generarea DLL-urilor cu dlltool .

--dll

Creați un DLL în locul unui executabil obișnuit. Puteți utiliza, de asemenea, partajat sau specificați o "LIBRARE" într-un fișier ".def" dat.

--enable-stdcall-fixup

--disable-stdcall-fixup

Dacă link-ul găsește un simbol pe care nu-l poate rezolva, va încerca să facă "link-ul fuzzy", căutând un alt simbol definit care diferă doar în formatul numelui de simbol (cdecl vs stdcall) și va rezolva simbolul prin legarea la meci. De exemplu, simbolul nedefinit "_foo" poate fi legat de funcția "_foo @ 12", sau simbolul nedefinit "_bar @ 16" poate fi legat de funcția "_bar". Când linkerul face acest lucru, acesta tipărește un avertisment, deoarece în mod normal ar fi trebuit să nu se leagă, dar uneori importul de biblioteci generate de dll-uri de la terți poate necesita utilizarea acestei caracteristici. Dacă specificați --enable-stdcall-fixup , această caracteristică este activată pe deplin și avertismentele nu sunt tipărite. Dacă specificați --disable-stdcall-fixup , această caracteristică este dezactivată și astfel de neconcordanțe sunt considerate a fi erori.

--export-all simboluri

Dacă sunt date, toate simbolurile globale din obiectele folosite pentru a construi un DLL vor fi exportate de DLL. Rețineți că aceasta este valoarea implicită dacă nu există alte simboluri exportate. Atunci când simbolurile sunt exportate în mod explicit prin fișiere DEF sau exportate implicit prin atributele funcțiilor, implicit este de a nu exporta nimic altceva dacă această opțiune nu este dată. Rețineți că simbolurile "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12" și "impure_ptr" nu vor fi exportate automat. De asemenea, simbolurile importate din alte DLL-uri nu vor fi reexportate, nici simbolurile care specifică aspectul intern al DLL, cum ar fi cele care încep cu "_head_" sau se termină cu "_iname". În plus, nu vor fi exportate simboluri din "libgcc", "libstd ++", "libmingw32" sau "crtX.o". Simbolurile ale căror nume încep cu "__rtti_" sau "__builtin_" nu vor fi exportate, pentru a ajuta la DLL-urile C ++. În cele din urmă, există o listă extinsă de simboluri cygwin-private care nu sunt exportate (evident, acest lucru se aplică atunci când se construiesc DLL-uri pentru obiectivele cygwin).

Aceste excluse de la cygwin sunt: ​​"_cygwin_dll_entry @ 12", "_cygwin_crt0_common @ 8", "_cgwin_premain1", "cygwin_premain2", "cygwin_premain3" "și" mediu ".

- exclude-simboluri simbol , simbol , ...

Specifică o listă de simboluri care nu ar trebui exportate automat. Numele de simboluri pot fi delimitate de virgule sau de colonii.

-exclude-libs lib , lib , ...

Specifică o listă de biblioteci de arhivă, din care simbolurile nu ar trebui să fie exportate automat. Numele bibliotecii pot fi delimitate prin virgulă sau prin colon. Specificarea "--exclude-libs ALL" exclude simbolurile din toate bibliotecile de arhive din exportul automat. Simbolurile enumerate explicit într-un fișier .def sunt încă exportate, indiferent de această opțiune.

--file-aliniere

Specificați alinierea fișierelor. Secțiunile din fișier vor începe întotdeauna la offseturile de fișiere care reprezintă multipli ai acestui număr. Această valoare implicită este de 512.

- rezerva de rezervă

- Rezervă , comite

Specificați cantitatea de memorie pe care doriți să o rezervați (și opțiunea de angajare opțională) pentru a fi folosită ca morman pentru acest program. Valoarea prestabilită este 1Mb rezervată, 4K angajată.

- valoare de bază a imaginii

Utilizați valoarea ca adresă de bază a programului sau dll-ului. Aceasta este cea mai mică locație de memorie care va fi utilizată atunci când programul sau dll-ul este încărcat. Pentru a reduce necesitatea relocării și a îmbunătăți performanța dll-urilor dvs., fiecare trebuie să aibă o adresă de bază unică și să nu se suprapună cu alte dll-uri. Valoarea prestabilită este 0x400000 pentru executabile și 0x10000000 pentru dll-uri.

--kill-at

Dacă sunt date, sufixele stdcall (@nn) vor fi scoase din simboluri înainte de a fi exportate.

- valoarea maximă a imaginii

Setează numărul major al "versiunii imaginii". Implicit la 1.

--major-os-versiune valoare

Setează numărul major al versiunii `` os ''. Valoare implicită la 4.

- valoarea versiunii majorității subsistemului

Setează numărul major al versiunii `` subsistemului ''. Valoare implicită la 4.

- valoarea minore-imagine-versiune

Setează numărul minor al `` versiunii imaginii ''. Valoare implicită la 0.

- valoarea minor-os-versiune

Setează numărul minor al versiunii "os". Valoare implicită la 0.

- valoare minime-subsistem-versiune

Setează numărul minor al versiunii subsistemului. Valoare implicită la 0.

- fișierul de ieșire-def

Linkerul va crea fișierul de fișiere care va conține un fișier DEF corespunzător DLL-ului care generează link-ul. Acest fișier DEF (care ar trebui să fie numit ".def") poate fi folosit pentru a crea o bibliotecă de import cu "dlltool" sau poate fi folosit ca referință la simbolurile exportate automat sau implicit.

- fișier impus

Linker-ul va crea fișierul de fișiere care va conține un lib de import corespunzător DLL-ului care generează link-ul. Acest lib import (care ar trebui să fie numit "* .dll.a" sau "* .a") poate fi folosit pentru a lega clienții împotriva DLL-ului generat; acest comportament face posibilă săriți un pas separat "dlltool" de creare a bibliotecii de import.

--enable-auto-image-base

Alegeți automat baza de imagine pentru DLL-uri, cu excepția cazului în care se specifică utilizând argumentul "--image-base". Prin utilizarea unui hash generat din numele dll pentru a crea baze de imagine unice pentru fiecare DLL, se pot evita coliziunile și relocările în memorie care pot întârzia executarea programului.

--disable-auto-image-base

Nu generați automat o bază de imagini unică. Dacă nu există o bază de imagini specificată de utilizator ("--image-base"), utilizați platforma implicită.

-dll-search- string prefix

Când conectați dinamic la un DLL fără o bibliotecă de import, căutați " .dll" preferând "lib .dll". Acest comportament permite distincția ușoară între DLL-uri construite pentru diferite subproducții: native, cygwin, uwin, pw etc. De exemplu, DLL-urile cygwin folosesc de obicei "-dll-search-prefix = cyg".

--enable-auto-import

Legarea sofisticată a "_symbol" la "__imp__symbol" pentru importarea DATELOR din DLL-uri și crearea simbolurilor necesare în timpul construirii bibliotecilor de import cu acele DATAexporturi. În general, acest lucru "va funcționa" - dar uneori puteți vedea acest mesaj:

"variabilă" "nu poate fi importată automat. Citiți documentația pentru" --ableable-auto-import "pentru detalii."

Acest mesaj are loc atunci când o anumită (sub) expresie accesează o adresă dată în cele din urmă de suma a două constante (tabelele de import Win32 permit numai una). Situațiile în care acest lucru poate apărea include accesul la câmpurile membre ale variabilelor structurale importate dintr-un DLL, precum și utilizarea unui index constant într-o variabilă de array importată dintr-un DLL. Orice variabilă multiword (arrays, structs, long long, etc) poate declanșa această condiție de eroare. Cu toate acestea, indiferent de tipul exact de date al variabilei exportate, ld o va detecta întotdeauna, va emite avertizarea și va ieși.

Există mai multe modalități de abordare a acestei dificultăți, indiferent de tipul de date al variabilei exportate:

O modalitate este să utilizați comutatorul --enable-runtime-pseudo-reloc. Acest lucru lasă sarcina de ajustare a referințelor în codul dvs. de client pentru mediul de rulare, astfel încât această metodă funcționează numai atunci când mediul de runtime acceptă această caracteristică.

O a doua soluție este de a forța una dintre "constante" să fie o variabilă --- care este, necunoscută și ne-optimizabilă la momentul compilării. Pentru matrice există două posibilități: a) transformarea indexee (adresa matricei) într-o variabilă sau b) transformarea indexului "constant" într-o variabilă. Prin urmare:

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

sau

tip extern extern_array []; extern_array [1] -> {volatilă int t = 1; extern_array [t]}

Pentru structurile (și majoritatea celorlalte tipuri de date cu mai multe cuvinte), singura opțiune este aceea de a face variabila structură (sau lungă lungă sau ...)

structură externă extern_struct; extern_struct.field -> {volatile struct s * t = & extern_struct; t-> câmp}

sau

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

O a treia metodă de abordare a acestei dificultăți este abandonarea "auto-importului" pentru simbolul infracțional și marcarea acestuia cu "__declspec (dllimport)". Cu toate acestea, în practică, care necesită utilizarea #defines de compilare-timp pentru a indica dacă construiți un DLL, construiți un cod client care va face legătura cu DLL-ul sau doar construirea / conectarea la o bibliotecă statică. Pentru a alege între diferitele metode de rezolvare a problemei "adresă directă cu o constantă decalaj", trebuie să luați în considerare utilizarea tipică în lumea reală:

Original:

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

Soluția 1:

--foo.h externă int arr []; --foo.c #include "foo.h" void principal (int argc, char ** argv) {/ * Această soluție este pentru win32 și cygwin; nu "optimizați" * / volatile int * parr = arr; printf ( "% d \ n", parr [1]); }

Soluția 2:

--foo.h / * Notă: se presupune că este auto-export (nu __declspec (dllexport)) * / #if (definit (_WIN32) || definit (__CYGWIN__)) && \! (definit (FOO_BUILD_DLL) )) #define FOO_IMPORT __declspec (dllimport) #lază #define FOO_IMPORT #endif extern FOO_IMPORT int arr []; --foo.c #include "foo.h" void principal (int argc, char ** argv) {printf ("% d \ n", arr [1]); }

O a patra modalitate de a evita această problemă este să re- codați biblioteca să utilizeze o interfață funcțională mai degrabă decât o interfață de date pentru variabilele ofensatoare (de exemplu, set_foo () și get_foo () funcții accessor).

--disable-auto-import

Nu încercați să faceți legătura sofisticată dintre "_symbol" și "__imp__symbol" pentru DATAimports din DLL-uri.

--enable-rulare pseudo-Relocare

Dacă codul dvs. conține expresii descrise în secțiunea --enable-auto-import, adică DATAimports din DLL cu offset diferit de zero, acest comutator va crea un vector de "pseudo relocations runtime" care poate fi folosit de mediul de runtime pentru a ajusta referințele la astfel de date în codul dvs. de client.

--disable-rulare pseudo-Relocare

Nu creați pseudo relocații pentru importurile DATA de la zero, care nu sunt zero, din DLL-uri. Acesta este setarea implicită.

--enable-extra-pe-debug

Afișați informații suplimentare despre depanare legate de emiterea simbolurilor auto-import.

--section-aliniere

Setează alinierea secțiunii. Secțiunile din memorie vor începe întotdeauna la adrese care sunt multiple ale acestui număr. Valori prestabilite la 0x1000.

- rezerva de rezervă

- rezervați , obligați

Specificați cantitatea de memorie pe care doriți să o rezervați (și opțiunea de angajare opțională) pentru a fi folosită ca stivă pentru acest program. Valoarea implicită este 2Mb rezervată, 4K angajată.

- subsisteme care

- subsistemul care : major

- subsistemul care : major . minor

Specifică subsistemul în care va executa programul dvs. Valorile legale pentru care sunt "nativ", "ferestre", "consola" și "posix". Puteți seta opțional și versiunea subsistemului.

Important: Utilizați comanda om ( % man ) pentru a vedea cum se utilizează o comandă pe computerul dvs. particular.