繁体   English   中英

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

[英]How to call function (shm_open) in librt inside the glibc source code (malloc/morecore.c)?

我正在尝试修改malloc/morecore.c__default_morecore函数。 最初的__default_morecoresbrk的简单包装器,但我想在__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;
  }
...
}

我很确定我的代码是正确的,因为我在一个小程序中测试了代码片段并且它有效。 进行此更改后,将make用于 glibc 2.32 源时将显示以下错误消息:

.../build/libc_pic.os: 在函数 '__GI___default_morecore' 中:
.../malloc/morecore.c:69: 未定义对`shm_open'的引用
collect2: 错误: ld 返回 1 个退出状态
../Makerules:698: 目标'.../build/libc.so' 的配方失败

我在网上搜索了这个错误,通常是因为没有与-lrt链接。 我尝试在-lrt在 'LDFLAGS' 和 'LIBS' 中添加../configure ,但不起作用。 然后,我添加-lrt在的端build-shlibMakerules (其用于构建libc.so )中,并改变了误差为以下内容:

//lib/x86_64-linux-gnu/librt.so.1:对`__clock_getcpuclockid@GLIBC_PRIVATE'的未定义引用

//lib/x86_64-linux-gnu/librt.so.1:对`__clock_nanosleep@GLIBC_PRIVATE'的未定义引用

//lib/x86_64-linux-gnu/librt.so.1:对`__clock_settime@GLIBC_PRIVATE'的未定义引用

//lib/x86_64-linux-gnu/librt.so.1:对`__clock_getres@GLIBC_PRIVATE'的未定义引用

//lib/x86_64-linux-gnu/libpthread.so.0:对`__libc_vfork@GLIBC_PRIVATE'的未定义引用
collect2:错误:ld 返回 1 退出状态 ../Rules: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 函数,这可能是一个依赖性问题。 如何解决这个问题?

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

shm_open只是open函数的一个薄包装,请参阅sysdeps/posix/shm_open.c 有问题的是SHM_GET_NAME宏中文件名的SHM_GET_NAME (在sysdeps/posix/shm-directory.h )。 它调用__shm_directory (来自sysdeps/unix/sysv/linux/shm-directory.c ),当前的实现可能在__shm_directory调用malloc

我建议将共享内存段位置硬连接到/dev/shm的文件,并直接调用open (或者更确切地说__open64 ,否则链接__open64测试将在make check期间失败)。

__morecore钩子不是一个完整的解决方案,因为它只覆盖了 glibc malloc使用的主要分配领域的一部分。 如果您想尝试malloc ,从简单的树外malloc实现开始并使用符号插入机制可能更容易。 但是您仍然需要小心您在插入malloc调用了哪些 glibc 函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM