Linux / Unix Command: Id

NAAM

ld - Gebruik LD , die GNU linker

SINOPSIS

ld [ opsies ] objfile ...

BESKRYWING

ld kombineer 'n aantal voorwerpe en argieflêers, verplaas hul data en verbind simboolverwysings. Die laaste stap in die opstel van 'n program is gewoonlik ld .

ld aanvaar Linker Command Language lêers geskryf in 'n superset van AT & T se Link Editor Command Language sintaksis, om eksplisiete en totale beheer oor die koppelingsproses te verskaf.

Hierdie manblad beskryf nie die beveltaal nie; sien die ld- inskrywing in "info", of die handleiding ld: die GNU linker, vir volledige besonderhede oor die beveltaal en ander aspekte van die GNU linker.

Hierdie weergawe van ld gebruik die algemene doel BFD biblioteke om te werk op objek lêers. Dit stel ld in staat om voorwerplêers te lees, kombineer en skryf in baie verskillende formate --- byvoorbeeld, COFF of "a.out". Verskillende formate kan met mekaar verbind word om enige beskikbare soort voorwerplêer te produseer.

Afgesien van sy buigsaamheid, is die GNU linker meer behulpsaam as ander skakelaars in die verskaffing van diagnostiese inligting. Baie skakelaars verlaat onmiddellik uitvoering wanneer hulle 'n fout ervaar; As dit moontlik is, sal ld voortgaan met die uitvoering van ander foute (of, in sommige gevalle, om 'n uitvoerlêer te kry ten spyte van die fout).

Die GNU linker ld is bedoel om 'n wye verskeidenheid situasies te dek, en so verenigbaar met ander skakelaars te wees. As gevolg daarvan het jy baie keuses om sy gedrag te beheer.

OPTIONS

Die skakelaar ondersteun 'n oorvloed van command line opsies , maar in die praktyk word min van hulle gebruik in enige spesifieke konteks. Byvoorbeeld, 'n gereelde gebruik van ld is om standaard Unix-voorwerplêers te koppel aan 'n standaard, ondersteunde Unix-stelsel . Op so 'n stelsel, om 'n lêer 'hello.o' te koppel:

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

Dit vertel ld om 'n lêer genaamd uitvoer te produseer as gevolg van die koppeling van die lêer "/lib/crt0.o" met "hello.o" en die biblioteek "libc.a", wat van die standaard soektogboeke sal kom. (Sien die bespreking van die -l opsie hieronder.)

Sommige van die opdraglynopsies na ld kan op enige punt in die opdraglyn gespesifiseer word. Opsies wat verwys na lêers, soos -l of -T , veroorsaak dat die lêer gelees word op die punt waarop die opsie in die opdraglyn verskyn, relatief tot die voorwerplêers en ander lêeropsies. Herhaling van nie-lêer opsies met 'n ander argument sal ook geen verdere effek hê nie, of die vorige gebeure (dié verder aan die linkerkant van die opdraglyn) van daardie opsie oorskry. Opsies wat meer as een sinvol gespesifiseer kan word, word in die beskrywings hieronder aangetoon.

Argumente sonder opsie is voorwerplêers of argiewe wat saam gekoppel moet word. Hulle kan volg, voorafgaan of gemeng word met opsies vir die opsies, behalwe dat 'n objeklêer-argument nie tussen 'n opsie en sy argument geplaas kan word nie.

Gewoonlik word die skakelaar aangewys met ten minste een objeklêer, maar jy kan ander vorms van binêre insetlêers spesifiseer met behulp van -l , -R , en die script-opdragtaal. As daar geen binêre insetslêers gespesifiseer word nie, lewer die skakelaar geen uitset nie en word die boodskap Geen insetlêers uitgereik nie .

As die skakelaar nie die formaat van 'n objeklêer kan herken nie, sal dit aanneem dat dit 'n skakelscript is. 'N Skrip wat op hierdie manier gespesifiseer word, vergroot die hoofskakel-skrip wat gebruik word vir die skakel (óf die standaard skakelscript of die een wat gespesifiseer word deur -T ). Hierdie funksie laat die linker toe om te skakel teen 'n lêer wat blyk te wees 'n voorwerp of 'n argief, maar eintlik net enkele simboolwaardes, of gebruik "INPUT" of "GROUP" om ander voorwerpe te laai. Let daarop dat die spesifikasie van 'n skrif op hierdie manier slegs die hoofskakelprogram vermeerder; Gebruik die -T opsie om die standaard linker script heeltemal te vervang.

Vir opsies wie se name 'n enkele letter is, moet opsie-argumente die opsiebrief volg sonder om witspasie te betree, of as afsonderlike argumente gegee word onmiddellik na die opsie wat dit benodig.

Vir opsies wie se name meer as een letter is, kan een opsie of twee die opsie naam voorafgaan; Byvoorbeeld, -trace-simbool en -trace-simbool is ekwivalent. Let wel - daar is een uitsondering op hierdie reël. Meervoudige letteropsies wat begin met 'n kleinletter 'o' kan slegs met twee streepies voorafgegaan word. Dit is om verwarring met die -o opsie te verminder. So byvoorbeeld: -omagies stel die uitvoerlêernaam na magie terwyl --omagic die NMAGIC-vlag op die uitset stel.

Argumente vir veelvuldige letteropsies moet óf van die opsienaam geskei word met 'n gelyke teken, óf as afsonderlike argumente gegee word onmiddellik na die opsie wat dit vereis. Byvoorbeeld, -trace-simbool foo en -trace-simbool = foo is ekwivalent. Unieke afkortings van die name van meervoudige letteropsies word aanvaar.

Let wel: as die skakelaar indirek aangewend word, dan moet u al die opsies vir die linker-opdraglyn voorskryf deur -Wl, (of wat ook al vir die betrokke samesteller-bestuurder geskik is), soos volg:

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

Dit is belangrik, want anders kan die kompilatorbestuurderprogram die linker opsies stilweg laat val, wat lei tot 'n slegte skakel.

Hier is 'n tabel van die generiese command line skakelaars aanvaar deur die GNU linker:

-'n navraag

Hierdie opsie word ondersteun vir HP / UX-verenigbaarheid. Die navraag argument moet een van die stringe argief , gedeelde of verstek wees . -aarchive is funksioneel ekwivalent aan -Bstatic , en die ander twee sleutelwoorde is funksioneel gelykstaande aan -Bdynamic . Hierdie opsie mag enige aantal kere gebruik word.

- ' n argitektuur

- argitektuur = argitektuur

In die huidige weergawe van ld , is hierdie opsie slegs nuttig vir die Intel 960 familie van argitektuur. In die ld- konfigurasie, identifiseer die argitektuurargument die spesifieke argitektuur in die 960-familie, wat sekere beveiligingsmaatreëls moontlik maak en die argief-biblioteek se soekpad verander.

Toekomstige vrystellings van ld kan soortgelyke funksionaliteit vir ander argitektuurfamilies ondersteun.

-b invoer-formaat

--format = invoer-formaat

ld kan gekonfigureer word om meer as een soort objeklêer te ondersteun. As u ld op hierdie manier gekonfigureer is, kan u die -b opsie gebruik om die binêre formaat vir insetvoorwerplêers wat hierdie opsie volg op die opdraglyn te spesifiseer. Selfs wanneer ld gekonfigureer is om alternatiewe objekformate te ondersteun, moet u dit gewoonlik nie spesifiseer nie, aangesien LD moet gekonfigureer word om as standaard invoerformaat die mees algemene formaat op elke masjien te verwag. Invoer-formaat is 'n teksstring, die naam van 'n spesifieke formaat wat deur die BFD-biblioteke ondersteun word. (Jy kan die beskikbare binêre formate met objdump -i optel .)

U kan hierdie opsie gebruik as u lêers koppel met 'n ongewone binêre formaat. U kan ook gebruik -b om eksplisiet te verander (wanneer objeklêers van verskillende formate verbind word), deur -b- invoerformaat voor elke groep voorwerplêers in 'n spesifieke formaat in te sluit.

Die standaardformaat is geneem uit die omgewingsveranderlike "GNUTARGET".

U kan ook die invoerformaat van 'n skrif definieer, met die opdrag "TARGET";

-c MRI-opdragfile

- mri-script = MRI-command file

Vir die verenigbaarheid met skakelaars wat deur MRI vervaardig word, aanvaar ld skriplêers wat geskryf is in 'n alternatiewe, beperkte opdragtaal, wat in die MRI Compatible Script Files-afdeling van GNU ld dokumentasie beskryf word. Stel MRR-skriplêers bekend met die opsie -c ; Gebruik die -T opsie om skripsies te skryf wat geskryf is in die algemene ld- scripttaal. As MRI-cmdfile nie bestaan ​​nie, soek ld dit in die dopgehou wat deur enige -L opsies gespesifiseer word.

d

-dc

-dp

Hierdie drie opsies is ekwivalent; verskeie vorms word ondersteun vir verenigbaarheid met ander skakelaars. Hulle gee ruimte aan algemene simbole, selfs al is 'n verplaasbare uitvoerlêer gespesifiseer (met -r ). Die script bevel "FORCE_COMMON_ALLOCATION" het dieselfde effek.

