[英]How to call function (shm_open) in librt inside the glibc source code (malloc/morecore.c)?
我正在尝试修改malloc/morecore.c
的__default_morecore
函数。 最初的__default_morecore
是sbrk
的简单包装器,但我想在__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-shlib
的Makerules
(其用于构建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.so
和libpthread.so
中的多个符号未定义。 我尝试将-lpthread -lrt
添加到 glibc Makefile/Makeconfig/Makerules
许多地方,但它不起作用。 此外,从上述错误中,我发现链接库来自我的系统内置库,而不是我正在构建的当前修改的 glibc 的路径。 这是预期的行为吗? 我认为它应该在我正在构建的修改后的 glibc 中使用librt.so
和libpthread.so
,但是在make
终止后我在build
文件夹中找不到librt.so
、 librt.a
和libpthread.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.