traduccion name mangling c++ g++ name-mangling

c++ - name - Obteniendo el nombre destrozado del nombre demandado



mangling traduccion (3)

¿Hay alguna manera de recuperar el nombre mutilado del nombre demandado en g ++?

Por ejemplo, tengo el nombre demandado func(char*, int) , ¿qué debo hacer para recuperar el nombre destrozado, es decir, _Z4funcPci ?

Mi pregunta es específica de g ++.


Basado en el enfoque de Bojan Nikolic, aquí hay un mejor guión:

mangle.bash:

IFS=''::'' read -a array <<< "$1" indexes=("${!array[@]}") prefix="" middle="" suffix="" rettype="" if [ -z "$2" ]; then rettype="void" fi for index in "${indexes[@]}" do #echo "$index ${array[index]}" if [ $index == ${indexes[-1]} ]; then #echo "last" middle="$rettype ${array[index]};" elif [ -n "${array[index]}" ]; then #echo "not empty" prefix="${prefix}struct ${array[index]}{" suffix="${suffix}};" fi done #echo "$prefix$middle$suffix $rettype $1{}" echo "$prefix$middle$suffix $rettype $1{}" | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e ''s/:$//''

Utilizar:

$ ./mangle.bash "abc::def::ghi()" _ZN3abc3def3ghiEv $ ./mangle.bash "abc::def::ghi(int i, char c)" _ZN3abc3def3ghiEic $ ./mangle.bash "abc::def::def(int i, char c)" constr _ZN3abc3defC2Eic $ ./mangle.bash "abc::def::~def()" destr _ZN3abc3defD2Ev

Pero en cuanto a constructores y destructores, recuerde que hay C0 C1 C2 y D0 D1 D2.


Lo que es peor, a veces no se puede modificar un nombre porque debe obtener más de un resultado.

Consulte https://reverseengineering.stackexchange.com/q/4323/4398 (hay varios destructores en VFT, y todos ellos se solicitan como ClassName::~ClassName() ). (Lo mismo se aplica a los constructores, he visto constructores C0 y C2).

Por otro lado, esa respuesta hace referencia a Itanium ABI: https://refspecs.linuxbase.org/cxxabi-1.75.html#mangling-type donde se especifica el proceso de maning.

El paquete itanium-abi Haskell: no funcionó para mí (mayo de 2014)

Hay un paquete de Haskell http://hackage.haskell.org/package/itanium-abi que promete tanto la demanda como la manipulación, pero solo puedo ejecutar lo que exige:

Instalación en Ubuntu Preciso:

sudo aptitude install ghc sudo aptitude install cabal-install cabal update cabal install itanium-abi

Luego ejecutas ghci y luego de import ABI.Itanium e import Data.Either bien obtienes:

Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ]) "typeinfo for QSystemLocale"

Hay mangleName , pero se necesita un DecodedName que es una estructura de datos en lugar de una cadena, y esa estructura de datos solo la produce demangleName (a menos que haya pasado por alto algo). Con suerte, esto mejorará en algún lanzamiento futuro.

El código de clang

No probé el código clang .


Simplemente puede usar g ++ para compilar una función vacía con la firma que necesita y extraer el nombre de esa. Por ejemplo:

echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e ''s/:$//''

da salida

_Z2f1Pci

que es lo que necesitas. Asegúrese de incluir cualquier archivo de encabezado relevante, ya que afectará la forma en que se destrozan los símbolos.