2011-03-22 11 views
5

estoy usando LD_PRELOAD para capturar la llamada al sistema write() en linux. Tengo éxito en hacer esto para escribir llamadas al sistema y hacerlo funcionar.LD_PRELOAD no funciona para printf

Pero cuando llamo a printf() esa vez no funciona. Si observamos printf stack trace usando strace, encontré que, al final, printf llama a write() al sistema para que escriba en la consola, pero en ese momento mi llamada al sistema write() no se llama antes de llamar a la llamada al sistema write() .

¿Alguien tiene alguna idea de por qué sucede esto?

+0

Publique algunos fragmentos de código para que podamos ver lo que está sucediendo. –

+0

[Esto] (https://stackoverflow.com/questions/13374240/why-ld-preload-doesnt-work-for-one-of-loaded-shared-libraries) también podría estar relacionado. – Albert

Respuesta

11

Las llamadas a función realizadas desde una biblioteca a otra o desde el ejecutable a una biblioteca cargada dinámicamente pasan por el PLT (Tabla de enlaces de procedimientos) y pueden redirigirse mediante el uso de LD_PRELOAD. Sin embargo, las llamadas a funciones dentro de una biblioteca se pueden resolver en tiempo de compilación y no pasan por el PLT. Por lo tanto, no pueden ser redirigidos por LD_PRELOAD. Dado que printf y write se compilan en libc.so.6, la llamada a escribir desde printf nunca pasa por el PLT para buscar una posible redirección, pero cuando llama a la escritura directamente desde su aplicación (o desde otra biblioteca compartida) lo hace .

Cuestiones relacionadas