首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定义导出符号的地址

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

Stack Overflow用户
提问于 2014-06-09 02:50:13
回答 1查看 559关注 0票数 7

假设我正在编写一个C++库,它必须导出一个变量,一个名为ExpData的数据结构。因此,链接到我的libray的程序可以访问这个变量(有一个公共头将它定义为extern void *ExpData[])。

但是,这种数据结构在内部是C++类的vtable。类名是,例如,InternalType。因此,在查看生成的程序集代码之后,我发现InternalType的vtable被导出为_ZTV12InternalType

然后,我需要一种方法,使导出的库变量ExpData能够使用与_ZTV12InternalType相同的地址进行解析,这样当外部程序读取库的ExpData变量时,它实际上就是读取InternalType的vtable。

澄清一下,InternalType的vtable程序集代码是:

代码语言:javascript
复制
    .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

因此,我需要一种方法来实现这个目标(或者其他具有相同效果的东西):

代码语言:javascript
复制
    .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++方面有可能吗?

P.S.:我知道我不应该依赖于实现相关的细节,比如名称损坏和C++类内部数据,但是只要考虑到我的库将在非常特定的环境上运行。

编辑

我可以通过将--defsym ExpData=_ZTV12InternalType传递给链接器来解决我的问题。但是,我不想将实现细节附加到外部资源。假设我决定将类的vtable映射为一个名为InternalTypeVTable的C结构。因此,我可以声明ExpDataInternalTypeVTable ExpData;。如果我只能更改源文件,而不是makefile和linker脚本,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-09 16:42:00

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

如果我声明ExpData如下:

代码语言:javascript
复制
void *ExpData[0] __attribute__ ((alias("_ZTV12InternalType")));

在我库的源文件中,我获得了以下程序集代码:

代码语言:javascript
复制
    .globl  ExpData
ExpData = _ZTV12InternalType

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24113044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档