Estoy escribiendo una herramienta. Una parte de esa herramienta será su capacidad para registrar los parámetros de las llamadas al sistema. Bien, puedo usar ptrace
para ese propósito, pero ptrace
es bastante lento. Un método más rápido que se me ocurrió fue modificar el glibc. Pero esto se está poniendo difícil, ya que gcc inserta mágicamente sus propias funciones integradas como envoltorios de llamadas al sistema que usando el código definido en glibc. Usar -fno-builtin
tampoco ayuda en eso.¿Es esta una buena manera de interceptar las llamadas al sistema?
Así que se me ocurrió la idea de escribir una biblioteca compartida, que incluye cada contenedor de llamadas del sistema, como mmap
y luego realizar el registro antes de llamar a la función de conteo de llamadas del sistema. Por ejemplo, el pseudo código de cómo se vería mi mmap
se da a continuación.
int mmap(...)
{
log_parameters(...);
call_original_mmap(...);
...
}
Luego puedo usar LD_PRELOAD para cargar esta biblioteca primero. ¿Crees que esta idea funcionará o me falta algo?
Probablemente no funcionará para ejecutables vinculados estáticamente. Y no funcionará para ejecutables haciendo syscalls sin pasar por libc. –
¿Desea interceptar cada vez que se realiza una llamada real del sistema (en cada 'int 0x80'), o en cada llamada a las funciones de un manejador de biblioteca? – Chris
Creo que probablemente sea lento. Eso es básicamente lo que Valgrind hace por su instrumentación, y a pesar de ser una herramienta muy conocida y desarrollada, aún mata el rendimiento. Creo que si hubiera una manera más rápida, ya se habría utilizado allí. Supongo que subestimas cuánto costará la función de registro y no hay forma de evitarlo. – zebediah49