首页 > 解决方案 > 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

所有这些过程都需要在运行时进行。

首先也是最简单的解决方案是找到一个可以破坏字符串的函数,但我找不到任何...

任何其他解决方案?

标签: c++visual-studioname-mangling

解决方案


Clang 编译器与 MSVC ABI 兼容,包括名称修饰。底层基础设施是 LLVM 项目的一部分,我发现llvm-undname可以对 MSVC 名称进行解码。也许您可以对其进行重新设计以将Wrapper::名称空间添加到符号并重新修改。

您可以在此测试代码中找到有关修改名称的灵感。


推荐阅读