如何在 glibc 源代码 (malloc/morecore.c) 中调用 librt 中的函数 (shm_open)?
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;
}
...
}
我很确定我的代码是正确的,因为我在一个小程序中测试了代码片段并且它有效。进行此更改后,在对 glibc 2.32 源使用 make
时将显示以下错误消息:
.../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
我在网上搜索了这个错误,这通常是因为 link 和 -lrt
没有。我尝试在 'LDFLAGS' 中添加 -lrt
并在 ../configure
中添加 'LIBS',但没有成功。然后我在Makerules
的build-shlib
末尾添加了-lrt
(用来构建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
的许多地方,但它不起作用。另外,从上面的错误中,我发现 linking 库来自我的系统内置库,而不是我正在构建的当前修改的 glibc 的路径。这是预期的行为吗?我认为它应该在我正在构建的修改后的 glibc 中使用 librt.so
和 libpthread.so
,但是我在 [=] 中找不到 librt.so
、librt.a
和 libpthread.so
37=] 文件夹在 make
终止后。这是否意味着这些不是在我发生错误的阶段生成的?如果是,考虑到我在 glibc 中调用了一个 glibc 函数,这可能是一个依赖性问题。 如何解决这个问题?
如何在 malloc/morecore.c
和 link 中调用 shm_open
而没有任何错误? 谢谢!
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
。
我建议 hard-wiring 共享内存段位置到 /dev/shm
中的文件,并直接调用 open
(或者更确切地说 __open64
,否则链接命名空间测试将失败make check
).
__morecore
挂钩不是一个完整的解决方案,因为它只涵盖了 glibc malloc
使用的主要分配区域的一部分。如果您想尝试使用 malloc
,从简单的 out-of-tree malloc
实现开始并使用 symbol interposition mechanism 可能更容易。但是您仍然需要注意在插入 malloc
.
中调用了哪些 glibc 函数
我正在尝试修改 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;
}
...
}
我很确定我的代码是正确的,因为我在一个小程序中测试了代码片段并且它有效。进行此更改后,在对 glibc 2.32 源使用 make
时将显示以下错误消息:
.../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
我在网上搜索了这个错误,这通常是因为 link 和 -lrt
没有。我尝试在 'LDFLAGS' 中添加 -lrt
并在 ../configure
中添加 'LIBS',但没有成功。然后我在Makerules
的build-shlib
末尾添加了-lrt
(用来构建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
的许多地方,但它不起作用。另外,从上面的错误中,我发现 linking 库来自我的系统内置库,而不是我正在构建的当前修改的 glibc 的路径。这是预期的行为吗?我认为它应该在我正在构建的修改后的 glibc 中使用 librt.so
和 libpthread.so
,但是我在 [=] 中找不到 librt.so
、librt.a
和 libpthread.so
37=] 文件夹在 make
终止后。这是否意味着这些不是在我发生错误的阶段生成的?如果是,考虑到我在 glibc 中调用了一个 glibc 函数,这可能是一个依赖性问题。 如何解决这个问题?
如何在 malloc/morecore.c
和 link 中调用 shm_open
而没有任何错误? 谢谢!
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
。
我建议 hard-wiring 共享内存段位置到 /dev/shm
中的文件,并直接调用 open
(或者更确切地说 __open64
,否则链接命名空间测试将失败make check
).
__morecore
挂钩不是一个完整的解决方案,因为它只涵盖了 glibc malloc
使用的主要分配区域的一部分。如果您想尝试使用 malloc
,从简单的 out-of-tree malloc
实现开始并使用 symbol interposition mechanism 可能更容易。但是您仍然需要注意在插入 malloc
.