versiones sirven que programación para lista lenguaje historia evolucion entorno ejemplos definicion creator comandos caracteristicas basicos aplicaciones c++ compiler-construction dlsym demangler

c++ - sirven - programación en lenguaje c



¿Qué es la utilidad de Linux para destruir un nombre de símbolo de C++? (4)

Tengo el comando c++filt para desentrañar un símbolo, ¿cuál es la herramienta para hacer lo contrario y destruir un nombre de símbolo?

Esto sería útil si quisiera llamar a dlsym() en un nombre de función de C ++ mutilado. Prefiero no codificar el nombre del código en el código, ya que podría cambiar con el tiempo debido a las nuevas versiones compatibles o las nuevas marcas de compiladores que se están utilizando o en la actualidad debido a la compilación de múltiples plataformas.

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

Aquí está la solución más cercana a una solución que he encontrado en este sitio, que se logra mediante el uso de un nombre de estilo C fijo para dlsym() símbolos C ++ que se definen en la biblioteca que desea dlsym() , pero si no tiene control sobre Lo que proporciona esa biblioteca, esto no es una opción.


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

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


Es posible que pueda obtener lo que desea mirando la tabla de símbolos de .so que está viendo: alguien más respondió a esto ya Devolviendo una tabla de símbolos de biblioteca compartida .

Sin embargo, si hay demasiados símbolos ... puede que no funcione.
Así que aquí hay una idea loca. ¡Cavtor emptor!

Una solución potencial es:

  1. cree un archivo con un código auxiliar con exactamente un nombre: el nombre que desea: void myfunction () {}

  2. compile ese archivo (con -fPIC y -shared para que sea una biblioteca dinámica)

  3. llame a dlopen / dlsym en ese archivo en particular

  4. Iterar a través de los símbolos (solo debe haber uno que quiera más otro tipo de basura que pueda filtrar). Iterar a través de los símbolos es torpe, pero puede hacerlo: Devolver una tabla de símbolos de una biblioteca compartida

  5. dlclose () para liberarlo (perder el talón de tus símbolos)

  6. Abre el archivo que quieras con dlopen

Básicamente, usted invocaría el compilador desde su código, crearía un .so que podría ver, obtener el único valor, y luego descargarlo. Así podría cargar el que desee.

Es una locura.


La manipulación de nombres es específica de la implementación.

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

Nombre mangling

Aquí hay una tabla que puede ayudarlo si desea hacerlo manualmente.


Un método más fácil que el primero publicado. Escribe 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)); }

Construirlo con

# g++ -S test.cpp

Y extrae el nombre del símbolo de la fuente del ensamblador

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

Usted obtiene:

rcoscali@srjlx0001:/tmp/TestC++$ cat test.s | grep call | grep doit | awk ''{print $2}'' _Z4doitPKcb rcoscali@srjlx0001:/tmp/TestC++$

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

Que te diviertas !