c - 如何在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-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: 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.so
and ,但在终止后我libpthread.so
找不到librt.so
, librt.a
andlibpthread.so
在我的build
文件夹中。make
这是否意味着这些不是在我发生错误的阶段生成的?如果是,考虑到我在 glibc 中调用了 glibc 函数,这可能是一个依赖问题。如何解决这个问题?
如何调用shm_open
并malloc/morecore.c
链接该 librt 而不会出现任何错误?谢谢!
解决方案
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 函数。malloc
malloc
推荐阅读
- java - 从本地存储库获取最新版本的 jar
- amazon-web-services - AWS CloudWatch Events 在 STS 角色上触发 SNS 为跨账户代入
- python - 将此 curl 命令转换为 python 请求库
- c# - 用c#从串口读取多个数据值
- vue.js - 在点击指令上切换类?
- android - Qt-Creator 无法编译 - 没有这样的文件或目录“c++config.h”
- css - 使用 ruby 将 sass 编译为 css
- angular - 订阅后如何订购数据
- ios - 在for循环中划分时出现Swift 3错误
- python-3.x - 如何为以下链接抓取所有产品的简短描述?