Attualmente sto lavorando a un progetto in cui devo monitorare l'utilizzo di più chiamate di sistema e funzioni di basso livello come mmap
, brk
, sbrk
. Finora, l'ho fatto usando l'interposizione di funzioni: scrivo una funzione wrapper con lo stesso nome della funzione che sto sostituendo (ad esempio mmap
) e la carico in un programma impostando la variabile di ambiente LD_PRELOAD
. Chiamo la funzione reale attraverso un puntatore che carico con dlsym
.Interposizione delle funzioni in Linux senza dlsym
Sfortunatamente, una delle funzioni che voglio avvolgere, sbrk
, viene utilizzata internamente da dlsym
, quindi il programma si blocca quando provo a caricare il simbolo. sbrk
non è una chiamata di sistema in Linux, quindi non posso semplicemente usare syscall
per chiamarlo indirettamente.
Quindi la mia domanda è, come posso chiamare una funzione di libreria da una funzione wrapper con lo stesso nome senza utilizzare dlsym
? C'è qualche trucco del compilatore (usando gcc) che mi permette di fare riferimento alla funzione originale?
Questo è fantastico. Non avevo mai sentito parlare dell'opzione --wrap, ma questo è esattamente ciò di cui ho bisogno. Grazie. –
Per chiarire, i flag --wrap devono essere passati quando si collega l'eseguibile o quando si collega la libreria LD_PRELOAD che contiene i wrapper? Inoltre, prenderesti in considerazione di fornire maggiori informazioni sulla modifica delle voci PLT dell'eseguibile? –
Il caso d'uso progettato è quello di collegare l'applicazione * target * con --wrap. Potrebbe essere possibile farlo funzionare anche per il caso LD_PRELOAD, non sono sicuro, dovrò testare. –