Necesito interponerme en una llamada a un método en un programa C++ (la clase reside en una biblioteca compartida separada). Pensé que podría usar LD_PRELOAD, pero no estoy seguro de cómo funcionaría (solo encontré ejemplos de funciones C): ¿hay alguna manera de configurar la interposición para un único método sin copiar sobre ningún código de la implementación de clase interpuesta?LD_PRELOAD para métodos de clase C++
Respuesta
No sería muy portátil, pero podría escribir su función de interposición en C y darle el nombre mutilado del método C++. Tendría que manejar este parámetro explícitamente, por supuesto, pero creo que todos los ABI de ELF solo lo tratan como un primer argumento invisible.
Simplemente cree un archivo para el código interpuesto (asegurándose de que la implementación esté fuera de línea) ... los espacios de nombres, el nombre de clase y la función deberían ser los mismos que para el método que desea interceptar. En su definición de clase, no mencione los otros métodos que no desea interceptar. Recuerde que LD_PRELOAD necesita una ruta completa al objeto compartido de interceptación.
Por ejemplo, para interceptar vacío X :: na1(), cree un archivo con libx2.cc:
#include <iostream> class X { public: void X::fn1(); }; void X::fn1() { std::cout << "X2::fn()\n"; }
A continuación, compile arriba:
g++ -shared -o libx2.so libx2.cc
A continuación, ejecute ala
LD_PRELOAD=`pwd`/libx2.so ./libx_client
Cheers
esto parece menos hacky. Lo intentaré – BruceBerry
por cierto, ¿cómo llamo al método original desde este nuevo método? – BruceBerry
Yikes: acabo de notar su pregunta. En Linux (solo), puede usar dlsym (RTLD_NEXT, "nombre"): esto indica explícitamente que no coincide con la función de búsqueda, y encuentra uno en un objeto cargado más adelante. Para otros sistemas operativos, no estoy seguro, pero tiene que haber algunas páginas web que hablan sobre la portabilidad de Linux, por lo que una búsqueda RTLD_NEXT es una buena apuesta. Doh - Zack cubrió todos los agradecimientos hace años ...: -. –
- 1. LD_PRELOAD no funciona para printf
- 2. LD_PRELOAD afecta nuevo niño, incluso después de unsetenv ("LD_PRELOAD")
- 3. C# eventos y métodos de la clase
- 4. LD_PRELOAD con setuid binary
- 5. Clonación clase C++ con métodos virtuales puros
- 6. Redefina los métodos de clase o clase
- 7. Métodos definidos fuera de clase?
- 8. clase clase: métodos instancia vs. clase
- 9. programación generar métodos para una clase
- 10. ¿Por qué LD_PRELOAD no parece funcionar para escribir con wc
- 11. Cómo usar gdb con LD_PRELOAD
- 12. ¿Cómo ejecutar gdb con LD_PRELOAD?
- 13. Implementando algunos métodos de una clase de interfaz-C#
- 14. ¿Cómo extiendo una clase con los métodos de extensión C#?
- 15. Notación de puntos en Objective-C con métodos de clase?
- 16. Métodos de anulación C++
- 17. C++ métodos de clase entrante causa referencia indefinida
- 18. Propósito de Métodos de instancia vs. Métodos de clase en Objective-C
- 19. ¿Hay algo así como auto para los métodos de clase?
- 20. ¿Métodos de Ruby sin clase?
- 21. LD_PRELOAD solo funciona para malloc, no es gratuito
- 22. En Objective-C, ¿cuándo debería usar métodos de clase y cuándo debería usar métodos de instancia?
- 23. LD_PRELOAD equivalente para que Windows precargue bibliotecas compartidas
- 24. C# @ modificador para los parámetros de métodos
- 25. Clase abstracta sin métodos abstractos
- 26. Usando la notación "[[]] para métodos de clase de referencia
- 27. C++ para la clase
- 28. Objective C y métodos mágicos en la clase
- 29. Ruby - ¿Cómo redefinir los métodos de clase?
- 30. C instancia # clase con métodos estáticos vs uso de memoria clase estática
tengo la misma pregunta para usted: ¿Cómo llamo al método original de C++? parece que este método oculta su nombre ... – BruceBerry
'dlsym (RTLD_NEXT," mangled_name_of_function ")'. Por cierto, ni mi técnica ni la de Tony funcionarán con funciones virtuales (pero si esta fuera una función virtual, podrías anularla en una subclase, ¿no?) – zwol
No debería anularla porque no debería tocar al cliente código que ejemplifica el objeto tampoco. El método no es virtual, pero aparentemente ninguno de los métodos me funciona: -/ – BruceBerry