我试图在__default_morecore中修改malloc/morecore.c函数。原始的__default_morecore是sbrk的简单包装器,但我希望在__default_morecore中使用shm_open函数来创建共享内存对象。下面是我修改的malloc/morecore.c代码:
...
/* Include header files for shm_open */
void *
__default_morecore (ptrdiff_t increment)
{
int shm_fd;
/* Create the shared memory object */
shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0644);
if (shm_fd < 0){
return NULL;
}
...
}我很确定我的代码是正确的,因为我在一个小程序中测试了代码片段,并且它可以工作。在进行此更改后,当对glibc 2.32源使用make时,它将显示以下错误消息:
./build/libc_pic.os:在函数‘__GI_default_morecore’中: ./malloc/morecre.c:69:未定义的对`shm_open的引用‘ collect2:错误: ld返回1退出状态 ./Makerules:698: targe的配方‘./build/libc.so’失败
我在网上搜索了这个错误,这通常是因为它不与-lrt链接。我在../configure期间尝试在'LDFLAGS‘和'LIBS’中添加../configure,但没有起作用。然后,我在-lrt的末尾添加了build-shlib of Makerules (用于构建libc.so),并将错误更改为:
//lib/x86_64-linux-gnu/labt.so.1:对
\_\_clock\_getcpuclockid@GLIBC\_PRIVATE' //lib/x86\_64-linux-gnu/librt.so.1: undefined reference to__clock_nanosleep@GLIBC_PRIVATE‘的未定义引用 //lib/x86_64-linux-gnu/labt.so.1:对\_\_clock\_settime@GLIBC\_PRIVATE' //lib/x86\_64-linux-gnu/librt.so.1: undefined reference to__clock_getres@GLIBC_PRIVATE的未定义引用 //lib/x86_64-linux-gnu/libp线程.so.0:对`__libc_vfork@GLIBC_PRIVATE的未定义引用 错误: ld返回了一个退出状态./规则:215:目标'/home/yifei/FSL_Repos/test_shm_mmap_malloc/glibc-malloc-modified/build/iconv/iconvconfig‘的配方失败
新的错误显示来自librt.so和libpthread.so的多个符号是未定义的。我尝试将-lpthread -lrt添加到glibc Makefile/Makeconfig/Makerules中的许多地方,但是它不起作用。此外,从上述错误中,我发现链接库来自我的系统内置库,而不是我正在构建的当前修改的glibc的路径。这是一种预期的行为吗?我认为它应该在我正在构建的修改的glibc中使用librt.so和libpthread.so,但是在make终止后,我在build文件夹中找不到librt.so、librt.a和libpthread.so。这是否意味着这些不是在我发生的错误发生的阶段产生的?如果是,考虑到我在glibc中调用了glibc函数,这可能是一个依赖问题。如何解决这个问题?
如何在shm_open malloc/morecore.c 中调用并链接该图书而没有任何错误?,谢谢!
发布于 2020-09-13 18:33:16
shm_open只是open函数的一个薄包装器,参见sysdeps/posix/shm_open.c。有问题的是SHM_GET_NAME宏中文件名的构造(在sysdeps/posix/shm-directory.h中)。它调用__shm_directory (从sysdeps/unix/sysv/linux/shm-directory.c),并且当前的实现可能会在幕后调用malloc。
我建议硬连接共享内存段位置到/dev/shm中的文件,并直接调用open (或者更确切地说是__open64,否则链接命名空间测试将在make check期间失败)。
__morecore钩子不是一个完整的解决方案,因为它只涵盖了glibc malloc使用的主要分配领域的一部分。如果您想尝试使用malloc,那么从简单的树外malloc实现开始并使用符号插入机制可能会更容易。但是,您仍然需要小心在插入的malloc中调用哪些glibc函数。
https://stackoverflow.com/questions/63857445
复制相似问题