如何在MSVC 2005中手动修饰链接器名称?

时间:2009-02-18 19:29:11

标签: c++ linker

有没有办法在MS C ++中手动修饰函数名?我猜猜任何解决方案都是微软特有的,而且我很酷。

或者,有没有办法声明函数“??_M@YGXPAXIHP6EX0@Z@Z”,以便编译器可以理解它?仅供参考,undname将其列为:

void _ _ stdcall `eh vector destructor iterator'(void * , unsigned int, int, void (_ _thiscall * )(void * ))

显然,编译器对我的标识符中的撇号不满意。

修改:
解决方案实际上非常简单。我完成了obj的操作,并在我的占位符名称上添加了所需的装饰名称,并用空值填充它们。链接器正好吃了它,没有问题。函数是存根,调用外部函数,所以每次做一些小改动时我都不必保持hexediting。

感谢大家的想法。

4 个答案:

答案 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映射到异常处理向量析构函数的特殊错位符号。