首页 > 解决方案 > 如何在glibc源代码(malloc/morecore.c)中调用librt中的函数(shm_open)?

问题描述

我正在尝试修改__default_morecore. malloc/morecore.c原来__default_morecore是一个简单的包装器sbrk,但我想使用shm_open里面的函数__default_morecore来创建共享内存对象。这是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-shlibMakeruleslibc.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: undefined reference to `__libc_vfork@GLIBC_PRIVATE'
collect2: error: ld returned 1 exit status ../Rules:215: recipe for target '/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.soand ,但在终止后我libpthread.so找不到librt.so, librt.aandlibpthread.so在我的build文件夹中。make这是否意味着这些不是在我发生错误的阶段生成的?如果是,考虑到我在 glibc 中调用了 glibc 函数,这可能是一个依赖问题。如何解决这个问题?

如何调用shm_openmalloc/morecore.c链接该 librt 而不会出现任何错误?谢谢!

标签: clinuxgccshared-librariesglibc

解决方案


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

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

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


推荐阅读