-'n inskrywing

--entry = toegang

Gebruik inskrywing as die eksplisiete simbool vir die begin van die uitvoering van u program, eerder as die standaard toegangspunt. As daar geen simbool genoem word nie , sal die skakelaar die inskrywing as 'n getal ontleed en gebruik dit as die inskrywing adres (die nommer word in basis 10 geïnterpreteer. Jy mag 'n leidende 0x vir basis 16 gebruik of 'n leidende 0 vir basis 8).

-E

--export-dinamiese

Wanneer u 'n dinamiese gekoppelde uitvoerbare weergawe skep, voeg al die simbole by die dinamiese simbooltabel. Die dinamiese simbooltabel is die stel simbole wat sigbaar is van dinamiese voorwerpe tydens die aanloop tyd.

As u hierdie opsie nie gebruik nie, sal die dinamiese simbooltafel gewoonlik slegs die simbole bevat wat na verwys word deur 'n dinamiese voorwerp wat in die skakel genoem word.

As jy 'dlopen' gebruik om 'n dinamiese voorwerp te laai wat na die simbole wat deur die program omskryf word, eerder as 'n ander dinamiese voorwerp is, sal jy waarskynlik hierdie opsie moet gebruik wanneer die program self gekoppel word.

U kan ook die weergawe script gebruik om te bepaal watter simbole by die dinamiese simbooltafel gevoeg moet word as die uitvoerformaat dit ondersteun. Sien die beskrywing van --versie-skrip in @ ref {VERSION}.

-EB

Skakel groot-endiese voorwerpe. Dit raak die standaard uitvoerformaat.

-el

Skakel klein-endiese voorwerpe. Dit raak die standaard uitvoerformaat.

f

- aanvullende naam

Wanneer u 'n ELF-gedeelde objek skep, stel die interne DT_AUXILIARY-veld in die gespesifiseerde naam. Dit vertel die dinamiese linker dat die simbooltafel van die gedeelde voorwerp as 'n hulpfilter op die simbooltafel van die gedeelde objeknaam gebruik moet word .

As jy later 'n program teen hierdie filtervoorwerp koppel, sal die dinamiese skakelaar die DT_AUXILIARY-veld sien wanneer jy die program hardloop. As die dinamiese skakelaar enige simbole van die filtervoorwerp oplos, sal dit eers nagaan of daar 'n definisie in die gedeelde objeknaam is. As daar een is, sal dit gebruik word in plaas van die definisie in die filterobjek. Die gedeelde objeknaam moet nie bestaan ​​nie. So kan die gedeelde objeknaam gebruik word om 'n alternatiewe implementering van sekere funksies te bied, miskien vir ontfouting of vir masjienspesifieke uitvoering.

Hierdie opsie kan meer as een keer gespesifiseer word. Die DT_AUXILIARY-inskrywings sal geskep word in die volgorde waarin hulle op die opdraglyn verskyn.

-F naam

- Filter naam

Wanneer u 'n ELF-gedeelde objek skep, stel die interne DT_FILTER-veld in die gespesifiseerde naam. Dit vertel die dinamiese linker dat die simbooltafel van die gedeelde objek wat geskep word, as 'n filter op die simbooltafel van die gedeelde objeknaam gebruik moet word .

As jy later 'n program teen hierdie filtervoorwerp koppel, sal die dinamiese skakelaar die DT_FILTER-veld sien wanneer jy die program hardloop. Die dinamiese linker sal soos gewoonlik die simbole volgens die simbooltafel van die filtervoorwerp oplos, maar dit sal eintlik skakel na die definisies wat in die gedeelde objeknaam gevind word. So kan die filtervoorwerp gebruik word om 'n subset van die simbole wat deur die voorwerpnaam verskaf word, te kies.

Sommige ouer skakels gebruik die -F opsie dwarsdeur 'n samestelling gereedskapsketting vir die spesifisering van objek-lêer formaat vir beide insette en uitvoer voorwerp lêers. Die GNU linker maak gebruik van ander meganismes vir hierdie doel: die -b , -format , -oformat opsies, die ' TARGET'- opdrag in linkerskripte en die' GNUTARGET'-omgewingsveranderlike. Die GNU-skakelaar sal die -F- opsie ignoreer wanneer nie 'n ELF-gedeelde objek geskep word nie.

-finie naam

Wanneer 'n ELF-uitvoerbare of gedeelde objek geskep word, bel NAME wanneer die uitvoerbare of gedeelde objek afgelaai word, deur DT_FINI na die adres van die funksie te stel. By verstek gebruik die skakelaar "_fini" as die funksie om te bel.

G

Geïgnoreer. Voorsien vir verenigbaarheid met ander gereedskap.

-G waarde

--gpsize = waarde

Stel die maksimum grootte van voorwerpe wat geoptimaliseer moet word, met behulp van die GP-register na grootte . Dit is net sinvol vir objek lêer formate soos MIPS ECOFF, wat ondersteun om groot en klein voorwerpe in verskillende afdelings te plaas. Dit word geïgnoreer vir ander objek lêer formate.

-die naam

-soname = naam

Wanneer u 'n ELF-gedeelde objek skep, stel die interne DT_SONAME-veld in die gespesifiseerde naam. Wanneer 'n uitvoerbare verbinding gekoppel is aan 'n gedeelde objek met 'n DT_SONAME-veld, sal die dinamiese skakelaar die gedeelde voorwerp wat deur die DT_SONAME-veld gespesifiseer word, laai as die uitvoerbare weergawe uitgevoer word, eerder as die gebruik van die lêernaam wat aan die linker gegee word.

-i

Voer 'n inkrementele skakel uit (dieselfde as opsie -r ).

-init naam

Wanneer u 'n ELF-uitvoerbare of gedeelde voorwerp skep, bel NAME wanneer die uitvoerbare of gedeelde objek gelaai word, deur DT_INIT op die adres van die funksie in te stel. By verstek gebruik die skakelaar '_init' as die funksie om te bel.

-l argief

- biblioteek = argief

Voeg argief lêer argief by die lys van lêers om te skakel. Hierdie opsie mag enige aantal kere gebruik word. ld sal sy padlys soek vir die gebeure van "libarchive.a" vir elke argief wat gespesifiseer word.

Op stelsels wat gedeelde biblioteke ondersteun, kan ld ook na biblioteke met uitbreidings anders as ".a" soek. Spesifiek, op ELF- en SunOS-stelsels sal ld ' n gids vir 'n biblioteek soek met 'n uitbreiding van '.so' voordat jy een soek met 'n uitbreiding van '.a'. By konvensie dui 'n ".so" -uitbreiding 'n gedeelde biblioteek aan.

Die linker sal slegs een keer 'n argief soek, op die plek waar dit op die opdraglyn gespesifiseer word. As die argief 'n simbool definieer wat onbeperk was in 'n voorwerp wat voor die argief verskyn op die opdraglyn, sal die linker die toepaslike lêer (s) uit die argief insluit. 'N Onbeperkte simbool in 'n voorwerp wat later op die opdraglyn verskyn, sal egter nie veroorsaak dat die linker die argief weer soek nie.

