c++ - MSVC C++ 名称在运行时从字符串重整
问题描述
首先,我将从我需要在运行时进行名称修改的原因开始。
我需要在 dll 和它的包装器之间建立一座桥梁
namespace Wrapper
{
class __declspec(dllexport) Token
{
public:
virtual void release() {}
};
}
class __declspec(dllexport) Token
{
public:
virtual void release(){}
};
这个想法是使用 dumpin 生成包含类令牌的 dll 的所有错位名称,然后对它们进行解构。
?release@Token@@UAEXXZ --> void Token::release(void)
之后我要转换的是匹配包装器所以我需要更改函数名称
void Token::release(void) --> void Wrapper::Token::release(void)
然后我需要再次修改它,这样我就可以创建一个将旧函数指向新函数的 def 文件。
?release@Token@@UAEXXZ = ?release@Token@Wrapper@@UAEXXZ
所有这些过程都需要在运行时进行。
首先也是最简单的解决方案是找到一个可以破坏字符串的函数,但我找不到任何...
任何其他解决方案?
解决方案
Clang 编译器与 MSVC ABI 兼容,包括名称修饰。底层基础设施是 LLVM 项目的一部分,我发现llvm-undname可以对 MSVC 名称进行解码。也许您可以对其进行重新设计以将Wrapper::
名称空间添加到符号并重新修改。
您可以在此测试代码中找到有关修改名称的灵感。
推荐阅读
- ios - swift ui 无法保持正常大小写,强制转换为大写
- android - Android导航组件中的重复FragmentContainerView
- pandas - 除了某些行之外,熊猫数据框的差异?
- python - 为熊猫数据框记录断言附加参数
- jquery - Webpack x Symfony 5 - 未定义 JQuery
- python - 跨多个模型的 SQLAlchemy 模型约束
- html - Angular 10,Modal 在单击第二个对象之前不显示适当的数据
- python - ipysheet.sheet 转换为 DataFrame 并保存已完成的手动更改
- windows - Windows Perl - Win32::Systray 和 IO::Socket::Multicast - 如何让它们一起工作?
- ios - CKBrowseSwitcherViewController 覆盖 -traitcollection getter?