如何定义导出的符号的地址

比方说,我正在编写一个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映射为名为InternalTypeVTable的C结构。 所以,我可以将ExpData声明为InternalTypeVTable ExpData; 。 如果我只需要更改源文件而不是makefile和链接器脚本,那将会很棒。


GCC的__attribute__ ((alias()))正是我需要的。

如果我声明ExpData如:

void *ExpData[0] __attribute__ ((alias("_ZTV12InternalType")));

在我的库的源文件中,我得到下面的汇编代码:

    .globl  ExpData
ExpData = _ZTV12InternalType

因此,导出的符号ExpData引用比相同的内存地址_ZTV12InternalType

链接地址: http://www.djcxy.com/p/79681.html

上一篇: How to define an exported symbol's address

下一篇: concept of bare shared repository in git