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.