【发布时间】: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