假设我正在编写一个C++库,它必须导出一个变量,一个数据结构,例如,ExpData
.因此,链接到我的libray的程序可以访问此变量(有一个公共头定义它extern void *ExpData[]
).
但是,此数据结构在内部是C++类的vtable.例如,该类的名称InternalType
.因此,在查看生成的汇编代码后,我发现InternalType
vtable被导出为_ZTV12InternalType
.
然后,我需要一种方法来使我的库导出变量ExpData
用相同的地址解析_ZTV12InternalType
,这样,当外部程序读取我的库的ExpData
变量时,它实际上是读取InternalType
的vtable.
只是为了澄清,InternalType
vtable汇编代码是:
.type _ZTV12InternalType,@object # @_ZTV12InternalType .section .data.rel.ro._ZTV12InternalType,"aGw",@progbits,_ZTV12InternalType,comdat .weak _ZTV12InternalType .align 16 _ZTV12InternalType: .quad 0 .quad _ZTI12InternalType .quad _ZN12InternalType8vMethodXEi .size _ZTV12InternalType, 24
所以,我需要一种方法来实现这一点(或其他具有相同效果的东西):
.type ExpData,@object .globl ExpData .type _ZTV12InternalType,@object .section .data.rel.ro._ZTV12InternalType,"aGw",@progbits,_ZTV12InternalType,comdat .weak _ZTV12InternalType .align 16 _ZTV12InternalType: ExpData: .quad 0 .quad _ZTI12InternalType .quad _ZN12InternalType8vMethodXEi .size _ZTV12InternalType, 24
在C++方面有可能吗?
PS:我知道我不应该依赖于依赖于实现的细节,比如名称修改和C++类内部数据,但只考虑我的库将在非常特定的环境中运行.
编辑
我可以通过传递--defsym ExpData=_ZTV12InternalType
给链接器来解决我的问题.但是,我不想将实现细节附加到外部资源.假设我决定将类'vtable映射为一个名为的C结构InternalTypeVTable
.所以,我可以宣布ExpData
为InternalTypeVTable ExpData;
.如果我只需要更改源文件,而不是makefile和链接器脚本,那就太好了.