Sien die - ( opsie vir 'n manier om die linker te dwing om verskeie kere te soek na argiewe.

U mag dieselfde argief verskeie kere op die opdragreël lys.

Hierdie tipe argief soek is standaard vir Unix-skakelaars. As jy egter ld op AIX gebruik, moet jy daarop let dat dit verskil van die gedrag van die AIX-skakelaar.

-L soekdir

--library-path = searchdir

Voeg path searchdir by die lys van paaie wat ld sal soek vir argief biblioteke en ld beheer skrifte. U mag hierdie opsie enige aantal kere gebruik. Die dopgehou word gesoek in die volgorde waarin hulle op die opdraglyn gespesifiseer word. Gidse wat op die opdraglyn gespesifiseer word, word voor die verstekgidse gesoek. Alle -L opsies geld vir alle -l opsies, ongeag die volgorde waarin die opsies verskyn.

As searchdir begin met "=", word die "=" vervang deur die sysroot-voorvoegsel , 'n pad wat gespesifiseer word wanneer die skakelaar gekonfigureer is.

Die verstek stel paaie gesoek (sonder om met -L gespesifiseer te word) hang af van watter emulasie modus ld gebruik, en in sommige gevalle ook hoe dit gekonfigureer is.

Die paaie kan ook gespesifiseer word in 'n skripskrip met die "SEARCH_DIR" opdrag. Gidse wat op hierdie manier gespesifiseer word, word gesoek op die punt waar die skripscript in die opdraglyn verskyn.

-imulasie

Emuleer die emulasie skakelaar. U kan die beskikbare emulasies met die --verbose of -V opsies lys.

As die -m- opsie nie gebruik word nie, word die emulasie geneem uit die omgewing-veranderlike "LDEMULATION", indien dit gedefinieer word.

Anders is die standaard emulasie afhanklik van hoe die skakelaar gekonfigureer is.

-M

--print-kaart

Druk 'n skakelkaart na die standaard uitset. 'N Skakelkaart verskaf inligting oor die skakel, insluitend die volgende:

*

Waar objeklêers en simbole in geheue gekarteer word.

*

Hoe algemene simbole word toegeken.

*

Alle argieflede is in die skakel ingesluit, met vermelding van die simbool wat veroorsaak het dat die argieflid ingebring word.

-n

--nmagic

Skakel bladsybelyning van afdelings af en merk die uitset as "NMAGIC" indien moontlik.

-N

--omagic

Stel die teks en data afdelings leesbaar en skryfbaar. Sorg ook nie dat die datasegment in die bladsy gebind word nie, en skakel skakel teen gedeelde biblioteke uit. As die uitvoerformaat Unix-styl magiese nommers ondersteun, merk die uitset as "OMAGIC".

--no-omagic

Hierdie opsie ontken die meeste van die gevolge van die N- opsie. Dit stel die teks afdeling as lees-alleen, en dwing die datasegment om bladsy-gebonde te wees. Nota - hierdie opsie skakel nie in verbinding met gedeelde biblioteke nie. Gebruik -Bdinamiese hiervoor.

-op uitvoer

--output = uitset

Gebruik uitvoer as die naam vir die program wat deur ld vervaardig word; As hierdie opsie nie gespesifiseer is nie, word die naam a.out as standaard gebruik. Die script bevel "OUTPUT" kan ook die uitvoer lêer naam spesifiseer.

-O vlak

As die vlak 'n numeriese waardes groter as nul is, optimaliseer lp die uitset. Dit kan aansienlik langer neem en moet dus waarskynlik net vir die finale binêre geaktiveer word.

-q

--emit-relocs

Verlaat verhuisseksies en inhoud in volledig gekoppelde exececutables. Gereedskap vir post-analise en optimalisering van die skakels, kan hierdie inligting benodig om korrekte wysigings van uitvoerbare programme uit te voer. Dit lei tot groter uitvoerbare items.

Hierdie opsie word tans slegs ondersteun op ELF-platforms.

r

--relocateable

Genereer verplaatsbare afvoer --- dws, genereer 'n uitvoerlêer wat op sy beurt as inset vir ld kan dien . Dit word dikwels gedeeltelike koppeling genoem . As 'n newe-effek, in omgewings wat standaard Unix-magiese nommers ondersteun, stel hierdie opsie ook die uitsetlêer se magiese nommer na "OMAGIC". As hierdie opsie nie gespesifiseer word nie, word 'n absolute lêer geproduseer. By die koppeling van C ++-programme sal hierdie opsie nie verwysings na konstruktors oplos nie; om dit te doen, gebruik -Ur .

As 'n insetlêer nie dieselfde formaat as die uitvoerlêer het nie, word gedeeltelike koppeling slegs ondersteun as die invoerlêer geen verplaatsings bevat nie. Verskillende uitvoerformate kan verdere beperkings hê; Byvoorbeeld, sommige "a.out" -gebaseerde formate ondersteun nie gedeeltelike koppeling met insetlêers in ander formate nie.

Hierdie opsie doen dieselfde ding as -i .

-R lêernaam

- Just-symbols = lêernaam

Lees simbool name en hul adresse van die lêernaam , maar moenie dit verplaas of in die uitset insluit nie. Dit laat jou uitvoer lêer simbolies verwys na absolute plekke van geheue wat in ander programme gedefinieer is. U mag hierdie opsie meer as een keer gebruik.

Vir die verenigbaarheid met ander ELF-skakelaars, as die -R opsie gevolg word deur 'n gidsnaam , eerder as 'n lêernaam, word dit behandel as die -rpath opsie.

s

--strip-all

Verwyder alle simboolinligting uit die uitvoerlêer.

-S

--strip-debug

Verwyder debugger simbool inligting (maar nie alle simbole) uit die uitvoer lêer.

t

--trace

Druk die name van die insetlêers af as ld verwerk hulle.

-T scriptfile

- script = scriptfile

Gebruik skripsie as die skripsie. Hierdie skrip vervang ld se verstekskakelprogram (eerder as om dit by te voeg), dus moet opdragfile alles spesifiseer wat nodig is om die uitvoerlêer te beskryf. As scriptfile nie in die huidige gids bestaan ​​nie, soek "ld" dit in die dopgehou wat deur enige voorafgaande -L opsies gespesifiseer word. Meervoudige -T opsies versamel.

-u simbool

--undefined = simbool

Krag simbool wat in die uitvoer lêer ingevoer moet word as 'n ongedefinieerde simbool. As u dit doen, kan dit byvoorbeeld skakel van bykomende modules vanaf standaard biblioteke. Jy kan herhaal word met verskillende opsie argumente om bykomende onbepaalde simbole in te voer. Hierdie opsie is gelyk aan die "EXTERN" linker script bevel.

-Ur

Vir enigiets anders as C ++-programme, is hierdie opsie gelyk aan -r : dit genereer verplaatsbare afvoer --- dws 'n uitsetlêer wat op sy beurt as inset vir ld kan dien . By die koppeling van C + + -programme, -Ur verwys verwysings na konstrukteurs, in teenstelling met -r . Dit werk nie om te gebruik nie. U is op lêers wat self verbind is met -Ur ; Sodra die konstruktortafel gebou is, kan dit nie bygevoeg word nie. Gebruik-Slegs vir die laaste gedeeltelike skakel, en -r vir die ander.

- uniek [= AFDELING ]

Skep 'n afsonderlike uitsetgedeelte vir elke insette-afdeling wat ooreenstem met AFDELING , of as die opsionele wildcard- AFDELING- argument ontbreek, vir elke weeskundige insette-afdeling. 'N Weeskunde-afdeling is een wat nie spesifiek in 'n linker-skrif genoem word nie. U kan hierdie opsie verskeie kere gebruik op die opdraglyn; Dit verhoed dat die normale samesmelting van insetseksies met dieselfde naam, oorheersende uitset-afdeling-opdragte in 'n skakelschrift.

v

--version

-V

Wys die weergawe nommer vir ld . Die -V opsie lys ook die ondersteunde emulasies.

-x

--discard-all

Verwyder alle plaaslike simbole.

-X

--discard-inwoners

Verwyder alle tydelike plaaslike simbole. Vir die meeste teikens is dit al die plaaslike simbole waarvan die name begin met L.

-'n simbool

--Trace-simbool = simbool

Druk die naam van elke gekoppelde lêer in watter simbool verskyn. Hierdie opsie mag enige aantal kere gegee word. Op baie stelsels is dit nodig om 'n onderstreep te skryf.

Hierdie opsie is nuttig as u 'n onbeperkte simbool in u skakel het, maar nie weet waar die verwysing vandaan kom nie.

-Y pad

Voeg pad by die verstek biblioteek soekpad. Hierdie opsie bestaan ​​vir Solaris-verenigbaarheid.

-z navraag

Die erkende sleutelwoorde is "initfirst", "interpose", "loadfltr", "nodefaultlib", "nodelete", "nodlopen", "nodump", "nou", "oorsprong", "combreloc", "nocombreloc" en "nocopyreloc ". Die ander sleutelwoorde word geïgnoreer vir Solaris-verenigbaarheid. "initfirst" merk die voorwerp om eers voor die aanvang van die tyd voor enige ander voorwerpe te begin. "interpose" dui die voorwerp aan wat sy simbooltafel inmeng met alle simbole, maar die primêre uitvoerbare. "loadfltr" dui die voorwerp aan dat sy filtees dadelik verwerk word. "nodefaultlib" merk die voorwerp dat die soektog na afhanklikhede van hierdie voorwerp sal ignoreer enige standaard biblioteek soek paaie. "nodelete" punte, die voorwerp moet nie betyds afgelaai word nie. "nodlopen" merk die voorwerp nie beskikbaar vir "dlopen" nie. "nodump" punte die voorwerp kan nie met "dldump" gedumpeer word nie. "nou" merk die voorwerp met die nie-lui runtime binding. "oorsprong" punte die voorwerp kan $ ORIGIN bevat. "defs" ontbreek onbepaalde simbole. "muldefs" laat verskeie definisies toe. "combreloc" kombineer verskeie reloc sections en sorteer hulle om dinamiese simbool opsoek kas moontlik te maak.

"nocombreloc" deaktiveer verskeie reloc sections kombineer. "nocopyreloc" skakel produksie van kopie-relokke af.

- ( argiewe -)

- Start-groep argiewe - einde-groep

Die argiewe moet 'n lys wees van argieflêers . Hulle kan ook eksplisiete lêername wees, of -l opsies.

Die gespesifiseerde argiewe word herhaaldelik gesoek totdat geen nuwe onbepaalde verwysings geskep word nie. Normaalweg word 'n argief slegs een keer deursoek in die volgorde wat dit op die opdraglyn gespesifiseer het. As 'n simbool in die argief nodig is om 'n ondefinieerde simbool wat deur 'n voorwerp in 'n argief verwys word, op te los wat later op die opdraglyn verskyn, sal die skakelaar nie daardie verwysing kan oplos nie. Deur die argiewe te groepeer, word hulle herhaaldelik gesoek totdat alle moontlike verwysings opgelos is.

Die gebruik van hierdie opsie het 'n beduidende prestasiekoste. Dit is die beste om dit slegs te gebruik as daar onafwendbare omsendbriefverwysings tussen twee of meer argiewe is.

--accept-onbekende-insette-boog

--no-aanvaar-onbekende-insette-boog

Vertel die linker om insetlêers te aanvaar waarvan die argitektuur nie herken kan word nie. Die aanname is dat die gebruiker weet wat hulle doen en doelbewus wil skakel in hierdie onbekende insetlêers. Dit was die verstekgedrag van die linker, voor weergawe 2.14. Die verstekgedrag vanaf weergawe 2.14 en verder is om sulke insetlêers te verwerp. Die opsie - aanvaar-onbekend-insette-boog is bygevoeg om die ou gedrag te herstel.

-assess sleutelwoord

Hierdie opsie word geïgnoreer vir SunOS-verenigbaarheid .

-Bdynamic

-dy

-call_shared

Skakel teen dinamiese biblioteke. Dit is net sinvol op platforms waarvoor gedeelde biblioteke ondersteun word. Hierdie opsie is gewoonlik die standaard op sulke platforms. Die verskillende varianten van hierdie opsie is vir verenigbaarheid met verskillende stelsels. U kan hierdie opsie verskeie kere gebruik op die opdraglyn: dit raak biblioteek op soek na -l opsies wat dit volg.

-Bgroup

Stel die "DF_1_GROUP" -vlag in die "DT_FLAGS_1" -invoer in die dinamiese afdeling. Dit veroorsaak dat die runtime-skakelaar in hierdie voorwerp hanteer word en dat die afhanklikhede slegs in die groep uitgevoer moet word. - Nie-gedefinieerde is geïmpliseer. Hierdie opsie is slegs betekenisvol op ELF-platforms wat gedeelde biblioteke ondersteun.

-Bstatic

-dn

-non_shared

-static

Moenie skakel teen gedeelde biblioteke nie. Dit is net sinvol op platforms waarvoor gedeelde biblioteke ondersteun word. Die verskillende varianten van hierdie opsie is vir verenigbaarheid met verskillende stelsels. U kan hierdie opsie verskeie kere gebruik op die opdraglyn: dit raak biblioteek op soek na -l opsies wat dit volg.

-Bsymbolic

Wanneer u 'n gedeelde biblioteek skep, bind verwysings na globale simbole na die definisie binne die gedeelde biblioteek, indien enige. Normaalweg is dit moontlik vir 'n program gekoppel aan 'n gedeelde biblioteek om die definisie in die gedeelde biblioteek te ignoreer. Hierdie opsie is slegs sinvol op ELFplatforms wat gedeelde biblioteke ondersteun.

--check-afdelings

--no-check-afdelings

Vra die linker om nie seksie adresse na te gaan nadat hulle toegewys is om te sien of daar enige oorvleuelings is nie. Normaalweg sal die skakelaar hierdie tjek uitvoer, en as daar enige oorvleuelings voorkom, sal dit gepaste foutboodskappe produseer. Die linker weet wel en maak toelaes vir afdelings in oorleggings. Die standaard gedrag kan herstel word deur gebruik te maak van die command line skakel - check-afdelings .

--cref

Uitset 'n kruisverwysingstabel. As 'n linker-kaartlêer gegenereer word, word die kruisverwysingstabel na die kaartlêer gedruk. Andersins word dit op die standaard uitset gedruk.

Die formaat van die tabel is doelbewus eenvoudig, sodat dit maklik deur 'n skrif verwerk kan word indien nodig. Die simbole word uitgedruk, gesorteer volgens naam. Vir elke simbool word 'n lys van lêername gegee. As die simbool gedefinieer word, is die eerste lêer gelys die plek van die definisie. Die oorblywende lêers bevat verwysings na die simbool.

--no-definieer-algemene

Hierdie opsie inhibeer die opdrag van adresse aan algemene simbole. Die script opdrag "INHIBIT_COMMON_ALLOCATION" het dieselfde effek.

Die -nie-definieer-algemene opsie laat ontkoppel die besluit om adresse te gee aan algemene simbole uit die keuse van die uitsetlêertipe ; anders kan 'n nie-verplaatsbare uitvoer tipe kragte toewys aan algemene simbole. Deur gebruik te maak van -nie-definieer-algemeen kan algemene simbole wat vanaf 'n gedeelde biblioteek verwys word, slegs toegewys word in die hoofprogram. Dit elimineer die ongebruikte duplikaatruimte in die gedeelde biblioteek en voorkom ook moontlike verwarring oor die oplos van die verkeerde duplikaat wanneer daar baie dinamiese modules is met gespesialiseerde soekpaaie vir runtime simbool-resolusie.

--defsym simbool = uitdrukking

Skep 'n globale simbool in die uitvoerlêer, met die absolute adres wat deur uitdrukking gegee word. U mag hierdie opsie soveel keer as nodig gebruik om verskeie simbole in die opdraglyn te definieer. 'N Beperkte vorm van rekenkunde word ondersteun vir die uitdrukking in hierdie konteks: jy kan 'n heksadesimaal konstant of die naam van 'n bestaande simbool gee, of gebruik "+" en "-" hexadecimale konstantes of simbole by te voeg of af te trek. As jy meer uitgebreide uitdrukkings benodig, oorweeg dit om die linker-opdragtaal van 'n skrif te gebruik. Let wel: daar moet geen wit spasie tussen simbool wees nie , die gelyke teken (`` = '') en uitdrukking .

- demp [= styl ]

--no-demangle

Hierdie opsies beheer of simboolname in foutboodskappe en ander uitset ontdoen. Wanneer die skakelaar vertel word om te demangle, probeer dit simboolname op leesbare wyse aan te bied: dit strep die voorste onderstrepe uit as dit deur die objek lêerformaat gebruik word, en omskep C ++-ontbrekende simboolname in gebruikersleesbare name. Verskillende samestellers het verskillende mangelingstyle. Die opsionele demanglingstylargument kan gebruik word om 'n gepaste afleweringstyl vir jou samesteller te kies. Die skakelaar sal standaard verval as die omgewingveranderlike COLLECT_NO_DEMANGLE ingestel is. Hierdie opsies kan gebruik word om die verstek te ignoreer.

- dinamiese linker lêer

Stel die naam van die dinamiese linker. Dit is slegs sinvol wanneer jy dinamiese gekoppelde ELF-uitvoerbare items genereer. Die verstek dinamiese skakelaar is normaalweg korrek; Moenie dit gebruik tensy jy weet wat jy doen nie.

--embedded-relocs

Hierdie opsie is slegs betekenisvol wanneer u MIPS-ingeboude PIC-kode koppel, gegenereer deur die opsie -membedded-pic na die GNU-samesteller en samesteller. Dit veroorsaak dat die skakelaar 'n tabel skep wat gebruik kan word om al die data wat staties geïnitialiseer is, te wysig. Sien die kode in toetseuite / ld-empic vir besonderhede.

--fatal-waarskuwings

Behandel alle waarskuwings as foute .

--force-exe-agtervoegsel

Maak seker dat 'n uitvoerlêer 'n .exe-agtervoegsel het.

As 'n suksesvolle gebou volledig gekoppelde uitvoer lêer nie 'n ". Exe " of ". Dll " -seksie het nie, dwing hierdie opsie die skakelaar om die uitvoerlêer na een van dieselfde naam te kopieer met 'n ".exe" -seksie. Hierdie opsie is handig as u ongemodifiseerde Unix makefiles op 'n Microsoft Windows-gasheer gebruik, aangesien sommige weergawes van Windows nie 'n prentjie sal loop nie tensy dit in 'n ".exe" -eksmpte eindig.

--no-gc-afdelings

--gc-afdelings

Aktiveer vullisversameling van ongebruikte insetseksies. Dit word geïgnoreer op teikens wat hierdie opsie nie ondersteun nie. Hierdie opsie is nie verenigbaar met -r nie , en moet ook nie met dinamiese koppeling gebruik word nie. Die standaard gedrag (as u hierdie vullisverwydering nie uitvoer nie) kan herstel word deur die volgende te spesifiseer - geen-gc-afdelings op die opdraglyn.

help uit te voer

Druk 'n opsomming van die opdraglyn opsies op die standaard uitvoer en uitgang.

--target-hulp

Druk 'n opsomming van alle teikenspesifieke opsies op die standaard uitvoer en uitgang.

-Map mapfile

Druk 'n skakelkaart na die lêer mapfile . Sien die beskrywing van die -M opsie, hierbo.

--no-hou-geheue

ld optimaliseer gewoonlik spoed oor geheueverbruik deur die simbooltabelle van insetlêers in die geheue te cache. Hierdie opsie vertel ld om eerder te optimaliseer vir geheueverbruik, deur die simbool tafels weer te lees as dit nodig is. Dit kan nodig wees as ld uit geheue spasie loop terwyl 'n groot uitvoerbare skakel gekoppel word.

--no-undefined

-die defs

Normaalweg wanneer 'n nie-simboliese gedeelde biblioteek geskep word, word onbepaalde simbole toegelaat en word dit deur die runtime loader opgelos. Hierdie opsies verbied sulke ongedefinieerde simbole.

--allow-meervoudige definisie

-z muldefs

Gewoonlik wanneer 'n simbool verskeie kere gedefinieer word, sal die skakelaar 'n noodlottige fout meld. Hierdie opsies laat verskeie definisies toe en die eerste definisie sal gebruik word.

--allow-shlib-undefined

Laat onbepaalde simbole toe in gedeelde voorwerpe, selfs wanneer - nie-gedefinieerde is ingestel. Die netto resultaat sal wees dat ongedefinieerde simbole in gereelde voorwerpe steeds 'n fout sal veroorsaak, maar ongedefinieerde simbole in gedeelde voorwerpe sal geïgnoreer word. Die implementering van no_undefined maak die aanname dat die runtime-skakelaar op onbepaalde simbole sal verstik. Daar is egter ten minste een stelsel (BeOS) waar ongedefinieerde simbole in gedeelde biblioteke normaal is, aangesien die kern laai hulle op laai tyd om te kies watter funksie die geskikste is vir die huidige argitektuur. IE kies 'n toepaslike memset-funksie dinamies. Klaarblyklik is dit ook normaal dat HPPA-gedeelde biblioteke ongedefinieerde simbole het.

--no-ongedefinieer-weergawe

Normaalweg wanneer 'n simbool 'n ongedefinieerde weergawe het, sal die skakelaar dit ignoreer. Hierdie opsie verwerp simbole met ongedefinieerde weergawe en 'n fatale fout sal in plaas daarvan uitgereik word.

--no-waarsku-mismatch

Normaalweg sal ld 'n fout gee as jy probeer om insette-lêers wat nie ooreenstem met mekaar te koppel nie, miskien omdat hulle saamgestel is vir verskillende verwerkers of vir verskillende endianiteite. Hierdie opsie vertel ld dat dit sulke moontlike foute moet toelaat. Hierdie opsie moet slegs versigtig gebruik word, in gevalle waar u spesiale aksies geneem het wat verseker dat die skakelfoute onvanpas is.

--no-geheel-argief

Skakel die effek van die - wat-argief opsie vir die volgende argief lêers af.

--noinhibit-exec

Behou die uitvoerbare uitvoerlêer wanneer dit steeds bruikbaar is. Normaalweg sal die skakelaar nie 'n uitvoerlêer produseer as dit foute tydens die koppelingsproses ervaar nie; Dit verlaat sonder om 'n uitvoerlêer te skryf wanneer dit enige foute uitmaak.

-nostdlib

Soek slegs biblioteekgidse wat uitdruklik op die opdraglyn gespesifiseer is. Biblioteekgidse wat in skripsies gespesifiseer is (insluitende skrywers wat op die opdragreël gespesifiseer is) word geïgnoreer.

--oformate uitvoer-formaat

ld kan gekonfigureer word om meer as een soort objeklêer te ondersteun. As u ld op hierdie manier gekonfigureer is, kan u die --oformat opsie gebruik om die binêre formaat vir die uitvoervoorwerplêer te spesifiseer. Selfs wanneer ld gekonfigureer is om alternatiewe objekformate te ondersteun, moet u dit gewoonlik nie spesifiseer nie, aangesien LD moet gekonfigureer word om die standaard formaat op elke masjien as standaard uitvoerformaat te produseer. Uitvoer-formaat is 'n teksstring, die naam van 'n spesifieke formaat wat deur die BFD-biblioteke ondersteun word. (U kan die beskikbare binêre formate met objdump -i lys.) Die skrifopdrag "OUTPUT_FORMAT" kan ook die uitvoerformaat spesifiseer, maar hierdie opsie oortree dit.

-qmagic

Hierdie opsie word geïgnoreer vir Linux-verenigbaarheid.

-Qy

Hierdie opsie word geïgnoreer vir SVR4-verenigbaarheid.

--relax

'N opsie met masjien afhanklike effekte. Hierdie opsie word slegs ondersteun op enkele teikens.

Op sommige platforms voer die --relax- opsie globale optimalisasies uit wat moontlik word wanneer die skakelaar besluit om in die program te adresseer, soos ontspannende adresmodusse en die sintetisering van nuwe instruksies in die uitvoervoorwerplêer.

Op sommige platforms kan hierdie globale globale optimaliseringstydperke simboliese ontfouting van die gevolglike uitvoerbare onmoontlik maak. Dit is bekend dat dit die geval is vir die Matsushita MN10200 en MN10300 familie van verwerkers.

Op platforms waar dit nie ondersteun word nie, word - aanvaarding aanvaar, maar geïgnoreer.

- hou-simbole-lêer lêernaam

Behou net die simbole wat in die lêer lêernaam gelys word, en wegdoen alle ander. lêernaam is bloot 'n plat lêer, met een simbool naam per reël. Hierdie opsie is veral handig in omgewings (soos VxWorks) waar 'n groot globale simbooltafel geleidelik opgehoop word om hardloop-geheue te bewaar.

- Onthou-simbole-lêer gooi nie ondefinieerde simbole, of simbole wat nodig is vir verskuiwing.

U mag slegs --retain-symbols-lêer een keer in die opdragreël spesifiseer. Dit oortree -s en -S .

-rpath dir

Voeg 'n gids by die Runtime Biblioteek soek pad. Dit word gebruik wanneer 'n ELFexecutable met gedeelde voorwerpe gekoppel word. Alle argumente word saamgevoeg en oorgedra na die runtime linker, wat hulle gebruik om gedeelde voorwerpe op lopies te vind. Die opsie -rpath word ook gebruik wanneer gedeelde voorwerpe geplaas word wat benodig word deur gedeelde voorwerpe wat uitdruklik in die skakel ingesluit is. sien die beskrywing van die -rpath-skakel opsie. As -rpath nie gebruik word wanneer 'n ELF-uitvoerbare skakel gekoppel word nie, sal die inhoud van die omgewingsveranderlike "LD_RUN_PATH" gebruik word as dit gedefinieer word.

Die -rpath opsie kan ook op SunOS gebruik word. As standaard, op SunOS, sal die linker 'n runtime soek pleister vorm uit al die L- opsies wat dit gegee het. As 'n -rpath opsie gebruik word, sal die runtime soekpad uitsluitlik gevorm word met die -rpath opsies, sonder om die -L opsies te ignoreer. Dit kan nuttig wees as jy gcc gebruik, wat baie -L opsies byvoeg wat moontlik op NFS-gemonteerde lêersisteme kan wees.

Vir die verenigbaarheid met ander ELF-skakelaars, as die -R opsie gevolg word deur 'n gidsnaam , eerder as 'n lêernaam, word dit behandel as die -rpath opsie.

-rpath-skakel DIR

Wanneer u ELF of SunOS gebruik, kan een gedeelde biblioteek ander benodig. Dit gebeur as 'n gedeelde biblioteek as een van die insetlêers 'n "ld-gedeelde" skakel insluit.

As die skakelaar so 'n afhanklikheid ervaar wanneer 'n nie-gedeelde, nie-verplaasbare skakel word, sal dit outomaties probeer om die vereiste gedeelde biblioteek te vind en dit in die skakel in te sluit, as dit nie eksplisiet ingesluit is nie. In so 'n geval spesifiseer die -rpath-skakel opsie die eerste stel dopgehou om te soek. Die opsie -rpath-skakel kan 'n reeks gidsname spesifiseer, óf deur 'n lys met name wat geskei word deur dubbelslae te spesifiseer, of deur verskeie kere te verskyn.

Hierdie opsie moet met omsigtigheid gebruik word, aangesien dit die soektog wat dalk moeilik in 'n gedeelde biblioteek saamgestel is, oortree. In so 'n geval is dit moontlik om onophoudelik 'n ander soekpad te gebruik as wat die runtime-skakelaar sou doen.

Die linker gebruik die volgende soekpaaie om vereiste gedeelde biblioteke op te spoor.

1.

Enige gidse gespesifiseer deur -rpath-skakel opsies.

2.

Enige gidse gespesifiseer deur -rpath opsies. Die verskil tussen -rpath en -rpath-skakel is dat dopgehou wat deur -rpath- opsies gespesifiseer word, in die uitvoerbare weergawe ingesluit word en by gebruik word, terwyl die -rpath-skakel opsie slegs effektief is op skakel tyd. Dit is slegs vir die inheemse linker.

3.

Op 'n ELF-stelsel, as die -rpath- en "rpath-skakel" opsies nie gebruik is nie, soek die inhoud van die omgewingsveranderlike "LD_RUN_PATH". Dit is slegs vir die inheemse linker.

4.

Op SunOS, as die -rpath opsie nie gebruik word nie, soek enige gidse gespesifiseer met -L opsies.

5.

Vir 'n inheemse skakelaar, die inhoud van die omgewingsveranderlike "LD_LIBRARY_PATH".

6.

Vir 'n inheemse ELF-skakelaar word die dopgehou in "DT_RUNPATH" of "DT_RPATH" van 'n gedeelde biblioteek gesoek vir gedeelde biblioteke wat daardeur benodig word. Die "DT_RPATH" inskrywings word geïgnoreer as "DT_RUNPATH" inskrywings bestaan.

7.

Die standaard dopgehou, gewoonlik / lib en / usr / lib .

8.

Vir 'n inheemse linker op 'n ELF-stelsel, as die lêer /etc/ld.so.conf bestaan, die lys van dopgehou wat in daardie lêer gevind is.

As die vereiste gedeelde biblioteek nie gevind word nie, sal die skakelaar 'n waarskuwing uitreik en voortgaan met die skakel.

-shared

-Bshareable

Skep 'n gedeelde biblioteek. Dit word tans slegs ondersteun op ELF-, XCOFF- en SunOS-platforms. Op SunOS sal die skakelaar outomaties 'n gedeelde biblioteek skep as die -e opsie nie gebruik word nie en daar is onbeperkte simbole in die skakel.

--sort-algemene

Hierdie opsie vertel ld om die algemene simbole volgens grootte te sorteer wanneer dit in die toepaslike afvoerafdelings geplaas word. Kom eers al die een bytesimbole, dan al die twee bytes, dan al die vier bytes, en dan al die ander. Dit is om gapings tussen simbole te voorkom weens die aanpassing van beperkings.

- splitsing-by-file [ grootte ]

Soortgelyk aan - splitsing-by-reloc, maar skep 'n nuwe uitvoerafdeling vir elke insetlêer wanneer die grootte bereik word. Grootte verstek tot 'n grootte van 1 indien nie gegee nie.

- splitsing-by-reloc [ telling ]

Probeer om ekstra afdelings in die uitvoerlêer te skep, sodat geen enkele uitsetgedeelte in die lêer meer as telverplaatsings bevat nie. Dit is handig wanneer groot verplaasbare lêers genereer word vir aflaai in sekere real-time pitte met die COFF-voorwerplêerformaat; aangesien COFFcannot meer as 65535 hervestigings in 'n enkele afdeling verteenwoordig. Let daarop dat dit nie sal werk met objek lêer formate wat nie arbitrêre afdelings ondersteun nie. Die skakelaar sal nie individuele insette afdelings verdeel vir herverdeling nie, dus as 'n enkele insette-afdeling meer as telverplaatsings bevat, sal een afvoerafdeling soveel verskuiwing bevat. tel verstekwaardes tot 'n waarde van 32768.

--stats

Bereken en vertoon statistieke oor die werking van die linker, soos uitvoeringstyd en geheueverbruik.

--traditional-formaat

Vir sommige doelwitte is die uitset van ld op sommige maniere anders as die uitset van 'n bestaande skakelaar. Hierdie skakelaar versoek ld om eerder die tradisionele formaat te gebruik.

Byvoorbeeld, op SunOS kombineer ld duplikaat inskrywings in die simbool string tabel. Dit kan die grootte van u0026 # 39; n uitvoer lêer met volle debugging inligting met meer as 30 persent verminder. Ongelukkig kan die SunOS "dbx" -program nie die gevolgde program lees nie ("gdb" het geen probleme nie). Die -traditional-formaat skakelaar vertel ld om nie duplikaatinskrywings te kombineer nie.

- afdeling-begin afdelingnaam = org

Soek 'n afdeling in die uitvoerlêer by die absolute adres wat deur org gegee word. U mag hierdie opsie soveel keer as nodig gebruik om verskeie afdelings in die opdraglyn te vind. org moet 'n enkele heksadesimale getal wees; Vir verenigbaarheid met ander skakelaars, kan u die voorste 0x wat gewoonlik geassosieer word met heksadesimale waardes weglaat. Let wel: daar moet geen wit spasie wees tussen die afdelingnaam , die gelyke teken (`` = '') en org .

-Tbss org

-Tdata org

-Ttext org

Gebruik org as die begin adres vir --- onderskeidelik --- die "bss", "data" of die "teks" segment van die uitvoer lêer. org moet 'n enkele heksadesimale getal wees; Vir verenigbaarheid met ander skakelaars, kan u die voorste 0x wat gewoonlik geassosieer word met heksadesimale waardes weglaat.

--dll-verbose

--verbose

Wys die weergawe nommer vir ld en lys die linker emulasies ondersteun. Wys watter insette lêers kan en kan nie oopgemaak word nie. Vertoon die skripskripsie wat deur die linker gebruik word.

- weergawe- script = weergawe-scriptfile

Spesifiseer die naam van 'n weergawe script aan die linker. Dit word tipies gebruik wanneer gedeelde biblioteke geskep word om bykomende inligting oor die weergawe-heirargie vir die biblioteek te skep wat spesifiseer. Hierdie opsie is slegs betekenisvol op ELF-platforms wat gedeelde biblioteke ondersteun.

--warn-algemene

Waarsku wanneer 'n gemeenskaplike simbool gekombineer word met 'n ander algemene simbool of met 'n simbooldefinisie. Unix-skakelaars laat hierdie ietwat slordige oefening toe, maar skakelaars op sommige ander bedryfstelsels doen nie. Met hierdie opsie kan jy moontlike probleme vind om globale simbole te kombineer. Ongelukkig gebruik sommige C-biblioteke hierdie praktyk, so jy kan waarskuwings kry oor simbole in die biblioteke sowel as in jou programme.

Daar is drie soorte globale simbole, geïllustreer deur C-voorbeelde:

int i = 1;

'N Definisie, wat in die geïnitialiseerde data-afdeling van die uitvoerlêer gaan.

eksterne int i;

'N Onbepaalde verwysing, wat nie ruimte toeken nie. Daar moet iewers 'n definisie of 'n gemeenskaplike simbool vir die veranderlike wees.

int i;

'N Algemene simbool. As daar slegs (een of meer) algemene simbole vir 'n veranderlike is, gaan dit in die uninitialized data area van die uitvoer lêer. Die linker kombinasie veelvuldige algemene simbole vir dieselfde veranderlike in 'n enkele simbool. As hulle van verskillende groottes is, kies dit die grootste grootte. Die skakelaar verander 'n algemene simbool in 'n verklaring, as daar 'n definisie van dieselfde veranderlike is.

Die -warn-algemene opsie kan vyf soorte waarskuwings produseer. Elke waarskuwing bestaan ​​uit 'n paar lyne: die eerste beskryf die simbool wat net voorkom, en die tweede beskryf die vorige simbool wat met dieselfde naam voorkom. Een of albei van die twee simbole sal 'n algemene simbool wees.

1.

Om 'n gemeenskaplike simbool in 'n verwysing te verander, want daar is reeds 'n definisie vir die simbool.

(): waarskuwing: algemeen van '' oorskry per definisie (
): waarskuwing: hier gedefinieer

2.

Om 'n gemeenskaplike simbool in 'n verwysing te verander, omdat daar 'n later definisie van die simbool voorkom. Dit is dieselfde as die vorige geval, behalwe dat die simbole in 'n ander volgorde voorkom.

(): waarskuwing: definisie van '' oorheersend algemeen (): waarskuwing: algemeen is hier

3.

Om 'n gemeenskaplike simbool saam te voeg met 'n gemeenskaplike simbool van dieselfde grootte.

(): waarskuwing: veelvuldige van '' (): waarskuwing: vorige algemene is hier

4.

Voeg 'n gemeenskaplike simbool saam met 'n vorige groter algemene simbool.

(): waarskuwing: algemeen van '' oortree deur groter algemene (): waarskuwing: groter algemeen is hier

5.

Samevoeging van 'n gemeenskaplike simbool met 'n vorige kleiner gemeenskaplike simbool. Dit is dieselfde as die vorige geval, behalwe dat die simbole in 'n ander volgorde voorkom.

(): waarskuwing: algemeen van '' oorheersend kleiner algemeen (): waarskuwing: kleiner algemeen is hier

--warn-vervaardigerskampioenskap

Waarsku as enige globale bouers gebruik word. Dit is slegs nuttig vir 'n paar objek lêer formate. Vir formate soos COFF of ELF kan die linker nie die gebruik van globale konstrukteurs opspoor nie.

--warn-meervoudige GP

Waarsku as daar verskeie globale wyserwaardes in die uitvoerlêer benodig word . Dit is net sinvol vir sekere verwerkers, soos die Alpha. Spesifiek, sommige verwerkers stel grootwaardige konstantes in 'n spesiale afdeling. 'N Spesiale register (die globale wyser) dui in die middel van hierdie gedeelte aan, sodat konstantes doeltreffend gelaai kan word via 'n basisregister relatiewe adresseringsmodus. Aangesien die verrekening in die basisregister relatiewe modus vasgestel is en relatief klein is (bv. 16 bisse), beperk dit die maksimum grootte van die konstante poel. Dus, in groot programme, is dit dikwels nodig om verskeie globale wyserwaardes te gebruik om alle moontlike konstantes te kan aanspreek. Hierdie opsie veroorsaak dat 'n waarskuwing uitgereik word wanneer hierdie geval voorkom.

--warn-keer

Waarsku slegs een keer vir elke onbepaalde simbool, eerder as een keer per module wat na dit verwys.

--warn-afdeling-align

Waarsku as die adres van 'n afvoer afdeling verander word as gevolg van belyning. Tipies sal die belyning deur 'n insette afdeling bepaal word. Die adres sal slegs verander word indien dit nie eksplisiet gespesifiseer word nie; dit wil sê, as die opdrag 'AFDELINGS' nie 'n beginadres vir die afdeling spesifiseer nie.

--whole-argief

Vir elke argief wat op die opdraglyn genoem word na die - wat-argief opsie, sluit elke objeklêer in die argief in die skakel in, eerder as om die argief vir die vereiste objeklêers te soek. Dit word normaalweg gebruik om 'n argieflêer in 'n gedeelde biblioteek om te skakel, en dwing elke voorwerp wat ingesluit moet word in die gevolgde gedeelde biblioteek. Hierdie opsie mag meer as een keer gebruik word.

Twee aantekeninge by die gebruik van hierdie opsie vanaf gcc: Eerstens, weet gcc nie oor hierdie opsie nie, dus moet jy -Wl, -Wolle-argief gebruik . Tweedens, moenie vergeet om te gebruik -Wl, -nie-heel-argief na jou lys van argiewe nie, want gcc sal sy eie lys van argiewe by jou skakel voeg en jy mag nie hê dat hierdie vlag ook dié sal beïnvloed nie.

- wrap simbool

Gebruik 'n wikkelfunksie vir simbool . Enige onbepaalde verwysing na simbool sal opgelos word na "__ wrap_symbol". Enige onbepaalde verwysing na "__real_symbol" sal opgelos word tot simbool .

Dit kan gebruik word om 'n wikkel vir 'n stelsel funksie te verskaf. Die wikkelfunksie moet "__wrap_symbol" genoem word. As dit die stelselfunksie wil noem, moet dit "__ real_symbol" noem.

Hier is 'n triviale voorbeeld:

void * __wrap_malloc (int c) {printf ("malloc genoem met% ld \ n", c); terugkeer __real_malloc (c); }

As jy ander kode koppel met hierdie lêer met behulp van - wrap malloc , sal alle oproepe na "malloc" die funksie "__wrap_malloc" eerder noem. Die oproep na "__real_malloc" in "__wrap_malloc" sal die regte "malloc" -funksie noem.

U kan ook 'n "__real_malloc" -funksie verskaf, sodat skakels sonder die opsie - wrap sal slaag. As u dit doen, moet u nie die definisie van "__ real_malloc" in dieselfde lêer as "__wrap_malloc" plaas nie; As jy dit doen, kan die monteer die oproep oplos voordat die linker die kans het om dit na "malloc" te verpak.

enable-nuwe-dtags

disable-nuwe-dtags

Hierdie skakelaar kan die nuwe dinamiese etikette in ELF skep. Maar die ouer ELF stelsels kan dit nie verstaan ​​nie. As u ' n nuwe-dtags spesifiseer , word die dinamiese etikette geskep as dit nodig is. As jy spesifiseer -disable-new-dtags , sal geen nuwe dinamiese etikette geskep word nie. Standaard word die nuwe dinamiese etikette nie geskep nie. Let daarop dat die opsies slegs beskikbaar is vir ELF stelsels.

Die i386 PE-skakelaar ondersteun die opsie, wat die uitset as 'n dinamiese gekoppelde biblioteek (DLL) in plaas van 'n normale uitvoerbare weergawe veroorsaak. U moet die afvoer "*. DLL" noem as u hierdie opsie gebruik. Daarbenewens ondersteun die skakelaar die standaard "*. Def" -lêers, wat op die linker-opdraglyn soos 'n objeklêer gespesifiseer kan word (dit moet die argiewe vooraf voer, om te verseker dat hulle gekoppel word, net soos 'n normale objek lêer).

