小编adg*_*adg的帖子

如何添加私有成员变量来破坏C++ ABI兼容性?

平普尔成语,以便允许改变动态链接库的代码而不破坏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)

c++ linker shared-libraries elf abi

13
推荐指数
1
解决办法
1425
查看次数

标签 统计

abi ×1

c++ ×1

elf ×1

linker ×1

shared-libraries ×1