【问题标题】:Malloc with LD_PRELOAD带 LD_PRELOAD 的 Malloc
【发布时间】:2018-02-01 18:59:28
【问题描述】:

我尝试编写一个函数 malloc()。我的档案:

void *malloc(size_t size)
{
   printf("test");
}

我在共享库.so 上编译这个文件。 现在,我想使用 LD_PRELOAD 来使用我的 malloc 函数:

export LD_PRELOAD=MY_LIB

我用这个库编译我的 main.c:

int main()
{
  malloc(5);
  return (0);
}

但是当我运行可执行文件时,我遇到了分段错误 ..(如果我执行 ls、cat 或其他命令也一样

有什么问题? 谢谢你!

【问题讨论】:

  • 我的猜测是printf 在内部调用malloc
  • 您的函数的返回类型是void *,但您似乎没有返回任何内容。
  • 你试过在调试器中运行它吗?

标签: c ld-preload


【解决方案1】:

第一次使用stdout 会导致其缓冲区被分配(以便在某个地方放置输出,直到准备好发送)。这需要使用mallc()。 (标准不保证这一点;标准库流可以使用单独的内存分配库。但它们不用于我熟悉的任何实现。)

所以 malloc 调用 printf 调用 malloc 调用 printf 调用 malloc (因为尚未分配缓冲区)调用 printf 等等等等。直到你用完调用堆栈。

您可以将 malloc 替换为 LD_PRELOAD hack。但请确保您的实现中没有任何内容会产生对 malloc 的递归调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多