Benewens die opsies wat algemeen is vir alle teikens, ondersteun die i386 PE linker bykomende opsies vir die opsies wat spesifiek is vir die i386 PE-teiken. Opsies wat waardes neem, kan van hul waardes geskei word deur óf 'n spasie of 'n gelyke teken.

add-stdcall-alias

Indien gegee, sal simbole met 'n stdcall-agtervoegsel (@ nn ) uitgevoer word as-is en ook met die agtervoegsel gestroop.

- basis lêer lêer

Gebruik die lêer as die naam van 'n lêer waarin die basisadresse van al die verhuisings wat benodig word om DLLs met dlltool te genereer, stoor .

--dll

Skep 'n DLL in plaas van 'n gereelde uitvoerbare. U mag ook 'n "BIBLIOTEEK" in 'n gegewe ".def" -lêer gebruik

enable-stdcall-fixup

disable-stdcall-fixup

As die skakel 'n simbool vind wat dit nie kan oplos nie, sal dit probeer om 'n fuzzy skakel 'te maak deur 'n ander gedefinieerde simbool te soek wat slegs in die formaat van die simboolnaam verskil (cdecl vs stdcall) en die simbool sal oplos deur te koppel na die wedstryd. Byvoorbeeld, die ongedefinieerde simbool "_foo" kan gekoppel word aan die funksie "_foo @ 12", of die ongedefinieerde simbool "_bar @ 16" kan aan die funksie "_bar" gekoppel word. Wanneer die skakelaar dit doen, druk dit 'n waarskuwing, aangesien dit normaalweg nie moes koppel nie, maar soms kan die invoer van biblioteke wat van derdeparty-dll's gegenereer word, hierdie funksie nodig hê om bruikbaar te wees. As u spesifiseer - standaard-stdcall-herstel , is hierdie kenmerk ten volle aangeskakel en waarskuwings word nie gedruk nie. As u spesifiseer - disable-stdcall-fixup , is hierdie funksie gedeaktiveer en sulke foute word as foute beskou.

