共享pic库中的全局变量在32位和64位二进制中有不同的访问方式,以及它的位置?

共享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编译函数添加

最近,我研究了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计数时:

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]