【问题标题】:Error when trying to link to a shared library I created using LD_PRELOAD尝试链接到我使用 LD_PRELOAD 创建的共享库时出错
【发布时间】:2021-04-17 05:45:19
【问题描述】:

我正在尝试通过链接 Linux 上的共享库来测试是否可以覆盖 glibc 的 malloc 接口。我还没有 malloc 函数的详细信息。

所以我创建了一个 nullmalloc.cpp,它具有 malloc 所需的替换,但所有都返回 null。代码如下所示:

# include <cstddef>

void* malloc(size_t size) { return 0; }
void* calloc(size_t n, size_t size) { return 0; }
void free(void* ptr) { return; }
void* realloc(void* ptr, size_t size) { return 0; }
void* valloc(size_t size) { return 0; }
void* memalign(size_t align, size_t s) { return 0; }
void cfree(void* ptr) { return; }
void* aligned_alloc(size_t align, size_t s) { return 0; }
void* pvalloc(size_t size) { return 0; }
struct mallinfo mallinfo(void);
int mallopt(int cmd, int value) { return 0; }

然后我尝试通过这些命令创建 cpp 文件的共享库:

gcc -Wall -fPIC -g -c nullmalloc.cpp // creates nullmalloc.o
gcc -shared -Wl,-soname,nullmalloc.so -o nullmalloc.so nullmalloc.o // creates nullmalloc.so

当我使用 LD_PRELOAD 将 nullmalloc.so 链接到我编写的名为 test.cpp 的测试代码时,我收到一条错误消息,提示找不到 .so 文件。

我使用 LD_PRELOAD 的命令是这样的:

g++ -g test.cpp -o test.o -std=c++11 LD_PRELOAD=/home/nullmalloc/nullmalloc.so

我得到的错误是这样的:

g++: error: LD_PRELOAD=/home/nullmalloc/nullmalloc.so: No such file or directory

我很困惑,因为当我使用ls 命令时,nullmalloc.so 文件存在。

[root@a nullmalloc]$ ls
nullmalloc.cpp  nullmalloc.o  nullmalloc.so  test.cpp

我才刚刚开始研究 malloc、linux 和共享库,所以我不确定我在哪里犯了错误。任何人都可以就从哪里开始修复提供建议吗?

谢谢。

【问题讨论】:

  • 在用于测试库的 ELF 可执行文件上使用 ldd(1)
  • 在运行库的进程上使用 ldd(1)pmap(1)。阅读 Drepper 的论文 How to write shared libraries。另请参阅ld.so(8)readelf(1)objdump(1)elf(5)
  • 您将 LD_PRELOAD=/home/... 作为命令行 arg 传递给 g++ - 这不起作用。你到底想达到什么目的?
  • 错字:你必须修复 "void cfree(void* ptr) { return 0; }" return nothing 或改变函数原型。
  • @PicaudVincent 已修复!感谢您指出这一点。

标签: c++ linux malloc shared-libraries


【解决方案1】:

我不知道如何添加编译器标志,但是您可以使其工作如下。

照常编译测试:

g++ -Wall -g test.cpp -o test -std=c++11 

像这样调用它:

LD_PRELOAD=/home/nullmalloc/nullmalloc.so ./test

【讨论】:

  • 是的@BasileStarynkevitch 必须始终使用 -Wall ... 正如 JP B. 所说,只有真正的偏执狂才能生存:)
  • 实际使用g++ -Wall -Wextra
  • @BasileStarynkevitch,因为我大部分时间也是这样做的......但是我必须承认我从未使用过-pedantic......这太多了:-)
  • 谢谢!现在 LD_PRELOAD 选项起作用了 :) 该库似乎没有链接……我猜这可能是我的 malloc 替代品的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
相关资源
最近更新 更多