--export-all-simbole

As dit gegee word, sal alle globale simbole in die voorwerpe wat gebruik word om 'n DLL te bou, uitgevoer word deur die DLL. Let daarop dat dit die verstek is as daar anders geen simbole uitgevoer sal word nie. Wanneer simbole eksplisiet uitgevoer word via DEF-lêers of implisiet uitgevoer word deur funksie-eienskappe, is die verstek om niks anders te eksporteer tensy hierdie opsie gegee word nie. Let daarop dat die simbole "DllMain @ 12", "DllEntryPoint @ 0", "DllMainCRTStartup @ 12" en "impure_ptr" nie outomaties uitgevoer word nie. Simbole wat van ander DLL's ingevoer word, sal nie weer uitgevoer word nie, en ook nie simbole wat die interne uitleg van die DLL spesifiseer nie, soos dié wat begin met "_head_" of eindig met "_iname". Daarbenewens word geen simbole van "libgcc", "libstd ++", "libmingw32" of "crtX.o" uitgevoer. Simbole waarvan die name begin met "__rtti_" of "__builtin_" sal nie uitgevoer word om te help met C ++ DLLs nie. Ten slotte is daar 'n uitgebreide lys van cygwin-privaat simbole wat nie uitgevoer word nie. Dit is natuurlik van toepassing wanneer DLL's gebou word vir cygwin-teikens.

