• 胖胖胖
    2019-05-17
    所以说plt 里面实际上是存放了 GOT[ i ] 的地址 , 而 GOT[ i ] 中存放了 要调用函数在虚拟内存中的地址,而该地址实际上是共享函数代码段的真实物理地址的一个映射。但有一些疑问,PLT 的 机制是什么,感觉没太介绍PLT ,不知道他怎么来的。对PLT 很模糊,他如何利用了相对地址的方法。希望老师能解答一下
     2
     18
  • Calix
    2019-05-24
    1. GOT 保存在共享库自己的数据段里
    2. 每个程序维护自己的GOT

    所以,GOT 到底保存在哪里??共享库里面还是各个程序里?
     2
     8
  • cbing
    2019-05-19
    在动态链接对应的共享库,我们在共享库的 data section 里面,保存了一张全局偏移表(GOT,Global Offset Table)。虽然共享库的代码部分的物理内存是共享的,但是数据部分是各个动态链接它的应用程序里面各加载一份的。所有需要引用当前共享库外部的地址的指令,都会查询 GOT,来找到当前运行程序的虚拟内存里的对应位置。而 GOT 表里的数据,则是在我们加载一个个共享库的时候写进去的。
    -------------------
    老师可不可以重新解释下这一段啊,特别是“所有需要引用当前共享库外部的地址的指令,都会查询 GOT,来找到当前运行程序的虚拟内存里的对应位置”这一句,好懵
    
     6
  • cbing
    2019-05-19
    在动态链接对应的共享库,我们在共享库的 data section 里面,保存了一张全局偏移表(GOT,Global Offset Table)。虽然共享库的代码部分的物理内存是共享的,但是数据部分是各个动态链接它的应用程序里面各加载一份的。所有需要引用当前共享库外部的地址的指令,都会查询 GOT,来找到当前运行程序的虚拟内存里的对应位置。而 GOT 表里的数据,则是在我们加载一个个共享库的时候写进去的。
    --------------
    这段完全看不懂QAQ
    
     6
  • 齐
    2019-05-17
    Java语言多态的实现

    作者回复: 👍不错的例子

     1
     6
  • 半斤八两
    2019-05-23
    所以老师请问下GOT是每个程序都维护一张所以有多张还是每个程序共同维护一张GOT

    作者回复: 每个程序自己维护一张

    
     4
  • 许山山
    2019-05-17
    真的写的好棒啊,和操作系统配合食用简直不要太爽

    作者回复: 谢谢支持

    
     4
  • fatme
    2019-09-20
    老师,为什么要采用 PLT 和 GOT 两级跳转,直接用 GOT 有问题吗?

    作者回复: PLT是为了做延迟绑定,如果函数没有实际被调用到,就不需要更新GOT里面的数值。因为很多动态装载的函数库都是不会被实际调用到的。

    这个如果要深入细节可以看一下《程序员的自我修养》的7.4小结。

    
     3
  • 阿锋
    2019-05-23
    有一个点不明白,虚拟内存中的内容究竟放在哪里,它的内容也应该是放在物理内存里的或者是硬盘里的?是这样吗?

    作者回复: 是的,虚拟内存既然叫做“虚拟”它就是一个抽象概念。要么是已经实际加载到物理内存里了,要么还没有加载或者交换出去在硬盘上。

    
     3
  • 栋能
    2019-05-22
    看了GOT表之后的那个图(动态链接过程图)我有个疑问,我们的程序在虚拟内存中还是像静态链接那样,把需要的库都加载(拼接)进来的,故调用的共享库在程序的虚拟内存空间中其实还是多份的?还有就是如果GOT在共享库的data section,那不同程序调用的时候,如何区分当前GOT属于那个程序呢?
     1
     3
  • 焰火
    2019-05-21
    浩哥您好,有个问题想请教一下您。
    共享库在内存中也是采用分页机制么? 如果是的话,那么怎么解决多进程同时调用共享库的问题呢?
    如果不是的话,那么这共享库在内存里就是全加载?

    作者回复: 焰火同学你好

    这是个好问题,共享库在内存中也是采用分页机制的。
    同时调用共享库只要对应的指令代码是PIC的也就是地址无关的,并不会有什么问题。但是两个进程的数据段是不共享的而已。

     1
     3
  • 活的潇洒
    2019-05-17
    这一周紧赶慢赶,总算是赶上了更新的进度。day10天学习笔记
    https://www.cnblogs.com/luoahong/p/10880416.html

    作者回复: 👍坚持到底就是胜利

    
     3
  • 冯华琴也可叫做冯琴华
    2019-05-17
    动态代理?上层应用只和代理类交互,具体实现是透明的。

    作者回复: 👍动态代理是个不错的例子

    
     2
  • gogo
    2020-01-03
    在mac上面好像看不出来 PLT 和 GOT 的存在

    objdump -source show_me_poor

    show_me_poor: file format Mach-O 64-bit x86-64

    Disassembly of section __TEXT,__text:
    __text:
    100000f70: 55 pushq %rbp
    100000f71: 48 89 e5 movq %rsp, %rbp
    100000f74: 48 83 ec 10 subq $16, %rsp
    100000f78: c7 45 fc 05 00 00 00 movl $5, -4(%rbp)
    100000f7f: 8b 7d fc movl -4(%rbp), %edi
    100000f82: e8 09 00 00 00 callq 9 <dyld_stub_binder+0x100000f90>
    100000f87: 31 c0 xorl %eax, %eax
    100000f89: 48 83 c4 10 addq $16, %rsp
    100000f8d: 5d popq %rbp
    100000f8e: c3 retq

    _main:
    100000f70: 55 pushq %rbp
    100000f71: 48 89 e5 movq %rsp, %rbp
    100000f74: 48 83 ec 10 subq $16, %rsp
    100000f78: c7 45 fc 05 00 00 00 movl $5, -4(%rbp)
    100000f7f: 8b 7d fc movl -4(%rbp), %edi
    100000f82: e8 09 00 00 00 callq 9 <dyld_stub_binder+0x100000f90>
    100000f87: 31 c0 xorl %eax, %eax
    100000f89: 48 83 c4 10 addq $16, %rsp
    100000f8d: 5d popq %rbp
    100000f8e: c3 retq
    Disassembly of section __TEXT,__stubs:
    __stubs:
    100000f90: ff 25 7a 00 00 00 jmpq *122(%rip)
    Disassembly of section __TEXT,__stub_helper:
    __stub_helper:
    100000f98: 4c 8d 1d 69 00 00 00 leaq 105(%rip), %r11
    100000f9f: 41 53 pushq %r11
    100000fa1: ff 25 59 00 00 00 jmpq *89(%rip)
    100000fa7: 90 nop
    100000fa8: 68 00 00 00 00 pushq $0
    100000fad: e9 e6 ff ff ff jmp -26 <__stub_helper>


    mac 下好像是 100000f82: e8 09 00 00 00 callq 9 <dyld_stub_binder+0x100000f90>
    dyld_stub_binder

    不过,算是知道或者说了解了共享库是通过动态链接 动态生成共享代码的地址,而这个地址一方面是在运行的时候生成,另一方面取决于当前指令的相对地址。这里面有两个重要的表叫PLT(程序链接表)和 GOT(全局位移表)。

    额,忽然想起来了一个词语,叫动态绑定,就是运行时才知道是哪个实现。
    而静态绑定,就是在编译的时候就已经确定了是哪个实现。

    要更好的理解这一讲,需要结合老师推荐的书和linux 环境。
    展开

    作者回复: gogo同学,

    你好,是的,动态绑定其实和动态链接本质上就是同一个思路。

    要看对应的汇编代码,可以找一台云主机装一下Linux,Mac下连readelf这样可以读取elf格式的命令也没有。

    
     1
  • 一步
    2019-05-19
    每个应用程序都会生成自己的GOT表吗?

    作者回复: 不使用动态链接的话就不需要啊

    
     1
  • Geek_648105
    2019-05-18
    多个应用程序同时调用同一个库,不是有重入的问题吗?库应该是用可重入的方式写吗?我反复看了几遍,对于库是不太理解。
    
     1
  • Allen
    2019-05-18
    老师可以加一节课,讲解一下如何利用栈信息,来解栈调用关系吗?

    比如:C程序发生段错误,利用黑匣子日志,如何分析 段错误时,函数的堆栈信息吗?

    作者回复: Allen同学你好,

    这个需要的前置知识有点多,而且不太方便用文章的形式体现。先要教会大家用gbd,然后一步一步调试,也不太适合录音。

    我想想是否有可能在专栏结束之后用加餐的形式提供一些对应的内容。

    
     1
  • Ezra_Xu
    2019-05-17
    mac机器上objdump命令-M选项有问题,请老师确认下该如何处理,谢谢。

    作者回复: 抱歉手头没有mac,我看看稍后抽空研究一下,不过不使用-M一样可以看到对应的指令信息,只是可能格式稍有不同,应该不影响理解指令含义。

    
     1
  • Milittle
    2019-05-17
    plt应该是在链接动态库时候生成的。
    不知道理解是否正确
    
     1
  • 青莲
    2019-05-17
    多态算吗

    作者回复: 如果算的话,你认为是为什么呢?

    
     1
我们在线,来聊聊吧