Hay alguna forma de recuperar el trastoca nombre de demangled nombre en g++.

Por ejemplo , tengo la demangled nombre func(char*, int), ¿qué debo hacer para obtener la alterados recuerdo el nombre.e _Z4funcPci la espalda?

Mi pregunta es g++ específicos.

  • Gran enlace, pero ¿hay alguna manera de saber si es actualizada y autorizada? El nombre de dominio parece ser a un sitio web en la Universidad de Winnipeg.
  • American técnica de las universidades tienen la buena costumbre de no poner la basura en su sitio web oficial(s).
  • En la página de contenidos que los enlaces a la página: «Este documento fue generado el 27 de agosto de 1999». También, de Winnipeg, en Canadá, si mal no recuerdo 😛
  • correcto. Debí haber dicho «americano». Bueno, vamos a intentar buscar una nueva versión.
  • también, este relacionadas con el MODO P/A señala el mismo sitio 🙂
  • Verdadero. Ahora he ido y llovió sobre la respuesta del desfile demasiado. :-/

3 Comentarios

  1. 41

    Usted puede simplemente utilizar g++ para compilar una función vacía con la firma que se requieren y extraer el nombre de la. Por ejemplo:

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

    da salida

    _Z2f1Pci

    que es creo lo que usted requiere. Asegúrese de incluir cualquier encabezado de los archivos a medida que afectará a la manera en que los símbolos están destrozadas.

    • Buen enfoque. Y el uso c++filt para la otra dirección.
    • No siempre es fácil. Suponga que tiene nombres como IFS::Profiler::create(IFS::Handle hdl).
    • exactamente «no es fácil». La compilación falla si cualquiera de dichas estructuras de datos no son declarados. Algunos de ellos están en el código, algunos de ellos vienen de los encabezados.
    • Genial! Yo no te puedo decir cuánto tiempo he perdido tratando de hacer esto…
  2. 12

    Basado en el de Bojan Nikolic, del enfoque, he aquí una mejor guión:

    destrozar.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/:$//'

    Uso:

    $ ./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 como a constructores y destructores, recuerde que hay C0 C1 C2 e D0 D1 D2 queridos.

    • Cam explicar cómo su secuencia de comandos toma en el segundo parámetro (constr/destr)? Yo puedo ver en el código (sólo veo $1). También, ¿cuáles son C0, C1 y C2 ctors/dtors?
    • Por favor, perdona mi ignorancia… ¿por Qué es mejor?
    • trate de conseguir el trastoca nombre para abc::def::ghi() con el guión original
    • El script solo funciona con argumentos de tipos integrados. Una vez que usted haya personalizado tipos, tendrá que incluir las declaraciones que figuran en el encabezado de los archivos temporales de código C++.
    • Esta solución es todavía incompleta, porque no se manejan complejos tipos de argumento. Creo incluyendo los encabezados es inevitable en el caso general.
  3. 3

    Lo que es peor, a veces no destrozar un nombre, ya que deben obtener más de un resultado.

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

    Por otro lado, la respuesta hace referencia a la Itanium ABI: https://refspecs.linuxbase.org/cxxabi-1.75.html#mangling-type donde destrozarlo se especifica.

    El itanium-abi Haskell paquete: no trabajo para mí (Mayo de 2014)

    Hay un paquete de Haskell
    http://hackage.haskell.org/package/itanium-abi
    que promete tanto demangling y destrozarlo, pero yo podría ejecutar sólo el demangling:

    Instalación en Ubuntu precise:

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

    A continuación, ejecutar ghci y después de import ABI.Itanium y import Data.Either que se obtiene:

    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 que la estructura de datos es producida sólo por demangleName (a menos que se me pasa por alto algo). Esperemos que esto va a mejorar en un futuro de liberación.

    El ruido de código

    Yo no intente el ruido de código.

Dejar respuesta

Please enter your comment!
Please enter your name here