首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在glibc源代码(malloc/morecre.c)中调用librt中的函数(shm_open)?

如何在glibc源代码(malloc/morecre.c)中调用librt中的函数(shm_open)?
EN

Stack Overflow用户
提问于 2020-09-12 06:17:08
回答 1查看 461关注 0票数 2

我试图在__default_morecore中修改malloc/morecore.c函数。原始的__default_morecoresbrk的简单包装器,但我希望在__default_morecore中使用shm_open函数来创建共享内存对象。下面是我修改的malloc/morecore.c代码:

代码语言:javascript
复制
...
/* 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.solibpthread.so的多个符号是未定义的。我尝试将-lpthread -lrt添加到glibc Makefile/Makeconfig/Makerules中的许多地方,但是它不起作用。此外,从上述错误中,我发现链接库来自我的系统内置库,而不是我正在构建的当前修改的glibc的路径。这是一种预期的行为吗?我认为它应该在我正在构建的修改的glibc中使用librt.solibpthread.so,但是在make终止后,我在build文件夹中找不到librt.solibrt.alibpthread.so。这是否意味着这些不是在我发生的错误发生的阶段产生的?如果是,考虑到我在glibc中调用了glibc函数,这可能是一个依赖问题。如何解决这个问题?

如何在shm_open malloc/morecore.c 中调用并链接该图书而没有任何错误?,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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函数。

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

https://stackoverflow.com/questions/63857445

复制
相关文章

相似问题

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