- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在两个程序中得到libc.so中函数“printf”的物理地址,两个物理地址不同。而且我读了两个不同的物理地址,内容都差不多。这意味着函数“printf”在内存中有两个副本?
详细信息:
我的操作系统是 32 位 linux。
物理地址是通过读取“/proc/self/pagemap”来计算的。
物理地址读取是用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 @0xf7e5add0
在 libc.so.6
中,that 是 printf
的代码实际上是。 那个 页面应该由使用libc.so.6
的所有进程共享。
附言要获取 libc.so.6
中 printf
的实际 地址,可以改用此程序:
#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/
设备地址、物理地址和虚拟地址有什么区别? 实际上我正在尝试在驱动程序中使用 mmap,我坚持这个概念。 最佳答案 documentation说: The kernel normally uses vi
简而言之,根据我对内存管理的理解,处理器会产生虚拟地址。这些地址由 MMU 使用每个进程的地址表转换为相应的物理地址(在需要时,中间有 TLB 和页面错误)。 我的问题是处理器是否总是产生虚拟地址?在
如何存储一个人的邮寄地址?假设两个不同的用户输入的信息不同,那么如果一个用户说 123 Main Street, City, State-ABV,而另一个用户刚输入 City, State ABV。
我知道的唯一方法是在 nic 的注册表中添加“NetworkAddress”键/值对。通过这种方法对我来说太难实现了。还有其他方法吗? 我使用 Windows 窗体构建了一个示例应用程序,但 setM
我想将物理内存写入文件。内存本身不会再被触及,因此我想使用 O_DIRECT 来获得最佳的写入性能。 我的第一个想法是打开 /dev/mem 并映射内存并将所有内容写入一个文件,该文件使用 O_DIR
我是一名优秀的程序员,十分优秀!