gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:00:19 62 4
gpt4 key购买 nike

我正在尝试修改 __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: In function '__GI___default_morecore':
.../malloc/morecore.c:69: undefined reference to `shm_open'
collect2: error: ld returned 1 exit status
../Makerules:698: recipe for targe '.../build/libc.so' failed


我在网上搜索了这个错误,通常是因为没有链接到 -lrt .我尝试添加 -lrt../configure 期间的“LDFLAGS”和“LIBS”中,但不工作。然后我添加了 -lrtbuild-shlib 结尾的 Makerules (用于构建 libc.so ),错误更改为:

//lib/x86_64-linux-gnu/librt.so.1: undefined reference to `__clock_getcpuclockid@GLIBC_PRIVATE'

//lib/x86_64-linux-gnu/librt.so.1: undefined reference to `__clock_nanosleep@GLIBC_PRIVATE'

//lib/x86_64-linux-gnu/librt.so.1: undefined reference to `__clock_settime@GLIBC_PRIVATE'

//lib/x86_64-linux-gnu/librt.so.1: undefined reference to `__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' failed


新错误显示来自 librt.so 的多个符号和 libpthread.so是未定义的。我尝试添加 -lpthread -lrt到 glibc 的许多地方 Makefile/Makeconfig/Makerules ,但它不起作用。另外,从上述错误中,我发现链接库来自我的系统内置库,而不是我正在构建的当前修改的 glibc 的路径。这是预期的行为吗?我认为它应该使用 librt.solibpthread.so在我修改后的 glibc 中,我正在构建,但我找不到 librt.so , librt.alibpthread.so在我的 build make 之后的文件夹终止。这是否意味着这些不是在我发生错误的阶段生成的?如果是,考虑到我在 glibc 中调用了 glibc 函数,这可能是一个依赖问题。 如何解决这个问题?
如何调用shm_openmalloc/morecore.c并链接该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 ,否则链接 namespace 测试将在 make check 期间失败)。__morecore hook 不是一个完整的解决方案,因为它只涵盖了 glibc malloc 使用的主要分配领域的一部分。 .如果你想尝试 malloc ,从简单的树外 malloc 开始可能更容易实现和使用symbol interposition mechanism .但是您仍然需要注意在插入 malloc 时调用了哪些 glibc 函数。 .

关于c - 如何在glibc源代码(malloc/morecore.c)中调用librt中的函数(shm_open)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63857445/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com