如何定义导出符号的地址
How to define an exported symbol's address
假设我正在编写一个c++库,它必须导出一个变量,一个数据结构,例如,称为ExpData
。因此,链接到我的库的程序可以访问这个变量(有一个公共头文件将其定义为extern void *ExpData[]
)。
然而,这个数据结构在内部是c++类的虚变量表。例如:InternalType
。因此,在查看生成的汇编代码之后,我发现InternalType
的虚表被导出为_ZTV12InternalType
。
然后,我需要一种方法使我的库导出变量ExpData
被解析为与_ZTV12InternalType
相同的地址,这样,当外部程序读取我的库的ExpData
变量时,它实际上正在读取InternalType
的vtable。
为了澄清,InternalType
的虚函数表汇编代码是:
.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++端是可能的吗?
注::我知道我不应该依赖于实现相关的细节,比如名称混淆和c++类的内部数据,但只要考虑到我的库将运行在非常特定的环境中。
编辑
我可以通过传递--defsym ExpData=_ZTV12InternalType
到链接器来解决我的问题。但是,我不想将实现细节附加到外部资源。假设我决定将类的虚函数表映射为一个名为InternalTypeVTable
的C结构。因此,我可以将ExpData
声明为InternalTypeVTable ExpData;
。如果我只需要修改源文件,而不需要修改makefiles和链接器脚本,那就太好了。
GCC的__attribute__ ((alias()))
正是我需要的。
如果我这样声明ExpData
:
void *ExpData[0] __attribute__ ((alias("_ZTV12InternalType")));
在库的源文件中,我得到以下汇编代码:
.globl ExpData
ExpData = _ZTV12InternalType
因此,导出的符号ExpData
引用的内存地址与_ZTV12InternalType
相同。
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 获取未定义的符号:尝试使用Clang地址清理器时__asan_memset
- 无符号的 int 到 IP 地址字符串,不带 itoa/to_string/boost
- iOS崩溃报告象征无DSYM-二进制中看到的地址之外的符号地址
- 将无符号int地址视为指针,并将其解引用为字节数组
- 使用inet_pton()获取IPv4地址的无符号int表示形式
- 在内存地址中计算 2 补码中的符号位
- C ++如何将我的命令行参数(MAC地址)转换为无符号字符
- 引用数据类型的 & 符号是否返回引用本身的地址或它所引用的值
- 将缓冲区的地址存储为无符号整数;
- 链接器用内存地址替换符号引用
- 我可以将向量的第一个元素的地址直接传递给一个函数吗?该函数需要一个无符号字符作为其输入
- 如何工作与内存地址在C?它们是十六进数还是无符号整型
- 如何定义导出符号的地址
- 在C/ c++或任何其他类似语言中,对变量或数据类型应用&符号时返回的地址类型
- 如何通过符号在内存中的地址获取有关符号的更多信息
- C++ 不接受对象字符串中的@符号吗?似乎是地址问题?
- GCC链接器描述文件强制符号位于特定地址