Hierdie cygwin-uitsluitings is: "_cygwin_dll_entry @ 12", "_cygwin_crt0_common @ 8", "_ cygwin_noncygwin_dll_entry @ 12", "_fmode", "_impure_ptr", "cygwin_attach_dll", "cygwin_premain0", "cygwin_premain1", "cygwin_premain2", "cygwin_premain2" ", en" omgewings ".

--exclude-simbole simbool , simbool , ...

Spesifiseer 'n lys van simbole wat nie outomaties uitgevoer moet word nie. Die simboolname kan deur kommas of kolonies afgebaken word.

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

Spesifiseer 'n lys van argief biblioteke waaruit simbole nie outomaties uitgevoer moet word nie. Die biblioteek se name kan deur kommas of kolonies afgebaken word. Spesifiseer "--exclude-libs ALL" sluit simbole uit in alle argief biblioteke uit outomatiese uitvoer. Simbole wat uitdruklik in 'n .def-lêer gelys word, word steeds uitgevoer, ongeag hierdie opsie.

file-belyning

Spesifiseer die lêerbelyning. Afdelings in die lêer sal altyd begin by lêer offsets wat veelvoude van hierdie nommer is. Hierdie standaard is 512.

- spaarreserwe

- Gunstige reserwe , pleeg

