Pra*_*rav 47 c++ g++ name-mangling
有没有办法从g ++中的demangled名称中找回受损的名称.
例如,我有demangled名称func(char*, int),我该怎么做才能获得受损的名称,即_Z4funcPci返回?
我的问题是g ++特定的.
小智 41
您可以简单地使用g ++编译带有您需要的签名的空函数,并从中提取名称.例如:
echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'
Run Code Online (Sandbox Code Playgroud)
给出输出
_Z2f1Pci
Run Code Online (Sandbox Code Playgroud)
这就是我认为你需要的.确保包含任何相关的头文件,因为它们会影响符号的损坏方式.
184*_*615 13
根据Bojan Nikolic的方法,这是一个更好的脚本:
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/:$//'
Run Code Online (Sandbox Code Playgroud)
使用:
$ ./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
Run Code Online (Sandbox Code Playgroud)
但是对于构造函数和析构函数,请记住有C0 C1 C2和D0 D1 D2.