2011-03-29 11 views
10

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

18

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.)

+0

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

+0

@klayme: De nada, y gracias por aceptar la respuesta, ¿significa eso que funcionó bien? (Creo que interceptar '__xstat64' y' __xstat64' es correcto.) –

+0

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. –

Cuestiones relacionadas