- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试修改 __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: 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”中,但不工作。然后我添加了
-lrt
在
build-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.so
和
libpthread.so
在我修改后的 glibc 中,我正在构建,但我找不到
librt.so
,
librt.a
和
libpthread.so
在我的
build
make
之后的文件夹终止。这是否意味着这些不是在我发生错误的阶段生成的?如果是,考虑到我在 glibc 中调用了 glibc 函数,这可能是一个依赖问题。
如何解决这个问题?
shm_open
在 malloc/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/
这个问题在这里已经有了答案: Multiple glibc libraries on a single host (11 个回答) 5年前关闭。 有没有办法在本地文件夹中安装新版本的 GLIBC?我将
这个问题在这里已经有了答案: Deploying Yesod to Heroku, can't build statically (4 个回答) 1年前关闭。 我有两台机器 RHEL 4机 RHEL
我在 C 启动时读取 article ,它指的是函数 __libc_csu_init 。谁能告诉我CSU代表什么? 最佳答案 我在 libc p 中找到了对“ C s tart u p”的引用。 这远
我正在使用 AlpineLinux(安装在我的计算机上,而不是安装在 docker 中)并且我正在尝试使用依赖于 glibc 的共享库。 由于 Glibc 没有集成到这个发行版中,我看到开发了一个替代
所以我正在玩 Alpine Linux,它使用 musl 与 glibc。 我发现由于这个选择,我无法运行 Oracle Java 或在 glibc 下构建的静态二进制文件。 musl 是否应该与更广
在构建 glibc 时,出现此错误。 *glibc/build/elf/dl-allobjs.os: file not recognized: File format not recognized c
我一直在寻找没有好的结果。 我想知道在文本中解释为 Malloc Maleficarum 或 Malloc Des-Malleficarum 的技术在 glibc 2.12.1 版本中是否有效。 在提
我在 CentOS 上安装 gcc 时遇到问题。 我的命令的输出sudo yum install gcc: Loaded plugins: fastestmirror Loading mirror s
我想下载gzip类型的mariadb,但是我发现它有很多文件可以下载,例如mariadb-10.2.6-linux-x86_64.tar.gz,mariadb-10.2.6-linux-glibc_2
我想尝试使用不同的 glibc 的 sin 函数。他们是否可以在不编译整个 glibc 的情况下使用不同 glibc 版本的 sin 函数? 我已经在我的虚拟 ubuntu 机器上下载了不同版本的 g
我要在超算中心的目录下安装一个软件,但是sudo,root,连apt-get,yum都不能用...这个软件需要glibc2.7,所以我得手动安装gcc和glibc(因为我无法更改内置 gcc 的路径来
我正在研究需要在多个不同的嵌入式平台上运行的 C 和 C++ 程序,为此我有交叉编译器,因此我可以在我的 x86 桌面上进行构建。 我在某些功能上遇到了一个可怕的问题,例如“strtod()”。这是我
我遇到了一个非常烦人的问题:我有一个程序,它在开始时创建一个线程,该线程将在执行期间启动其他内容(fork() 紧随其后的是 execve())。 这是我的程序达到(我认为)死锁时两个线程的 bt:
我刚刚发现,glibc 2.23 有一个关于 stdio 函数 fmemopen() 的错误,参见例如Using rewind() on a FILE* opened with fmemopen .
[root@localhost Keystone2]# sudo rpm -ivh glibc-2.3.4-2.9.audit.x86_64.rpm --nodeps --force warning:
从该系列中很容易找到如何使用 dlsym()和其他函数,但是在内部如何工作呢?是否可以编写自己的,容易实现的dlsym()? 我想知道是否有可能实现类似的行为,但在不将与-ldl链接的情况下实现(可以
嗨,我目前使用的是 ubuntu 9.10 和 glibc 版本 2.11.1-0,好吧,我正在做一个项目,我想用 glibc 的另一个版本(2.5-58)进行测试,我想知道以下与此相关的事情: 如何
我已经下载了glibc,这样我就可以修改它的代码然后使用它。所以只是为了玩玩它,我更改了 glibc 的 stdio-common 目录中的 printf 函数,以便它打印“你可以看到我吗?”。 in
我正在集群上的 conda 环境中部署 R 脚本。该脚本加载了一些需要 glibc 版本 >= 2.14 的包。虽然我的系统的 glibc 版本为 2.14,但集群的 glibc 版本为 2.12,我
所以。我有一个问题,我在一台机器上有两个版本的 GCC。 3.4.6 和 4.1 这是由于新软件的一些依赖性问题。 (需要 glibc 4.1) 当我将这个新软件与 4.1 库链接时,它链接得很好。但
我是一名优秀的程序员,十分优秀!