láthatóságát vezérlő szimbolikus neveit megosztott könyvtárak 1. rész
Liu Chzhipen. Szoftverfejlesztő, az IBM Kínában
Mi a szimbolikus neveit és láthatóság
Szimbolikus neve (szimbólum) - .. Ez az egyik alapvető fogalmakat, amikor a kifogást fájlok kód elrendezés, stb Tény, hogy a C / C ++ nyelven szimbólum ez egy megfelelő tárgyat a legtöbb felhasználó változók, függvények nevét, díszített névtérben típus osztály / struct / neve, és így tovább .. például, a C / C ++ fordító generál kódot tárgy fájl olyan esetekben, amikor a nem-statikus globális változókat és nem statikus függvény került meghatározásra, amely lehetővé teszi a kapcsoló dönti el, hogy ugyanazt az adatot, vagy prog ammny kódot használják a különböző modulok (object fájlokat, dinamikus megosztott könyvtárakat, futtatható fájlok), vagy sem.
Bár a különböző modulok használhatók együtt változókat és függvényeket hatálya változók gyakoribb objektum fájlok. Például akkor, hogy egy változót az a, c fájlt, mint ez:
A b.c fájlt nyilvánítja ugyanazt a változót az alábbiak szerint:
Miért van szükség, hogy ellenőrizzék a láthatóságát szimbolikus nevek
Különböző platformokon fordítóprogram XL C / C ++ működhet különböző módon: tudja, hogy a karakter minden modul vagy exportálják, illetve nem exportálják. Például, ha létre megosztott könyvtárakat az ELF formátumot (Végrehajtható és összekapcsolása Format) minden szimbólumot kivitele az alapértelmezett IBM PowerLinux ™ platform. Létrehozásakor XCOFF-könyvtárak AIX POWER platform, az aktuális verzió XL C / C ++ fordítóprogram nem tudja exportálni szimbólumokat, ha nem használ további eszközöket. Ebben a kódot, a fejlesztők kihasználhatják más módon láthatóvá tenni minden egyes karakter külön (mondjuk a második cikk ebben a sorozatban). Általában azonban nem ajánlott, hogy az export az összes szimbólumot tartalmazó szoftver modulokat. Akkor export csak a szükséges karaktereket. Ez nem csak növeli a biztonságot a könyvtár, de csökkenti a dinamikus kapcsolatot.
Ha a döntés, hogy az export minden szimbolikus neveket, van egy nagy a valószínűsége annak konfliktusok kapcsolat időben, különösen, ha a különböző modulok által kifejlesztett különböző emberek. Mivel a szimbolikus név egy alacsony szintű fogalom, ez nem vonatkozik a hatálya alá. Amint egy elrendezés két könyvtárat tartalmazó szimbólum az azonos nevű, a fordító tudja helyettesíteni egy ilyen karakter egy másik szimbólum az azonos nevű (szerencsére a megjelenített figyelmeztetés vagy hibaüzenet). A legtöbb esetben, a szempontból a könyvtár nem célja Fejlesztő vooblsche ilyen szimbólum kell használni. Ezért ezekben az esetekben sokkal jobb létrehozni csak korlátozott számú egyértelmű (és jól megtervezett) karakter neve.
Minden nap sebességű alkalmazásokhoz kifejlesztett C ++, többet kívánnak. Mivel a függőség más könyvtárak alkalmazásával különleges jellemzői és a C ++ (például, minták) fordító és linker használnak, és létrehoz egy hatalmas mennyiségű karakter nevek. Ennek következtében az összes szimbólumot exportált lassítja a kérelmet, és növeli a memória mennyisége elfoglalt. Export csak korlátozott számú karakter lehet csökkenteni a betöltési idő összekapcsolása és dinamikus megosztott könyvtárakat. Ezen kívül, lehetővé teszi, hogy a fordító generál hatékonyabb és optimális kódot.
A fent említett hátrányok, miért van szükség, hogy meghatározzuk a láthatóságát a szimbólum. Ebben a cikkben megmutatjuk, hogyan kell kezelni a szimbolikus nevek Dynamic Shared Object (DSO). Ezt a problémát meg lehet oldani különböző módon, és mi megmondjuk, hogy merre van legmegfelelőbbek az egyes platform.
Ellenőrzési módszerek láthatóságát Symbol
Ebben a részben, akkor használja a következő kódot a nyelv a C ++:
1. listán a, c
Az a, c fájl általunk megadott nevű változóba myintvar és két, akiknek a neve func0 és func1. Alapértelmezésben, ha egy megosztott könyvtár AIX-platform fordító és linker a szerszám CreateExportList tenni mind a három szimbólum látható. Ezt lehet ellenőrizni a táblázat rakodó szimbolikus neveket használ a lerakó közművek:
Itt értelmében „az EXP” azt jelenti, hogy a szimbolikus nevet „exportált” (export); func0 nevét és funkcióját func1 díszített szabályokkal összhangban a C ++ dekoráció (ahogy sejteni lehet). A paraméter -t billenő parancs megjeleníti a tartalmát az szimbólumtáblát rakodó nevek (Loader Symbol táblázat adatai), amelyet akkor kell használni, amit a dinamikus linker. Ebben a példában az összes karakter A. C. fájlnevek kivitték Ugyanakkor a könyvtár fejlesztő dönthet az export csak a funkció func1. Globális szimbólum neve és beosztása myintvar func0 csak fenntartani vagy módosítani a belső állapotát, vagy csak helyileg használható. Így a fejlesztő fontos, hogy láthatatlan.
Legalább három módon megoldani ezt a problémát: a kulcsszó használatával statikus. definíció tulajdonság láthatóságát GNU fordító és használata export asztal. Mindegyikük saját, egyedi jellemzői és esetleges hátrányait. Most úgy Mindhárom módszer.
1. A használata a statikus kulcsszó
A statikus kulcsszót C / C ++ nyelven lehet túlterhelt kulcsszó, hiszen ez azt jelentheti, mind terjedelemben, mind tárolási osztály változó. Azt mondhatjuk, hogy a hatálya alá a ez a kulcsszó letiltja külső kapcsolatra a karakter neve. Ez azt jelenti, hogy a karakter neve a statikus kulcsszó soha kötő kerül sor, mert a fordító nem hagyja a kapcsoló nincs információ róla. Ezt a módszert végrehajtani a programozási nyelv szintjén, és a legegyszerűbb módja annak, hogy elrejtse a szimbólum.
Adjuk hozzá a statikus kulcsszó az előző példában:
2. lista b.C
Most, ha megnézzük a táblázatot rakodó szimbolikus nevek létrehozása után a megosztott könyvtárban, látni fogja a várt eredményt:
Ebben a példában azt exportálni egyetlen funkciója func1. Mindazonáltal, bár a statikus kulcsszó és elfedheti karakterek szab korlátozása: csak változók vagy függvények, hogy a fájl körét lehet használni, amelyben definiálva vannak. Így, ha meghatározzuk a változót
majd a fájlt b.C libtest.a megpróbál létrehozni egy könyvtárat a tárgyak és A. Ó b.o, a kapcsoló ad hibaüzenetet arról, hogy lehetetlen összekötő változó myintvar. b.C meghatározott fájl, mert a meghatározás nem találtam sehol máshol. Ez megakadályozza, hogy az adatok megosztása vagy kódot egy modulon belüli, ami általában a fejlesztő. Így ez a módszer még nyilvánvalóbb a vezérlő eszköz a változók és funkciók belül egy fájlt, inkább, mint az alacsony szintű vezérlő eszköz láthatóságát a szimbólum. A gyakorlatban a legtöbb fejlesztő nem statikus kulcsszót, hogy ellenőrizzék a láthatóság a szimbólum, úgyhogy nézzük a második módszer.
2. Annak meghatározása az attribútumok a láthatóság (GNU Compiler)
Következő láthatóság karakter ellenőrzési módszer, hogy az attribútum láthatóságát. Ez az attribútum értéke az alkalmazás bináris csatoló (Application Binary Interface, ABI) ELF-formátumban. Általában ez a felület meghatározza a négy osztályba, de az esetek többségében széles körben használják, csak kettő:
- STV_DEFAULT - azt jelzi, hogy a szimbólumokat exportált, ami látható mindenhol ...
- STV_HIDDEN - azt jelzi, hogy a karakterek nem exportálják, és nem lehet használni más tárgyakat.
Felhívjuk figyelmét, hogy az ABI-interfész kiterjesztése GNU C / C ++ fordító. Abban a pillanatban, hogy PowerLinux felhasználó tudja használni, mint egy GNU attribútumot karakter neve. Vegyünk egy példát erre az esetre:
Annak megállapításához, a GNU attribútumot, akkor kell használni a tervezési paraméter __attribute__ és zárt kettős zárójel. Hogy elrejtse a szimbolikus nevek, megadhatja az értéket a láthatóság ( „rejtett”). A példánkban, megcsináltuk a változó myintvar és func0 funkciót. Ennek eredményeként nem lehet exportálni a könyvtárat, de fel lehet használni a forrás fájlokat. Tény, hogy a rejtett karakterek nem jelennek meg a dinamikus szimbólum táblázat, de jelen lesz a szimbólum táblából, amelynek célja a statikus kötődést. Ez a jól definiált algoritmus biztosan működik, hogy megoldja a problémát. Nyilvánvaló, hogy ez a módszer jobb, mint a módszer segítségével a kulcsszó statikus.
Szintén az ELF ABI interfész meghatározza a következő módok elől:
- STV_PROTECTED: szimbólum látható kívül a jelenlegi végrehajtható, vagy megosztott objektum, de nem lehet szubsztituált. Más szóval, ha a védett (védett) szimbólum a megosztott könyvtár alatt elérhetik a külső, a kód mindig utalnak jelképe egy megosztott könyvtár akkor is, ha a karakter az azonos nevű lett definiálva egy futtatható fájl.
- STV_INTERNAL: karakter nem áll kívül a jelenlegi végrehajtható vagy megosztott könyvtár.
Megjegyzendő, hogy jelenleg ez a módszer nem támogatja a fordító XL C / C ++ még PowerLinux platform. Szerencsére van egy másik kiutat.
3. Az Export táblázatok
Az előző két megoldás alkalmazása a forráskód szinten, hatékonyan csak fordítóval. A felhasználók azonban képesnek kell lennie arra, hogy ugyanazt a feladatot előtt a kapcsoló, mert a megjelenése a szimbólum elsősorban a dinamikus összekapcsolása. Határozat alkalmazandó az összekötő használni az export táblákat.
export táblázat automatikusan a fordító által generált (vagy harmadik féltől származó eszközök, például CreateExportlist) idején teremtés akár kézzel írta a fejlesztő a megosztott könyvtárba. Az egyéni paraméter továbbított összekötő export asztal bemeneti adatok. Azonban, mivel minden munkát a fordító által a vezető fejlesztők ritkán figyelni a speciális beállítások lehetőséget.
A működési elve az export táblázatok abban a tényben rejlik, hogy egyértelműen jelzi a kapcsoló szimbólumokat lehet kivinni az objektum fájlok egy külső fájlt. Belépés GNU hívja ezeket a külső fájlok „Export Map”. mi is létrehozhatunk a következő export térkép példánk:
Ez a kialakítás azt mondja a kapcsoló, amely exportálja kizárólag a szimbolikus nevet func1. és a többi szimbólum (* -gal jelölt) helyi. Helyi szimbólumok func0 és myintvar lehet meghatározni kifejezetten (helyi: func0; myintvar;), de nyilvánvaló, hogy ez sokkal kényelmesebb használni összefoglalja a csillaggal (*). Általában azt javasoljuk, hogy használja a csillag, hogy összefoglalja a helyi szimbólumok és egyértelműen meg kell határozni azokat a szimbólumokat, amelyek csak exportálni, mivel ez a módszer sokkal biztonságosabb. Így soha nem fogja elfelejteni, hogy ezek vagy más nevek legyen a helyi, és emellett kizárja annak lehetőségét, hogy a párhuzamos szimbolikus nevek különböző táblák, ami oda vezethet, hogy a nem kívánt következményeket.
Ahhoz, hogy hozzon létre egy megosztott objektum ezzel a módszerrel, meg kell adnia az export a térkép fájlt a linker opció --version-script:
Olvasni ELF-objektumot readelf segédprogramot a -s parancs használható readelf -s mylib.so.
Ez megmutatja, hogy a globális hozzáférés csak a funkció func1 (bejegyzés .dynsym szakasz), és a többi szimbólum nem állnak rendelkezésre, és a helyi.
Linker IBM AIX operációs rendszer használható hasonló kiviteli asztalra. Hogy pontosabbak legyünk, ezek az úgynevezett AIX export fájlokat.
Hozzon létre egy fájlt, export nagyon egyszerű. Ehhez nem kell mást felsorolni a karaktereket, amit exportálni szeretne, az export fájlt. A mi példánkban ez a következőképpen néz ki:
Amikor tehát meghatározza az export fájlt a linker lehetőségek, csak a szimbolikus név, szeretnénk exportálni, hozzáadjuk a „tábla a rakodó szimbólum” XCOFF-objektum, és az egyéb szimbólumok unexported.
AIX 6.1-es verzió vagy nagyobb, szintén hozzáadjuk az export fájl láthatósági attribútumok megjelenő szimbólum-módban. Linker AIX futtatható a következő négy típusba sorolhatók:
A különbség az export és rejtett tulajdonságok egyértelmű, nem lehet azt mondani a tulajdonságokat az exportált és védeni. További információk az elmozdulás a szimbólumok lesz szó a következő részben ezt a cikket.
Tehát, az összes ilyen kulcsszavakat lehet használni az exportált fájlban. Hozzátéve, az űrben, miután a szimbólum nevét, lehet elérni különböző fokú láthatóság ellenőrzéseket. A mi példánkban adja meg a következő tulajdonságokat (a változat AIX 6.1 vagy magasabb):
Ez mondja meg a kapcsoló, hogy a szimbólum neve func1__Fi (azaz func1 ..) exportra kerül, a többi jel - nincs.
Lehet, hogy észrevette, hogy ellentétben a GNU export térképek az exportált fájlban szimbólumok díszítik. Díszített szimbolikus neveket kényelmetlen lehet az űrlapot, ha a programozók nem gondoskodunk a szabályok díszítéssel. Mindazonáltal, ez segít a linker gyorsan el lehet végezni a névfeloldás. Távolítsuk el a kellemetlenségért AIX segíti speciális segédprogramot.
Röviden, ha a fejlesztő használ -qmkshrobj lehetőség hívásakor XL C / C ++ fordító. kezd CreateExportList segédprogramot. azzal az eredménnyel, hogy előállítása után egy objektum fájl automatikusan exportálja tartalmazó fájl nevét díszített karaktereket. A fordító ezután továbbítja linker Export fájl paraméterei feldolgozására szimbólum látható. Visszatérve az például az alábbi parancsot:
Ennek eredményeképpen megkapjuk libtest.a könyvtár, amelyben az összes karaktert kivitele (az alapértelmezett művelet). Bár nem éri el a célunkat, az egész folyamat átlátható, hogy a fejlesztő. Ehelyett mi is létrehozhatunk egy export fájlt CreateExportList eszközök és tudja szerkeszteni az export fájlt manuálisan. Például, ha azt akarjuk, hogy regisztrálja a fájlt exportálni exportfile nevét. a fordító XL C / C ++ meg kell adni a lehetőséget, qexpfile = exportfile.
Ebben az esetben, meg fogja találni az összes szimbólum, az alábbiak szerint:
Attól függően, hogy a követelményeknek, akkor vagy egyszerűen törli a sort a nevét és myintvar func0. vagy adjunk nekik a kulcsszó rejtettek. Akkor majd mentse az export fájlt, és másolja a kapott fájlt a linker segítségével -bE lehetőségek: exportfile.
Ebben az egész folyamat befejeződött. Most a kapott dinamikus megosztott objektumként fogja tartalmazni exportált nevet func1__Fi (azaz func1 ..):
Egy másik lehetőség az, hogy kifejezetten generál export fájlt CreateExportList segédprogramot. az alábbiak szerint:
Ebben a példában minden ugyanúgy működik, mint az előző évben.
Ha az új formátumban AIX 6.1-es verzió felett hozzá a kulcsszavakat, a szimbolikus elnevezés igényel sok időt és erőfeszítést igényel. Ebben a tekintetben a következő verziójú XL C / C ++ fordítóprogram tervezik számos fejlesztést, amelyek könnyebbé teszik a fejlesztők számára (mondjuk a második cikk ebben a sorozatban).
Abban az esetben, az export- összes információt tárolt táblázatok a táblázatok, és annak szükségességét, hogy módosítani kell a forráskód nem elérhető. Ez lehetővé teszi, hogy ossza el a munkát kód írása, és dolgozik a fejlesztési könyvtárak. Azonban, ha ezt a módszert, akkor találkozhat a probléma. Mivel a forrás fájl nem változik a bináris kódot a fordító által generált, akkor nem lesz optimális. A fordító nem lehet elég információt, hogy optimalizálja ezek a szimbólumok, amelyeket nem exportálják. Ez ahhoz vezethet, hogy vagy növekedéséhez bináris méretű, vagy lassú a feloldásának folyamata a szimbólum. Szerencsére a legtöbb alkalmazás nem túl komoly probléma.
Az alábbi táblázat összehasonlítja a fenti három módszer.