Actualmente estoy trabajando en un proyecto donde necesito rastrear el uso de varias llamadas al sistema y funciones de bajo nivel como mmap
, brk
, sbrk
. Hasta ahora, he estado haciendo esto mediante la interposición de funciones: escribo una función de envoltura con el mismo nombre que la función que estoy reemplazando (mmap
por ejemplo) y la cargo en un programa configurando la variable de entorno LD_PRELOAD
. Llamo a la función real a través de un puntero que cargo con dlsym
.interposición de funciones en Linux sin dlsym
Desafortunadamente, una de las funciones que quiero envolver, sbrk
, se usa internamente por dlsym
, por lo que el programa se bloquea cuando intento cargar el símbolo. sbrk
no es una llamada al sistema en Linux, así que no puedo simplemente usar syscall
para llamarlo indirectamente.
Así que mi pregunta es, ¿cómo puedo llamar a una función de biblioteca desde una función de contenedor del mismo nombre sin usar dlsym
? ¿Hay algún truco de compilación (usando gcc) que me permita referirme a la función original?
Esto es genial. Nunca había escuchado sobre la opción --wrap, pero esto es exactamente lo que necesito. Gracias. –
Para aclarar, ¿se deben pasar los parámetros --wrap al vincular el ejecutable o al vincular la biblioteca LD_PRELOAD que contiene los wrappers? Además, ¿consideraría proporcionar más información sobre la modificación de las entradas PLT del ejecutable? –
El caso de uso diseñado es para que vincule la aplicación * target * con --wrap. También es posible hacer que funcione para el caso LD_PRELOAD, no estoy seguro, tendré que probarlo. –