gpt4 book ai didi

c - 共享库函数未加载到同一内存位置

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:51 24 4
gpt4 key购买 nike

我已经使用 OPenSSL 共享库编写了一个程序并制作了另一个副本(Program2 是 program1 的副本)。只是为了检查共享库函数是否只加载了一次,我打印了 Program1 和 program2 的地址。令我惊讶的是,我有时会得到相同的地址,但有时会得到不同的地址。

根据我的理解,共享库函数加载到共享内存中并且只加载了一个副本。为什么我得到两个不同的地址,这表示共享函数被加载到两个不同的内存位置。

获取相同地址时使用以下代码

案例 1:程序 1:

#include <openssl/aes.h>

int main(int argc, char ** argv)
{
printf("Address of AES_cbc_encrypt =%p\n",&AES_cbc_encrypt);

while(1) {}

......

}

AES_cbc_encrypt地址=0x400600

程序 2:

   #include <openssl/aes.h>

int main(int argc, char ** argv)
{
printf("Address of AES_cbc_encrypt =%p\n",&AES_cbc_encrypt);

while(1) {}

......

}

AES_cbc_encrypt地址=0x400600

CASE2:当我得到两个不同的共享库函数地址时

程序 1:

 #include <openssl/aes.h>

int main(int argc, char ** argv)
{
printf("Address of AES_cbc_encrypt =%p\n",&AES_cbc_encrypt);

while(1) {}

......

}

AES_cbc_encrypt地址=0x400840

程序 2:

   #include <openssl/aes.h>

int main(int argc, char ** argv)
{
printf("Address of AES_cbc_encrypt =%p\n",&AES_cbc_encrypt);

// open function makes the difference
fd = open(argv[1], O_RDONLY);

if (fd <= 0)
{
strerror(errno);
exit(0);
}

while(1) {}

......

}

AES_cbc_encrypt地址=0x4007f0

在情况 2 中,我没有得到相同的共享库函数地址。是什么原因 ?我怎样才能确保两个共享库函数加载到相同的内存位置。

我在 Fedora 19 下使用 GCC。

编辑 1:

根据 Paul 和 John 的评论/回答,以上地址不是物理地址,而是虚拟地址。所以我尝试将虚拟地址转换为物理地址(我使用此工具的代码 Capturing Process Memory Usage Under Linux)来检查它们是否相同,但我得到了两个不同的物理地址。 我做错了什么吗?是否有其他方法可以强制将共享库加载到同一物理内存中。

提前致谢。

最佳答案

您的操作系统会为您处理这件事,您无需担心。但是,如果您仍然担心它,请查阅 top 中的“SHR”(共享)列以查看进程之间共享了多少内存。

还要考虑“虚拟内存”(进行网络搜索)意味着仅仅因为两个不同的进程使用两个不同值的指针来引用某物,并不意味着操作系统不能将它们映射到幕后相同的后备存储。事实上,通常会发生这种情况:操作系统将加载一次共享库,并将其映射到两个进程中的两个不同的基地址,并且对您来说没有功能差异,只要您实际上不关心这些虚拟地址值(你不应该这样做)。

关于c - 共享库函数未加载到同一内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21527249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com