Spesifiseer die hoeveelheid geheue om te reserveren (en opsioneel verbind) om gebruik te word as hoop vir hierdie program. Die standaard is 1Mb gereserveer, 4K verbind.

--beeld-basiswaarde

Gebruik waarde as die basis adres van jou program of dll. Dit is die laagste geheue plek wat gebruik sal word wanneer u program of dll gelaai word. Om die behoefte om die prestasie van u dll's te verplaas en te verbeter, moet elkeen 'n unieke basisadres hê en nie enige ander dlls oorvleuel nie. Die standaard is 0x400000 vir uitvoerbare en 0x10000000 vir dlls.

--kill-op

Indien gegee, sal die stdcall-agtervoegsels (@ nn ) van simbole verwyder word voordat dit uitgevoer word.

- grootliks-beeld-weergawe waarde

Stel die hoofnommer van die `` beeld weergawe '' in. Verstek 1.

- groot-os-weergawe waarde

Stel die hoofnommer van die `` os weergawe '' in. Standaard op 4.

- groot-subsysteem-weergawe waarde

Stel die hoofnommer van die `` substelsel weergawe '' in. Standaard op 4.

- Minor-beeld-weergawe waarde

Stel die geringe getal van die `` beeldweergawe '' in. Verstek 0.

- Minor-os-weergawe waarde

