Linux下共享库加载地址

发布于 2024-10-20 02:38:46 字数 2945 浏览 6 评论 0原文

我对共享库有一个很大的疑问。我研究的是,由不同进程共享的库的虚拟地址对于所有这些进程都是相同的。但我尝试通过以下命令集使用 proc 文件系统来研究相同的内容:

$ cat /proc/*/maps | grep /lib/libc-2.12.1.so

输出是:

0025a000-003b1000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00485000-005dc000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
005dc000-005dd000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
005dd000-005df000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
005df000-005e0000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00181000-002d8000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
002d8000-002d9000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
002d9000-002db000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
002db000-002dc000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0013c000-00293000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00293000-00294000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00294000-00296000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00296000-00297000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00bf7000-00d4e000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00d4e000-00d4f000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00d4f000-00d51000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00d51000-00d52000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00227000-0037e000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
0037e000-0037f000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0037f000-00381000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so

对于不同进程的同一共享库,虚拟地址是不同的。

有人可以解释一下为什么会这样吗?

I have a major doubt regarding the shared library. What I studied is that the virtual address of a library that will be shared by different processes will be same for all these processes. But I tried to look into the same using the proc filesystem through the following set of command:

$ cat /proc/*/maps | grep /lib/libc-2.12.1.so

The output was:

0025a000-003b1000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00485000-005dc000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
005dc000-005dd000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
005dd000-005df000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
005df000-005e0000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00181000-002d8000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
002d8000-002d9000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
002d9000-002db000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
002db000-002dc000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
0013c000-00293000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00293000-00294000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00294000-00296000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00296000-00297000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00bf7000-00d4e000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
00d4e000-00d4f000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00d4f000-00d51000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so
00d51000-00d52000 rw-p 00159000 08:07 1046574    /lib/libc-2.12.1.so
00227000-0037e000 r-xp 00000000 08:07 1046574    /lib/libc-2.12.1.so
0037e000-0037f000 ---p 00157000 08:07 1046574    /lib/libc-2.12.1.so
0037f000-00381000 r--p 00157000 08:07 1046574    /lib/libc-2.12.1.so

The virtual addresses are different for the same shared library for different processes.

Can somebody please explain me why it is like this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情绪操控生活 2024-10-27 02:38:46

共享库加载器 ld.so 可能会根据二进制文件的需要更改加载共享库的虚拟地址,因为代码、数据和其他部分的大小可能因二进制文件而异。下一个。重新排列地址空间的过程称为重定位

重定位也是您必须使用 gcc -fPIC 将共享库编译为位置无关代码的原因。

The shared library loader ld.so may change the virtual addresses at which a shared library is loaded depending on the needs of a binary, since the size of code, data and other sections may vary from one binary to the next. The process of rearranging the address space is called relocation.

Relocation is also the reason why you have to compile shared libraries as position-independent code with gcc -fPIC.

榕城若虚 2024-10-27 02:38:46

共享库的相同虚拟地址来自 a.out 时代。 ELF没有这样的限制。

另外,内核随机化映射布局(参见 ASLR)。

Same virtual address for shared libraries is from a.out days. ELF doesn't have such limitation.

Additionally kernel randomizes mapping layout (see ASLR).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文