【发布时间】:2019-05-16 21:33:18
【问题描述】:
我想将malloc 包装在一个函数中,该函数将打印分配大小、指针地址和分配时间。这可以通过我的malloc 实现预加载我的共享库来实现。这段代码实现了:
#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
static void* (*real_malloc)(size_t size) = NULL;
static void* (*real_calloc)(size_t nelements, size_t elementSize) = NULL;
static void init(void)
{
real_malloc = dlsym(RTLD_NEXT, "malloc");
if (NULL == real_malloc)
{
fprintf(stderr, "Error: %s\n", dlerror());
}
}
void *malloc(size_t size)
{
if(real_malloc == NULL)
{
init();
}
void *p = NULL;
p = real_malloc(size);
fprintf(stderr, "size=%lu, pointer=%p\n", size, p);
return p;
}
但是如果我将时间打印功能添加到malloc:
static void printTime()
{
time_t timer;
char buffer[26];
struct tm* tm_info;
time(&timer);
tm_info = localtime(&timer);
strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
fprintf(stderr, "%s\n", buffer);
}
并添加 time.h 标头并使用可执行文件运行我的 .so 库,它只会冻结并且什么都不做。
我怀疑 time 或 localtime 在后台调用 malloc 会导致问题。另一方面,real_malloc 确实被调用了,所以应该没有问题。
我的可执行文件是多线程的,但添加互斥锁并没有帮助。我编译.so的方式如下:
gcc -fPIC -shared -o bin/libpreload.so myAlloc.c -ldl
可以使用 Linux ps 程序验证该问题:
cd /bin && LD_PRELOAD=/home/username/Desktop/alloc/bin/libpreload.so ./ps
【问题讨论】:
-
您的打印时间不正确
-
vdso 在查询时钟方面也有特殊性
标签: c linker mocking malloc shared-libraries