C++FILT(1) Instrumente pentru dezvoltare(programare) GNU C++FILT(1)

c++filt - decodifică simbolurile C++ și Java

c++filt [-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-r|--no-recurse-limit]
[-R|--recurse-limit]
[-s format|--format=format]
[--help] [--version] [simbol...]

Limbajele C++ și Java oferă supraîncărcarea funcțiilor, ceea ce înseamnă că puteți scrie mai multe funcții cu același nume, cu condiția ca fiecare funcție să accepte parametri de tipuri diferite. Pentru a putea distinge aceste funcții cu nume similare, C++ și Java le codifică într-un nume de asamblor de nivel inferior care identifică în mod unic fiecare versiune diferită. Acest proces este cunoscut sub numele de mangling. Programul c++filt [1] realizează cartografierea inversă: decodifică (demangles) numele de nivel scăzut în nume de nivel utilizator, astfel încât acestea să poată fi citite.

Fiecare cuvânt alfanumeric (format din litere, cifre, caractere de subliniere, dolari sau puncte) care apare în datele de intrare este un nume potențial modificat(codificat). În cazul în care numele se decodifică într-un nume C++, numele C++ înlocuiește numele de nivel inferior în ieșire, în caz contrar, cuvântul original este afișat la ieșire. În acest fel, puteți trece un întreg fișier sursă de asamblare, care conține nume modificate, prin c++filt și să vedeți același fișier sursă care conține nume decodificate.

De asemenea, puteți utiliza c++filt pentru a descifra simboluri individuale, trecându-le în linia de comandă:

c++filt <simbol>

Dacă nu sunt date argumente simbol, c++filt citește în schimb numele simbolurilor de la intrarea standard. Toate rezultatele sunt afișate la ieșirea standard. Diferența dintre citirea numelor din linia de comandă și citirea numelor de la intrarea standard constă în faptul că se așteaptă ca argumentele din linia de comandă să fie doar nume modificate și nu se efectuează nicio verificare pentru a le separa de textul din jur. Astfel, de exemplu:

c++filt -n _Z1fv

va funcționa și va decodifica numele în "f()", în timp ce:

c++filt -n _Z1fv,

nu va funcționa; (observați virgula suplimentară de la sfârșitul numelui modificat, care îl face nevalid). Cu toate acestea, această comandă va funcționa:

echo _Z1fv, | c++filt -n

și va afișa „f(),”, adică numele decodificat urmat de o virgulă la sfârșit. Acest comportament se datorează faptului că, atunci când numele sunt citite de la intrarea standard, este de așteptat ca acestea să facă parte dintr-un fișier sursă de asamblare în care ar putea exista caractere suplimentare, străine, care să urmeze după un nume modificat. De exemplu:

.type _Z1fv, @funcție

-_
Pe unele sisteme, atât compilatoarele C, cât și cele C++ pun o subliniere în fața fiecărui nume. De exemplu, numele C „foo” primește numele de nivel inferior „_foo”. Această opțiune elimină sublinierea inițială. Faptul că c++filt elimină implicit sublinierea depinde de țintă.
Nu elimină liniuța de subliniere inițială.
Atunci când se decodifică numele unei funcții, nu se afișează tipurile de parametri ai funcției.
Încearcă să decodifice tipurile, precum și numele funcțiilor. Acest lucru este dezactivat în mod implicit, deoarece tipurile de tip „mangled” (codificate) sunt utilizate în mod normal numai la nivel intern în compilator și pot fi confundate cu nume care nu sunt „mangled”. De exemplu, o funcție numită „a”, tratată ca un nume de tip „mangled”, ar fi „signed char” (caracter cu semn).
Nu include detalii de implementare (dacă există) în rezultatul decodificat.
Activează sau dezactivează limitarea numărului de recursivități efectuate în timpul decodificării șirurilor de caractere. Deoarece formatele de manipulare a numelor permit un nivel infinit de recursivitate, este posibil să se creeze șiruri a căror decodificare va epuiza spațiul de stivă disponibil pe calculatorul gazdă, declanșând o eroare de memorie. Limitarea încearcă să prevină acest lucru prin restricționarea recursivității la 2048 de niveluri de imbricare.

În mod implicit, această limită este activată, dar poate fi necesar să fie dezactivată pentru a dezmembra nume cu adevărat complicate. Rețineți totuși că, dacă limita de recursivitate este dezactivată, este posibilă epuizarea stivei și orice raport de eroare privind un astfel de eveniment va fi respins.

Opțiunea -r este un sinonim pentru opțiunea --no-recurse-limit. Opțiunea -R este sinonimă cu opțiunea --recurse-limit.

c++filt poate decodifica diferite metode de mangling (codificare), utilizate de diferite compilatoare. Argumentul acestei opțiuni selectează metoda pe care o utilizează:
"auto"
Selecție automată bazată pe executabil (metoda implicită)
"gnu"
cea utilizată de compilatorul GNU C++ (g++)
"lucid"
cea utilizată de compilatorul Lucid (lcc)
"arm"
cea specificată de „C++ Annotated Reference Manual” (Manualul de referință adnotat C++)
"hp"
cea utilizată de compilatorul HP (aCC)
"edg"
cea utilizată de compilatorul EDG
"gnu-v3"
cea utilizată de compilatorul GNU C++ (g++) cu ABI V3.
"java"
cea utilizată de compilatorul GNU Java (gcj)
"gnat"
cea utilizată de compilatorul GNU Ada (GNAT).
Afișează un rezumat al opțiunilor lui c++filt și iese.
Afișează numărul de versiune al lui c++filt și iese.
@fișier
Citește opțiunile liniei de comandă din fișier. Opțiunile citite sunt inserate în locul opțiunii originale @fișier. Dacă fișier nu există sau nu poate fi citit, atunci opțiunea va fi tratată literal și nu va fi eliminată.

Opțiunile din fișier sunt separate prin spații albe. Un caracter de spațiere poate fi inclus într-o opțiune prin includerea întregii opțiuni între ghilimele simple sau duble. Orice caracter (inclusiv o bară oblică inversă) poate fi inclus prin prefixarea caracterului care urmează să fie inclus cu o bară oblică inversă. fișier poate conține la rândul său opțiuni @fișier suplimentare; orice astfel de opțiuni vor fi procesate în mod recursiv.

1.
MS-DOS nu permite caracterele „+” în numele fișierelor, așa că pe MS-DOS acest program se numește CXXFILT.

intrările Info pentru binutils.

Drepturi de autor © 1991-2024 Free Software Foundation, Inc.

Se acordă permisiunea de a copia, distribui și/sau modifica acest document în conformitate cu termenii Licenței GNU Free Documentation, versiunea 1.3 sau orice versiune ulterioară publicată de Free Software Foundation; fără secțiuni invariante, fără texte de copertă și fără texte de contra copertă. O copie a licenței este inclusă în secțiunea intitulată „GNU Free Documentation License”.

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

7 mai 2024 binutils-2.42.0