问题描述
我正在尝试修改__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
的{{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.so
和librt.so
中的多个符号未定义。我尝试将libpthread.so
添加到glibc -lpthread -lrt
中的许多位置,但是不起作用。另外,从上述错误中,我发现链接库来自系统内置库,而不是我正在构建的当前已修改glibc的路径。这是预期的行为吗?我认为它应该在我正在构建的经过修改的glibc中使用Makefile/Makeconfig/Makerules
和librt.so
,但是在我的{{中找不到libpthread.so
,librt.so
和librt.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函数。