J'ai construit un petit patch pour ajouter à une certaine application et tracer les invocations de certaines fonctions. Parmi eux, malloc() et open(). J'utilise dlsym pour stocker le pointeur sur le symbole original et remplacer le nom de la fonction par le mien. Il compile - et fonctionne - parfaitement sous Linux. Voici le code:Ansi C patch utilisant dlsym compile OK sous Linux mais échoue sur Mac OS X
#define _GNU_SOURCE
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <dlfcn.h>
/**
* Interponemos nuestra funcion open
*
* @param char* filename
* @param int flags
**/
int open(char * filename, int flags)
{
static int (*real_open)(char*, int) = NULL;
if (!real_open)
real_open = dlsym(RTLD_NEXT, "open");
// Entero
int p = real_open(filename, flags);
fprintf(stderr, "Abrimos %s) = %i\n", filename, flags);
// Devolvemos
return p;
}
//--------------------------------------------------------
/**
* Interponemos nuestra funcion malloc
*
* @param size_t size
*/
void* malloc(size_t size)
{
static void* (*real_malloc)(size_t) = NULL;
if (!real_malloc)
real_malloc = dlsym(RTLD_NEXT, "malloc");
void *p = real_malloc(size);
// Memoria reservada
fprintf(stderr, "Reserva de memoria (%d) = %p\n", size, p);
// Devolvemos
return p;
}
Puis, je le compile avec l'instruction suivante, créant un pi.so.
gcc -Wall -O2 -fPIC -shared -ldl -o pi.so pi.c
Ensuite, j'utilise la directive LD_PRELOAD pour l'injecter dans n'importe quelle application.
LD_PRELOAD=/home/.../injection/pi.so <binary>
Et ça fonctionne merveilleusement sous Linux! Mais quand je rentre à la maison et essaie de le compiler en utilisant GCC sous Mac, il ne compile pas et la directive LD_PRELOAd ne fonctionne pas. Que devrais-je changer? Merci beaucoup.
Juste pour que vous le savez, il y avait un rectificatif technique publié au travail autour du fait que C ne définit pas le comportement pour la conversion d'un pointeur de vide à un pointeur de fonction . Voir l'exemple sur la page POSIX pour [dlsym] (http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html) pour voir comment l'utiliser de manière conforme. – dreamlax