He hecho una pequeña biblioteca compartida que intenta interceptar las llamadas a open, open64, stat y stat64 sys. Cuando exporto LD_PRELOAD y ejecuto el sqlplus de oracle, puedo ver los rastros de las llamadas open y open64, pero no hay rastros de las llamadas stat y stat64. La biblioteca compartida es un único archivo c con todas las definiciones de las llamadas al sistema. ¿Por qué sucede que algunas llamadas de sistema se interceptan y otras no? gracias por su ayuda.c y LD_PRELOAD. abrir y abrir64 llamadas interceptadas, pero no stat64
Respuesta
Debido a que el GNU libc
implementa open()
y open64()
como era de esperar (es decir, que son sólo símbolos de enlace dinámico que se puede enganchar en la LD_PRELOAD
), pero hace algo especial con stat()
y stat64()
.
Si nos fijamos en los símbolos exportados por libc
(por ejemplo, con nm -D /libc/libc.so.6
), verá que en realidad no proporcionar los símbolos stat
o stat64
!
Las llamadas a estas funciones se envuelven, ya sea en tiempo de compilación (si es posible) por funciones en línea en <sys/stat.h>
, o (en su defecto) las definiciones vinculadas estáticamente proporcionadas por libc_nonshared.a
.
Las funciones vinculadas dinámicamente reales que se llaman son __xstat()
o __xstat64()
; y estos toman un primer argumento adicional, un entero, que es un número de versión que indica el diseño de struct stat
que espera la persona que llama. Intenta conectar estos en su lugar.
(El punto de todo esto es para permitir que el enlace dinámico libc
de soporte a los ejecutables que utilizan varios diseños incompatibles de struct stat
y definiciones de los bits en mode_t
;. Si nos fijamos en /usr/include/sys/stat.h
encontrará un comentario a este efecto fstat()
, fstat64()
, lstat()
, lstat64()
y mknod()
también se ven afectados de la misma manera.)
- 1. LD_PRELOAD no funciona para printf
- 2. llamadas LoadPackage inicializar, pero registerClass no funcionarán
- 3. LD_PRELOAD para métodos de clase C++
- 4. LD_PRELOAD afecta nuevo niño, incluso después de unsetenv ("LD_PRELOAD")
- 5. g ++ funciona, pero no "g ++ -c" y ld
- 6. R y llamadas al sistema
- 7. LD_PRELOAD con setuid binary
- 8. ¿Por qué LD_PRELOAD no parece funcionar para escribir con wc
- 9. abrir y cerrar usando OpenCV
- 10. orden de convocatoria y evaluación de llamadas
- 11. Cuarzo y primavera: ¿agrupado pero NO persistente?
- 12. ¿Por Expression.And representa "Y", pero no "&&"
- 13. ViM: busque y resalte pero no salte
- 14. cómo obtener doxygen para generar gráficos de llamadas y llamadas para funciones c
- 15. mezcla súper clásicos y llamadas en Python
- 16. innerHtml funciona en IE y Firefox, Chrome, pero no
- 17. WCF Existe y funciona parcialmente, pero para algunas llamadas devuelve "sin escucha de punto final - (404) no encontrado".
- 18. error o característica: abrir y io.open no son intercambiables
- 19. Abrir archivo para leer y escribir (no anexar) en perl
- 20. ASP.NET y enviar SMS/hacer llamadas telefónicas
- 21. C#: ¿Cómo puedo abrir y cerrar un libro de Excel?
- 22. ¿Qué son los registros de llamadas y de llamadas guardadas?
- 23. En Python 3.2, puedo abrir y leer una página web HTTPS con http.client, pero urllib.request no abre la misma página
- 24. ¿Abrir archivo, escribir y guardar?
- 25. Códigos de Python y llamadas a funciones
- 26. ¿Cómo ejecutar gdb con LD_PRELOAD?
- 27. Llamadas de API de Mocking y Win32
- 28. C++ ¿Puedo reutilizar fstream para abrir y escribir varios archivos?
- 29. LD_PRELOAD solo funciona para malloc, no es gratuito
- 30. Cómo recibir el número de llamadas y SMS perdidos
Hola Matthew. Gracias por tu ayuda. Pero acabo de notar que el problema de no interceptar llamadas ocurre solo con funciones que tienen "struct stat64" como parámetro. Funciona para fstat, pero no para fstat64 o stat64. ¿Podría ser un problema en la definición de mi función? ¿O debo interceptar __xstat64 y __fxstat64? Gracias de nuevo. – klayme
@klayme: De nada, y gracias por aceptar la respuesta, ¿significa eso que funcionó bien? (Creo que interceptar '__xstat64' y' __xstat64' es correcto.) –
Esto funcionó bien para mí cuando se combinó con la fuente en http://www.tcm.phy.cam.ac.uk/sw/inodes64.html. No parchan las versiones de 64 bits, sino que solo declaran la interfaz. Los parché también para permitir que un compilador de 32 bits llamara correctamente a 'stat64()' para manejar inodos de 64 bits. –