Stel die klein getal van die `` os weergawe '' in. Verstek 0.

- mineraal-substelsel-weergawe waarde

Stel die geringe getal van die `` substelsel weergawe '' in. Verstek 0.

--output-def lêer

Die linker sal die lêer lêer skep wat 'n DEF-lêer bevat wat ooreenstem met die DLL wat die skakelaar genereer. Hierdie DEF-lêer (wat "* .def" genoem moet word) kan gebruik word om 'n invoerbiblioteek met "dlltool" te skep of kan gebruik word as verwysing na outomaties of implisiet uitgevoerde simbole.

- out-implib lêer

Die linker sal die lêer lêer skep wat 'n invoerlib bevat wat ooreenstem met die DLL wat die skakelaar genereer. Hierdie invoer-lib (wat genoem word "*. Dll.a" of "* .a" mag gebruik word om kliënte te koppel aan die gegenereerde DLL; hierdie gedrag maak dit moontlik om 'n afsonderlike "dlltool" invoerbiblioteek skepstap te slaan.

enable-motor-beeld-basis

Kies outomaties die beeldbasis vir DLLs, tensy een gespesifiseer word met die "--image-base" -argument. Deur gebruik te maak van 'n hash wat gegenereer word vanaf die dllname om unieke beeldbasis vir elke DLL te skep, kan botsings in die geheue en verskuiwing wat vertraag programuitvoer voorkom, vermy word.

disable-motor-beeld-basis

Moenie outomaties 'n unieke beeldbasis genereer nie. As daar geen gebruiker-gespesifiseerde beeldbasis ("--image-base") is nie, gebruik dan die standaard platform.

--dll-search-prefix string

As jy dinamies aan 'n dll koppel sonder 'n invoerbiblioteek, soek jy na .dll "eerder as" lib .dll ". Hierdie gedrag kan maklik onderskei tussen DLL'e wat vir die verskillende `` subplatforms''gebou is: inheemse, cygwin, jouin, pw, ens. Byvoorbeeld, cygwin DLLs gebruik gewoonlik "--dll-search-prefix = cyg".

enable-motor-invoer

Doen gesofistikeerde koppeling van "_symbol" na "__imp__symbol" vir DATA invoer van DLLs, en skep die nodige dunksimbole wanneer die invoerbiblioteke met daardie DATAexports gebou word. Dit sal gewoonlik 'net werk' --- maar soms sien jy dalk hierdie boodskap:

'variable' 'kan nie outomaties ingevoer word nie. Lees asseblief die dokumentasie vir ld se "-enable-auto-import" vir besonderhede. "

Hierdie boodskap vind plaas wanneer sommige (sub) uitdrukking toegang kry tot 'n adres wat uiteindelik deur die som van twee konstantes gegee word. (Win32 invoer tabelle gee slegs een toe). Gevalle waar dit mag voorkom, sluit in toegang tot lid velde van struct veranderlikes ingevoer vanaf 'n DLL, sowel as die gebruik van 'n konstante indeks in 'n skikking veranderlike ingevoer vanaf 'n DLL. Enige veelvoudige veranderlike (skikkings, strukture, lang lang, ens.) Kan hierdie fouttoestand veroorsaak. Maar, ongeag die presiese datatipe van die teenstrydige uitgevoerde veranderlike, sal ld dit altyd opspoor, die waarskuwing uitreik en uittree.

Daar is verskeie maniere om hierdie probleem aan te spreek, ongeag die datatipe van die uitgevoerde veranderlike:

Een manier is om gebruik te maak van 'n skakelaar met 'n reële-runtime-pseudo-relocatie. Dit laat die taak om verwysings in u kliëntkode vir runtime-omgewing aan te pas. Hierdie metode werk slegs wanneer runtime environtment hierdie funksie ondersteun.

'N Tweede oplossing is om een ​​van die' konstantes 'te dwing om 'n veranderlike te wees --- dit is onbekend en onoptimaliseerbaar tydens samestelling. Vir skikkings is daar twee moontlikhede: a) Maak die indekseerder (die skikking se adres) 'n veranderlike, of b) maak die 'konstante' indeks 'n veranderlike. dus:

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

of

eksterne tipe extern_array []; extern_array [1] -> {volatile int t = 1; extern_array [t]}

Vir strukture (en die meeste ander data met veelvoudige data) is die enigste opsie om die struktuur self (of die lang lang of die ...) -veranderlike te maak:

eksterne strukture s extern_struct; extern_struct.field -> {vlugtige struktuur s * t = & extern_struct; t-> veld}

of

eksterne lang lang extern_ll; extern_ll -> {vlugtig lang lank * local_ll = & extern_ll; * local_ll}

'N Derde manier om hierdie probleem te hanteer, is om' outomatiese invoer 'vir die oortredende simbool te laat vaar en merk dit met' __declspec (dllimport) '. In die praktyk moet dit egter gebruik word om #defines saam te stel om aan te dui of u 'n DLL bou, kliëntkode wat aan die DLL gekoppel is, te bou, of bloot aan 'n statiese biblioteek te koppel / te koppel. As jy die keuse maak tussen die verskillende metodes om die 'direkte adres met konstante verrekenings' probleem op te los, moet jy tipiese werk in die werklike wêreld oorweeg:

Original:

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

Oplossing 1:

--foo.h eksterne int ar []; --foo.c #include "foo.h" void main (int argc, char ** argv) {/ * Hierdie oplossing is vir win32 en cygwin; moenie "optimaliseer" * / vlugtige int * parr = arr; printf ( "% d \ n", Parr [1]); }

Oplossing 2:

- foo.h / * Nota: outomatiese uitvoer word aanvaar (nee __declspec (dllexport)) * / #if (gedefinieer (_WIN32) || gedefinieer (__ CYGWIN__)) && \! (gedefinieer (FOO_BUILD_DLL) || gedefinieer (FOO_STATIC )) #define FOO_IMPORT __declspec (dllimport) #else #define FOO_IMPORT #endif extern FOO_IMPORT int arres []; --foo.c #include "foo.h" void main (int argc, char ** argv) {printf ("% d \ n", arr [1]); }

'N Vierde manier om hierdie probleem te vermy, is om jou biblioteek te herkodeer om 'n funksionele koppelvlak te gebruik eerder as 'n data-koppelvlak vir die aanstootlike veranderlikes (bv. Set_foo () en get_foo () toegangsfunksies).

disable-motor-invoer

Moenie probeer om sophisticalted koppeling van "_symbol" na "__imp__symbol" vir DATAimports vanaf DLLs te doen nie.

enable-runtime-pseudo-reloc

As u kode uitdrukkings bevat wat beskryf word in die afdeling 'n-outomatiese invoer, dit is DATAimports van DLL met nie-zero-offset, sal hierdie skakelaar 'n vektor van 'runtime pseudo-verplaatsings' maak wat deur runtime-omgewing gebruik kan word om verwysings aan te pas. tot sulke data in u kliëntkode.

disable-runtime-pseudo-reloc

Moenie pseudo-verskuiwing vir nie-zero-offset DATA-invoer vanaf DLL'e skep nie. Dit is die verstek.

enable-ekstra-pe-debug

Wys bykomende ontfoutingsinligting wat verband hou met die outomatiese invoer-simbool.

--section-belyning

Stel die seksiebelyning in. Afdelings in die geheue sal altyd begin by adresse wat 'n veelvoud van hierdie nommer is. Standaard as 0x1000.

- stapelreservaat

- Stoor reserwe , pleeg

Spesifiseer die hoeveelheid geheue om te reserveren (en opsioneel verbind) om as stapel vir hierdie program gebruik te word. Die standaard is 2Mb gereserveer, 4K verbind.

- subsysteem wat

- subsystem wat : hoofvak

- subsystem wat : hoofvak . klein

Spesifiseer die substelsel waaronder u program sal uitvoer. Die wettige waardes waarvoor "native", "windows", "console" en "posix" is. U kan die substelsel weergawe ook opsioneel stel.

Belangrik: Gebruik die man opdrag ( % man ) om te sien hoe 'n opdrag op u rekenaar gebruik word.