共享pic库中的全局变量在32位和64位二进制中有不同的访问方式,以及它的位置?
最近,我研究了plt是如何实现的,并编写了一段用于跟踪的示例代码,如下所示。我看到的东西让我很困惑 得到了 问题1: 为什么libextern.com中count的全局变量地址是0x601048 问题2: 对于外部符号,使用.plt和.get.plt进行延迟绑定,但对于全局变量(如count),为什么32位使用get\u pc\u thunk作为参考.get,而64位仅使用0xXXX(%rip)作为寻址.get?或者32位可以使用这种rip+偏移量的方式进行寻址 提前谢谢 当-m32编译函数添加\ u计数时:共享pic库中的全局变量在32位和64位二进制中有不同的访问方式,以及它的位置?,c,dynamic-linking,C,Dynamic Linking,最近,我研究了plt是如何实现的,并编写了一段用于跟踪的示例代码,如下所示。我看到的东西让我很困惑 得到了 问题1: 为什么libextern.com中count的全局变量地址是0x601048 问题2: 对于外部符号,使用.plt和.get.plt进行延迟绑定,但对于全局变量(如count),为什么32位使用get\u pc\u thunk作为参考.get,而64位仅使用0xXXX(%rip)作为寻址.get?或者32位可以使用这种rip+偏移量的方式进行寻址 提前谢谢 当-m32编译函数添加
550 5bf: 83 ec 14 sub $0x14,%esp
551 5c2: e8 c9 fe ff ff call 490 <__x86.get_pc_thunk.bx>
552 5c7: 81 c3 39 1a 00 00 add $0x1a39,%ebx
553 5cd: e8 ae fe ff ff call 480 <__errno_location@plt>
554 5d2: c7 00 ad de 00 00 movl $0xdead,(%eax)
555 5d8: e8 a3 fe ff ff call 480 <__errno_location@plt>
556 5dd: 8b 10 mov (%eax),%edx
557 5df: 8b 83 e4 ff ff ff mov -0x1c(%ebx),%eax
558 5e5: 8b 00 mov (%eax),%eax
559 5e7: 01 c2 add %eax,%edx
这在切换架构时是正常的。。。只需查看链接脚本,看看内存映射是如何不同的。最后,我找到了这两个问题的答案,并将其放在这里,以供可能需要的人使用。 1.对于fPIC构建库,每个全局变量将被视为已定义的外部变量,并且在主可执行文件.bss部分中有该变量的一个副本。
2.似乎,在IA 32位汇编中,我们无法将%eip寄存器作为基本寄存器。谢谢,这意味着我可以在32位二进制上使用链接脚本的64位二进制方式,对吗?可能不会。。。这就像在说:那么我可以在IPv4平台中使用IPv6地址的整个空间。只是它们不合适。64允许64位内存(crunchillon字节比32位允许的多)认为虚拟地址的空间是64位可寻址的,而旧的只有32位。对于32位中的每个地址,现在您有了整个32位地址范围来扩展一个进程的虚拟内存
#include <errno.h>
#include <stdio.h>
int count = 0x1;
void
add_count(void)
{
errno = 0xdead;
count += errno;
fprintf(stdout, "%p\n", &count);
fprintf(stdout, "%p\n", &count);
fprintf(stdout, "%p\n", &count);
}
gcc -shared -fpic extern.c -o extern.so
sudo cp extern.so /lib/libextern.so
gcc -g got.c -o got.bin -lextern
550 5bf: 83 ec 14 sub $0x14,%esp
551 5c2: e8 c9 fe ff ff call 490 <__x86.get_pc_thunk.bx>
552 5c7: 81 c3 39 1a 00 00 add $0x1a39,%ebx
553 5cd: e8 ae fe ff ff call 480 <__errno_location@plt>
554 5d2: c7 00 ad de 00 00 movl $0xdead,(%eax)
555 5d8: e8 a3 fe ff ff call 480 <__errno_location@plt>
556 5dd: 8b 10 mov (%eax),%edx
557 5df: 8b 83 e4 ff ff ff mov -0x1c(%ebx),%eax
558 5e5: 8b 00 mov (%eax),%eax
559 5e7: 01 c2 add %eax,%edx
567 789: e8 d2 fe ff ff callq 660 <__errno_location@plt>
568 78e: c7 00 ad de 00 00 movl $0xdead,(%rax)
569 794: e8 c7 fe ff ff callq 660 <__errno_location@plt>
570 799: 8b 10 mov (%rax),%edx
571 79b: 48 8b 05 26 08 20 00 mov 0x200826(%rip),%rax # 200fc8 <_DYNAMIC+0x1c0>
572 7a2: 8b 00 mov (%rax),%eax
573 7a4: 01 c2 add %eax,%edx
00400000-00401000 r-xp 00000000 08:01 1975032 /home/pli/validation/got.bin
00600000-00601000 r--p 00000000 08:01 1975032 /home/pli/validation/got.bin
00601000-00602000 rw-p 00001000 08:01 1975032 /home/pli/validation/got.bin
7ffff7813000-7ffff79ce000 r-xp 00000000 08:01 5771356 /lib/x86_64-linux-gnu/libc-2.19.so
7ffff79ce000-7ffff7bcd000 ---p 001bb000 08:01 5771356 /lib/x86_64-linux-gnu/libc-2.19.so
7ffff7bcd000-7ffff7bd1000 r--p 001ba000 08:01 5771356 /lib/x86_64-linux-gnu/libc-2.19.so
7ffff7bd1000-7ffff7bd3000 rw-p 001be000 08:01 5771356 /lib/x86_64-linux-gnu/libc-2.19.so
7ffff7bd3000-7ffff7bd8000 rw-p 00000000 00:00 0
7ffff7bd8000-7ffff7bd9000 r-xp 00000000 08:01 5767525 /lib/libextern.so
7ffff7bd9000-7ffff7dd8000 ---p 00001000 08:01 5767525 /lib/libextern.so
7ffff7dd8000-7ffff7dd9000 r--p 00000000 08:01 5767525 /lib/libextern.so
7ffff7dd9000-7ffff7dda000 rw-p 00001000 08:01 5767525 /lib/libextern.so
7ffff7dda000-7ffff7dfd000 r-xp 00000000 08:01 5771353 /lib/x86_64-linux-gnu/ld-2.19.so
7ffff7fed000-7ffff7ff0000 rw-p 00000000 00:00 0
7ffff7ff8000-7ffff7ffa000 rw-p 00000000 00:00 0
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0 [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00022000 08:01 5771353 /lib/x86_64-linux-gnu/ld-2.19.so
7ffff7ffd000-7ffff7ffe000 rw-p 00023000 08:01 5771353 /lib/x86_64-linux-gnu/ld-2.19.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]