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

 zhanglj-qiucm 发布于 2023-01-10 13:06

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

但是,此数据结构在内部是C++类的vtable.例如,该类的名称InternalType.因此,在查看生成的汇编代码后,我发现InternalTypevtable被导出为_ZTV12InternalType.

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

只是为了澄清,InternalTypevtable汇编代码是:

    .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.所以,我可以宣布ExpDataInternalTypeVTable ExpData;.如果我只需要更改源文件,而不是makefile和链接器脚本,那就太好了.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有