View Full Version : [C++] Demangling funzioni
Ciao a tutti e buon anno.
Vorrei sapere come fare il demangling delle funzioni C++,in quanto il linker tira fuori nomi delle funzioni piuttosto incomprensibili nelle schermate di errore. So che questo comportamento è normale, e so che è possibile mascherarlo, facendogli comunque ritornare il nome corretto senza alcun prefisso o suffisso aggiunto da lui.
Ma come si fa? Si deve inserire del codice particolare nel sorgente? C'è qualche opzione da passare in fase di compilazione? Sto usando icpc e g++ come compilatori.
Grazie a tutti.
Devi usare
extern "C"
O prima della dichiarazione della funzione:
extern "C" void func(int x) { }
Oppure, se hai più di una funzione, con le parentesi graffe:
extern "C" {
void func(int x) { }
void func2(int x) { }
}
Qui è spiegato qualcosa in più:
http://developers.sun.com/solaris/articles/mixing.html#cpp_from_c
Comunque, se è solo per trovare a che funzione si riferisce il linker, pur essendo "manglingata" la stringa contiene il nome della funzione... prova a postare l'output del linker.
Comunque, se è solo per trovare a che funzione si riferisce il linker, pur essendo "manglingata" la stringa contiene il nome della funzione... prova a postare l'output del linker. inoltre se hai compilato con Visual C++ o comunque col compilatore Microsoft esiste un tool per il demangling dei nomi dei simboli, si chiama undname.exe.
Per g++: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/proguide/ref/rkcxxflt.htm
Devi usare
extern "C"
O prima della dichiarazione della funzione:
extern "C" void func(int x) { }
Oppure, se hai più di una funzione, con le parentesi graffe:
extern "C" {
void func(int x) { }
void func2(int x) { }
}
Grazie delle risposte.
Perchè devo dichiararle come funzioni C?
Per g++: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/proguide/ref/rkcxxflt.htm
Ho provato:
c++filt -m -w 40 functions.o
Ma il flag -m non esiste per questo comando..
In quel modo non le dichiari come funzioni c, infatti possono benissimo contenere codice c++ (tranne le funzioni template mi pare di aver letto). Non cambia niente.
Dal link che ti ho postato:
If you declare a C++ function to have C linkage, it can be called from a function compiled by the C compiler. A function declared to have C linkage can use all the features of C++, but its parameters and return type must be accessible from C if you want to call it from C code. For example, if a function is declared to take a reference to an IOstream class as a parameter, there is no (portable) way to explain the parameter type to a C compiler. The C language does not have references or templates or classes with C++ features.
Se però non sono funzioni tue, l'unica soluzione è quella di cionci.
PS: questo topic è già ai primi posti se si ricerca demangling...
http://www.google.it/search?hl=it&q=demangling&btnG=Cerca&meta=
PS: questo topic è già ai primi posti se si ricerca demangling...
http://www.google.it/search?hl=it&q=demangling&btnG=Cerca&meta=
Ah però :D
Ho provato:
c++filt -m -w 40 functions.o
Ma il flag -m non esiste per questo comando..
Guarda l'help...purtroppo non sembra essere implementata quella opzione in linux.
Guarda l'help...purtroppo non sembra essere implementata quella opzione in linux.
Sinceramente non riesco a capire la logica di questo programma. Devo sapere a priori che simboli usa il linker per fare il demangling della funzione. Io speravo di avere un qualcosa che, dato un file oggetto, mi restituisse le funzione "demanglate", ma ho paura che non ci sia nulla del genere :(
Sul comando per AIX invece c'è, ed è proprio il flag -m ..
Cerca di trovare il modo per esportare i simboli da un modulo...sinceramente non riesco ad esserti d'aiuto. In caso di errore puoi comunque passare il nome della funzione mangled a quel comando.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.