2012-07-04 18 views
39

Tengo el comando c++filt para exigir un símbolo, ¿cuál es la herramienta para hacer lo contrario y destruir un nombre de símbolo?¿Qué es la utilidad de Linux para modificar un nombre de símbolo de C++?

Esto sería útil si deseara llamar al dlsym() en un nombre de función C++ mutilado. Prefiero no codificar el nombre difícilmente en el código, ya que podría cambiar con el tiempo debido a nuevas versiones de compiladores o nuevas marcas de compilador que se utilizan o en la actualidad debido a la compilación de múltiples plataformas.

¿Hay una manera programática de obtener la cadena que representa una función C++ en tiempo de ejecución para que el código sea independiente del compilador? Una forma de hacer esto sería llamar a una utilidad en tiempo de compilación que realiza el cambio de nombre para el compilador que se está utilizando e inserta el nombre de símbolo de C++ destrozado apropiado en una cadena para dlsym().

Here is the closest to a solution I've found on this site que se logra utilizando un nombre de estilo C fijo para los símbolos C++ que están definidos en la biblioteca que desea dlsym(), pero si no tiene control sobre lo que proporciona esa biblioteca, esta no es una opción.

+13

Todo el mundo usa un compilador de C++ para modificar los nombres. –

+2

¿Qué tal, eh, el compilador? –

+1

-1, el compilador es lo único que necesita ... y esa es una respuesta bastante obvia. – Griwes

Respuesta

3

Usted puede ser capaz de conseguir lo que quiere mirando a la tabla de símbolos del .so que están mirando: Alguien más respondió esto ya Returning a shared library symbol table.

Sin embargo, si hay demasiados símbolos ... eso puede no funcionar.
Así que aquí está una idea loca. ¡Caveat Emptor!

Una posible solución es:

  1. crear un archivo con un talón con exactamente un nombre: el nombre que desea: mifuncion void() {}

  2. compilar ese archivo (con - fPIC y -compartida por lo que es una biblioteca dinámica)

  3. llamada dlopen/dlsym en ese archivo en particular

  4. Iterar excelentes referencias ugh los símbolos (solo debería haber solo el deseo más otros desperdicios regulares que pueda filtrar). Iteración a través de los símbolos es torpe, pero usted puede hacerlo: Returning a shared library symbol table

  5. dlclose() para liberar hacia arriba (perder el talón de sus símbolos)

  6. Abra el archivo que desea con dlopen

Básicamente, debe invocar el compilador de su código, se crearía un .so se podía ver, obtener el único valor a cabo, a continuación, descargar ese .so por lo que puede mostrarse en el que usted desea.

Es una locura.

3

El mapeo de nombres es específico de la implementación.

No existe un estándar para la creación de nombres por lo que su mejor opción es encontrar un compilador que lo haga por usted.

Name mangling

Hay una mesa aquí que puede ayudarle si desea hacerlo manualmente

5

Así es como g ++ mangles los nombres. Puede implementar esas reglas de manipulación en su programa.

Otra (loca) solución sería enumerar todos los símbolos de la biblioteca que desea utilizar (no es tan difícil si comprende el formato), exigirlos todos y buscar el nombre de su función en esa lista. La ventaja de este método es que demannding es más fácil, ya que hay una llamada de función para hacerlo: abi::__cxa_demangle, desde el encabezado cxxabi.h.

+0

¡enlace roto! Encontré esta referencia: http://refspecs.linuxbase.org/cxxabi-1.83.html#mangling – fonini

0

Un método más fácil que el primero publicado. escribir un pequeño programa en C++ como:

#include <stdlib.h> 

extern int doit(const char *toto, bool is); 

int main(int argc, char *argv[]) 
{ 
    exit(doit (argv[0], true)); 
} 

Construir con

# g++ -S test.cpp 

y extraer el nombre del símbolo de la fuente ensamblador

# cat test.s | grep call | grep doit | awk '{print $2}' 

Se obtiene:

[email protected]:/tmp/TestC++$ cat test.s | grep call | grep doit | awk '{print $2}' 
_Z4doitPKcb 
[email protected]:/tmp/TestC++$ 

El doit símbolo mutilado es _Z4doitPKcb Utilice el compilador que planea usar porque cada compilador tiene sus propias reglas de creación de nombres (como se ha dicho anteriormente de un compilador a otro estas reglas pueden cambiar).

¡Diviértete!

+0

Dado que los cumplidores pueden variar, la pregunta es pidiendo una forma en el tiempo de ejecución para calcular esto de forma dinámica. – WilliamKF

Cuestiones relacionadas