uni
Siccome nel C++ è possibile l’overloading (avere più funzioni con lo stesso nome ma con parametri diversi), è necessario trovare il modo di identificare univocamente ogni funzione con i suoi parametri, se vogliamo implementare una funzione in assembly da chiamare da un file c++.
Oppure possiamo dichiarare la funzione in C++ come:
extern "C" eccquesto indica al compilatore che la funzione usa il linking di C e quindi il nome non deve essere mangled, e può cercarlo semplicemente tramite il nome.
tipi built-in:
==v ⇒ void==
w ⇒ wchar_t
b ⇒ bool
c ⇒ char
a ⇒ signed char
h ⇒ unsigned char
s ⇒ short
t ⇒ unsigned short
i ⇒ int
j ⇒ unsigned int
l ⇒ long
m ⇒ unsigned long
f ⇒ float
d ⇒ double
tipi utente:
<N><NOME>
Dove N è il numero di caratteri di <NOME> e <NOME> è il nome del tipo ad esempio
5Punto
2st
9struttura
4elem
Tipi composti:
P ⇒ puntatore
K ⇒ const
R ⇒ riferimento
Le keyword su riferiscono all’oggetto immediatamente precedente (o quello successivo se non esiste un precedente, ad esempio
const int==int const).
Const se è l’ultima keyword “cade”:
void foo(int const)==void foo(int). Infatticonstè implicito poiché alla funzione viene passato il valore.
somma(punto*) = __Z5sommaP5punto
Nomi ripetuti
Se un tipo utente viene riferito più volte (ad esempio somma(st, st)) anzichè riscriverlo si usa:
S_ ⇒ per riferisi al primo tipo utente incontrato nella stringa
S0_ ⇒ per riferisi al secondo
S1_ ⇒ al terzo e così via
somma(st, st) ⇒ _Z5somma2stS_
somma(punto, punto, st, st*, punto*) ⇒ _Z5somma5puntoS_2stPS0_PS_
Funzioni di Classi
_ZN<nomeNested>E<parametri>
- N : nested
- E : end nested
- nomeNested è composto da (in ordine) tutti gli spazi di nomi che ci portano alla funzione
- il nome di ogni costrutture è “C1”
- il nome di ogni distrutture è “D1”
.global __ZN<lenght><name>C1E[parametri]
[parametro] = <composito><lenght><name>Esempio
cl:cl(st1&, int[])
->
__ZN2clC1ER3st1Pi
c++filt
Questo comando può dato il mangle, darci la traduzione human readable:
$> c++filt <mangle>
humanreadable
$>