gpt4 book ai didi

c - 共享库函数针对不同进程加载在不同物理地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:37 25 4
gpt4 key购买 nike

我在两个程序中得到libc.so中函数“printf”的物理地址,两个物理地址不同。而且我读了两个不同的物理地址,内容都差不多。这意味着函数“printf”在内存中有两个副本?

详细信息:

  1. 我的操作系统是 32 位 linux。

  2. 物理地址是通过读取“/proc/self/pagemap”来计算的。

  3. 物理地址读取是用fmem模块实现的,源码在git@github.com:NateBrune/fmem.git

最佳答案

I get physical addresses of function "printf" in libc.so in two programs, and two physical addresses are different.

您可能做错了(但很难猜测:您没有提供任何详细信息)。

特别注意以下程序:

#include <stdio.h>

int main()
{
printf("&printf: %p\n", &printf);
return 0;
}

libc.so.6 中打印 printf 的实际地址,这可以通过 GDB 观察到:

(gdb) start
Temporary breakpoint 1 at 0x8048426: file pagemap.c, line 5.
Starting program: /tmp/pagemap

Temporary breakpoint 1, main () at pagemap.c:5
5 printf("&printf: %p\n", &printf);
(gdb) n
&printf: 0x80482f0
6 return 0;

(gdb) info symbol 0x80482f0
printf@plt in section .plt of /tmp/pagemap

(gdb) p &printf
$1 = (<text variable, no debug info> *) 0xf7e5add0 <printf>

(gdb) info sym 0xf7e5add0
printf in section .text of /lib32/libc.so.6

请注意 printf @0x80482f0 在主可执行文件中, 应该共享(除了在同一时间运行的同一可执行文件的多个实例之间) ,并且不是 printf 的代码实际所在的位置。

printf @0xf7e5add0libc.so.6 中,thatprintf 的代码实际上是。 那个 页面应该由使用libc.so.6 的所有进程共享。

附言要获取 libc.so.6printf实际 地址,可以改用此程序:

#include <stdio.h>
#include <dlfcn.h>

int main()
{
printf("&printf: %p\n", &printf);
printf("&printf: %p\n", dlsym(RTLD_NEXT, "printf"));
return 0;
}

gcc -g pagemap.c -o pagemap -m32 -ldl -D_GNU_SOURCE

(gdb) run
Starting program: /tmp/pagemap
&printf: 0x80483c0
&printf: 0xf7e55dd0

(gdb) info sym 0xf7e55dd0
printf in section .text of /lib32/libc.so.6

关于c - 共享库函数针对不同进程加载在不同物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39943019/

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