有没有办法在MS C ++中手动修饰函数名?我猜猜任何解决方案都是微软特有的,而且我很酷。
或者,有没有办法声明函数“??_M@YGXPAXIHP6EX0@Z@Z
”,以便编译器可以理解它?仅供参考,undname
将其列为:
void _ _ stdcall `eh vector destructor iterator'(void * , unsigned int, int, void (_ _thiscall * )(void * ))
显然,编译器对我的标识符中的撇号不满意。
修改:
解决方案实际上非常简单。我完成了obj的操作,并在我的占位符名称上添加了所需的装饰名称,并用空值填充它们。链接器正好吃了它,没有问题。函数是存根,调用外部函数,所以每次做一些小改动时我都不必保持hexediting。
感谢大家的想法。
答案 0 :(得分:0)
`eh vector析构函数迭代器'
您确定撇号[原文如此]是标识符的一部分吗?您是否尝试使用没有它们的功能?看起来它们的存在是为了提高可读性。
或者,是否有办法声明函数“?? _ M @ YGXPAXIHP6EX0 @ Z @ Z”
如果我们通过声明表示同样的事情,我会严重怀疑你是否可以'声明'一个受损的名字。声明是预先称赞,重复发生的时间要晚得多。
?? _米@ YGXPAXIHP6EX0 @ Z @ Z
这是一个错误的名字。所有具有C ++链接的符号都会被破坏。这是签名,返回类型和调用约定信息的散列。详细了解MSDN。
答案 1 :(得分:0)
我假设您知道向量析构函数迭代器是什么,并且只想知道如何在代码中模仿它的名称。
一种方法可能是在汇编中编写代码,这可能(但是,可能不会)允许您使用几乎任何函数名称。
另一种方法可能是将您的代码放入DLL并使用可选的 entryname [= internalname ]语法覆盖DLL的* .def文件中的名称允许在* .def文件的EXPORTS部分中(允许您重命名要导出的内容)。
答案 2 :(得分:0)
如果将函数声明为 extern“C”并使用禁用下划线前缀的链接器选项,则代码中提供的名称是.obj文件中的名称。但这并不能解决您的所有问题,因为当您尝试声明名称中包含特殊字符的函数时,编译器会犹豫不决。
我想解决方案(这是IMO的很多工作)是在源代码中给出所需函数的唯一名称(如PLACEHOLDER_01),然后在.obj文件中替换它们。您需要以某种方式解析目标文件并更改符号名称。
另请注意,“eh vector析构函数迭代器”是一个受损的名称,真实(符号)名称中不应包含撇号或空格。转储.obj / .dll时,您必须禁用名称修改。
答案 3 :(得分:0)
您可以使用此签名使用MSVC ++生成该符号:
void __stdcall __ehvec_dtor(void * __arr,unsigned int __size,int _ n,void( _stdcall * __dtor)(void *))
显然__ehvec_dtor映射到异常处理向量析构函数的特殊错位符号。