的平普尔成语,以便允许改变动态链接库的代码而不破坏ABI兼容性和重新编译所有依赖于库中的代码通常使用的.
我看到的大多数解释都提到添加一个新的私有成员变量会改变类中公共成员和私有成员的偏移量.这对我来说很有意义.我不明白的是,实际上这实际上打破了依赖库.
我已经做了很多的阅读ELF文件,以及如何动态链接实际工作,但我仍然没有看到如何在共享库改变类规模将破事.
例如,这是我编写的测试应用程序(a.out),它使用Interface::some_method来自测试共享库(libInterface.so)的code():
aguthrie@ana:~/pimpl$ objdump -d -j .text a.out
08048874 <main>:
...
8048891: e8 b2 fe ff ff call 8048748 <_ZN9Interface11some_methodEv@plt>
Run Code Online (Sandbox Code Playgroud)
some_method使用程序链接表(PLT)的调用:
aguthrie@ana:~/pimpl$ objdump -d -j .plt a.out
08048748 <_ZN9Interface11some_methodEv@plt>:
8048748: ff 25 1c a0 04 08 jmp *0x804a01c
804874e: 68 38 00 00 00 push $0x38
8048753: e9 70 ff ff ff jmp 80486c8 <_init+0x30>
Run Code Online (Sandbox Code Playgroud)
随后进入全局偏移表(GOT),其中包含地址0x804a01c:
aguthrie@ana:~/pimpl$ readelf -x 24 a.out
Hex dump of section '.got.plt':
0x08049ff4 089f0408 00000000 00000000 de860408 …Run Code Online (Sandbox Code Playgroud)