У меня есть небольшой патч для добавления в определенное приложение и отслеживание вызовов некоторых функций. Среди них malloc() и open(). Я использую dlsym, чтобы сохранить указатель на исходный символ и заменить имя функции своим. Он компилируется и отлично работает под Linux. Вот код:Патч Ansi C с использованием dlsym компилирует OK под linux, но не работает на 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;
}
Затем я скомпилирую его с помощью следующей инструкции, создав pi.so.
gcc -Wall -O2 -fPIC -shared -ldl -o pi.so pi.c
И затем, я использую директиву LD_PRELOAD, чтобы ввести ее в любое приложение.
LD_PRELOAD=/home/.../injection/pi.so <binary>
И это волнует чудесное под Linux! Но когда я вернусь домой и попытаюсь скомпилировать его с помощью GCC под Mac, он не скомпилируется и директива LD_PRELOAd не работает. Что я должен изменить? Большое спасибо.
Только так вы знаете, произошла техническая опечатка опубликовал работу вокруг того, что C не определяет поведение для преобразования указателя ничтожным в указатель на функцию , См. Пример на странице POSIX для [dlsym] (http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html), чтобы узнать, как использовать его в соответствии с требованиями. – dreamlax