首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何预加载共享库并在同一包装函数中使用使用malloc的函数来包装malloc?

如何预加载共享库并在同一包装函数中使用使用malloc的函数来包装malloc?
EN

Stack Overflow用户
提问于 2019-05-17 05:33:18
回答 1查看 55关注 0票数 1

我希望将malloc包装在一个函数中,该函数将打印分配大小、指针地址和分配时间。这可以通过我的malloc实现预加载我的共享库来实现。这段代码实现了以下目标:

代码语言:javascript
复制
#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

代码语言:javascript
复制
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库,它将会冻结,什么也不做。

我怀疑timelocaltime在幕后调用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

下面是我的.so的ldd输出:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 07:10:03

如果malloc中的日志函数最终调用了malloc,则需要跳出递归循环。

因此,仅当在日志记录之外调用malloc时才执行日志记录。

代码语言:javascript
复制
void *malloc(size_t size)
{
    if(real_malloc == NULL)
    {
        init();
    }

    void *p = NULL;

    p = real_malloc(size);

    if (do_logging)
      {
         do_logging = 0;
         fprintf(stderr, "size=%lu, pointer=%p\n", size, p);
         printTime();
         do_logging = 1;
      }
    return p;
}

当然,如果您想让它在多线程程序中工作,就必须将do_logging放在线程本地存储中。在c11和更高版本中,您可以这样做:

代码语言:javascript
复制
#include <threads.h>
thread_local int do_logging = 1;

哦,你的init-function可能不是线程安全的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56176875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档