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

问题描述

我正在尝试修改__default_morecore中的malloc/morecore.c函数。原始的__default_morecoresbrk的简单包装,但是我想在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的{​​{1}}的末尾添加了build-shlib(用于构建Makerules),错误被更改为以下内容:

/// 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'的配方失败

新错误表明libc.solibrt.so中的多个符号未定义。我尝试将libpthread.so添加到glibc -lpthread -lrt中的许多位置,但是不起作用。另外,从上述错误中,我发现链接库来自系统内置库,而不是我正在构建的当前已修改glibc的路径。这是预期的行为吗?我认为它应该在我正在构建的经过修改的glibc中使用Makefile/Makeconfig/Makeruleslibrt.so,但是在我的{{中找不到libpthread.solibrt.solibrt.a libpthread.so终止后的1}}文件夹。这是否意味着这些不是在发生错误的阶段生成的?如果是的话,考虑到我在glibc中调用了glibc函数,则可能是一个依赖性问题。 如何解决该问题?

如何在build中调用make并正确链接该librt?谢谢!

解决方法

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,否则在{{1 }}。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...