我已经构建了一个小补丁来附加到某个应用程序并跟踪某些函数的调用。其中,malloc() 和 open()。我正在使用 dlsym 来存储指向原始符号的指针并用我自己的替换函数名。它可以在 linux 下完美地编译和工作。这是代码:
#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 下运行得非常好!但是当我回到家并尝试在 Mac 下使用 GCC 编译它时,它无法编译并且 LD_PRELOAd 指令不起作用。我应该改变什么?非常感谢。