从demangled名称中获取受损的名称

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)

这就是我认为你需要的.确保包含任何相关的头文件,因为它们会影响符号的损坏方式.

  • 好方法.并使用`c ++ filt`作为另一个方向. (5认同)
  • 这并不总是那么容易.假设你有像'IFS :: Profiler :: create(IFS :: Handle hdl)`这样的名字. (5认同)
  • 完全"不那么容易".如果未声明任何提及的数据结构,编译将失败.其中一些在您的代码中,其中一些来自标题. (3认同)

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.