难度级别4.5星

flybusflybus 2004-11-01 09:50:31
微软查看dll的depends.exe工具最新版有一个功能就是根据经过c++名字处理后的名字转换成代码中定义形式的功能(也就是相当于solaris 的workshop里提供的c++filt的功能)

有谁知道vc编译的这种动态库的namemangling转换规则吗?
(平常定位一些疑难问题时有一点用)
...全文
256 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
名牌大灰狼 2004-11-16
  • 打赏
  • 举报
回复
Mark
forswear 2004-11-16
  • 打赏
  • 举报
回复
学习 mark
linxy2002 2004-11-16
  • 打赏
  • 举报
回复
学习
flybusflybus 2004-11-16
  • 打赏
  • 举报
回复
出发点是定位问题,所以并没有对所有关键字进行仔细分析,能达到符号信息映射源码的目的就够了

另外name mangling主要目的是为了区分不同的变量和函数,所以对于const等这样的关键字都有特定的转换关系,但变量和函数的作用范围(public/protected/private)
这些关键字并没有在符号信息中体现出来,这些c++关键字都是编译器在编译期需要用到的东西,没有必要记录(也可以理解为:对于一个类中的函数,不可能存在2个完
全相同的函数原型,即时他们作用范围不同)

原型: int TEAsyncIOMgrImpl_::RegisterHandle( ACE_HANDLE fd, EProtocolType type, EProtocolMgrType prtmgrtype )
文件中的符号信息 ?RegisterHandle@TEAsyncIOMgrImpl_@@UAEHPAXW4EProtocolType@@W4EProtocolMgrType@@@Z
?RegisterHandle 函数名称
@TEAsyncIOMgrImpl_@@UAE 类名
H 返回值类型为int
PA X void类型的指针
W4 EProtocolType @@ 枚举类型 EProtocolType
W4 EProtocolMgrType @@ 枚举类型 EProtocolMgrType
@Z 后缀
-------------------------------------------------------

class iMapTargetMgr * iMapTargetMgr::m_pInstance
?m_pInstance@iMapTargetMgr@@0PAV1@A
?m_pInstance 变量名
@iMapTargetMgr 类名
@@0 没有返回值
PA V1 V1可能标识的是类本身
@A 后缀
-------------------------------------------------------

int TEMessageAdapter::RegisterPrivateMessage(class TEMessage *,class TEMessageAdapter *,void *,int)
?RegisterPrivateMessage@TEMessageAdapter@@UAEHPAVTEMessage@@PAV1@PAXH@Z
?RegisterPrivateMessage@ 函数名称
TEMessageAdapter@@UAE 类名
H 返回值类型为int
PA VTEMessage@@ V是类前缀
PA V1@ V1可能标识的是类本身
PA X void指针
H int
@Z 后缀
-------------------------------------------------------

enum EProtocolMgrType iMapProtocolMgr::GetProtocolMgrType(void)
?GetProtocolMgrType@iMapProtocolMgr@@QBE?AW4EProtocolMgrType@@XZ
?GetProtocolMgrType@ 函数名称
iMapProtocolMgr@@QB 类名
E?AW4 EProtocolMgrType 返回值 枚举类型 EProtocolMgrType
@@XZ 后缀
-------------------------------------------------------

ACE_Guard<ACE_Thread_Mutex> guard( m_MutexPara );
??0?$ACE_Guard@VACE_Thread_Mutex@@@@QAE@AAVACE_Thread_Mutex@@@Z
??0 构造函数
?$ 模板类
ACE_Guard 类名
@V ACE_Thread_Mutex @@@@QAE@AAV ACE_Thread_Mutex@@ 模板参数,类型是ACE_Thread_Mute
@Z 后缀

TEMessageInfo::TEMessageInfo
??0TEMessageInfo@@QAE@XZ
??0 构造函数
TEMessageInfo@@QAE@XZ 类名

std::allocator<TEMessageUnit>::allocator<TEMessageUnit>
??0?$allocator@UTEMessageUnit@@@std@@QAE@XZ
??0 构造函数
$ 模板类
allocator 类名
@U TEMessageUnit @@@ std@ @QAE@ 模板参数,命名空间,类型是TEMessageUnit
@XZ 后缀


再加上afc给的网页里的东西就差不多了
std::list<TEMessageUnit,std::allocator<TEMessageUnit> >::list<TEMessageUnit,std::allocator<TEMessageUnit> >
??0?$list@UTEMessageUnit@@V?$allocator@UTEMessageUnit@@@std@@@std@@QAE@ABV?$allocator@UTEMessageUnit@@@1@@Z
??0 构造函数
?$ 模板类
list 类名
@U TEMessageUnit 模板参数,类型是EMessageUnit
@@V ?$allocator@UTEMessageUnit @@@std@@@std@@QAE@ABV? $allocator@UTEMessageUnit@@@1@
第二个模板参数,本身又是一个模板类型的,其参数为TEMessageUnit
@Z 后缀

下面是全球唯一一份资料相关资料(google里唯一找到的一个,百度里没有,呵呵)
stdcall:
?funcName @@YG retType params-list Z

cdecl:
?funcName @@YA retType params-list Z

thiscall:
?methodName @ className @@AAE retType param-list Z


static method call:
?methodName @ className @@CA retType param-list Z

If there are parameters, param-list is a list of them, followed by a @
Otherwise, param-list is X (void), with no @ aftwards
Basic types:
D is char int8
E is unsigned char uint8
F is short int16
G is unsigned short uint16
H is int int32
I is unsigned int uint32
J is long int32
K is unsigned long uint32
M is float float32
N is double float64
X is void
_J is int 64 int64
_K is unsigned int 64 uint64
_N is bool

Pointers:
PA prefixes a type to indicate a pointer
PB prefixes a type to indicate a const pointer

flybusflybus 2004-11-04
  • 打赏
  • 举报
回复
afc(afc) 给的连接里有了很大一部分有用信息,但还不全面,最近太忙了,到时候如果没有人再给有用信息,我有空的时候自己再取总结剩余部分了
kstone2004 2004-11-03
  • 打赏
  • 举报
回复
看过,顶过,不太熟悉,学习。。。。。。
cadinfo 2004-11-03
  • 打赏
  • 举报
回复
不好意思,呵呵
--我把你的文章当作原来那篇从dll提取函数原型了
所以回答的就让你感觉莫名其妙了.
SammyLan 2004-11-02
  • 打赏
  • 举报
回复
路过
jiang8360 2004-11-02
  • 打赏
  • 举报
回复
学习。路过
liuxianzhi 2004-11-02
  • 打赏
  • 举报
回复
方案:
1.做一种处理,安装序号来调用接口,不是调用它的接口名称;(我没有用过,听朋友这么说)
2.如果你有原有接口的说明资料(*.h文件),可以自己在原来的接口上再封装一次,封装的时候使用STDCALL的方式定义新的接口。
danyueer 2004-11-02
  • 打赏
  • 举报
回复
extern "C"的转换过程,好像在VCHelp看到过规则说明,好像跟@什么的有关~
flybusflybus 2004-11-02
  • 打赏
  • 举报
回复
afc(afc) THANK YOU VERY MUCH, A SIGNIFICANT STUFF,我简单看了一下,这个规则十分符合vc6编译器的名字处理 这100分给你了 ^_^
谁还有更好的资料吗? 我可以另开一帖给分

cadinfo(无语清风)
不知道你在说什么-_-;
afc 2004-11-02
  • 打赏
  • 举报
回复
http://www.bottledlight.com/docs/mangle.html
flybusflybus 2004-11-02
  • 打赏
  • 举报
回复
c++对象模型里只是说了为什么要name mangling,不过我需要的是一套vc编译器的具体转换规则,就像新的depends.exe新加的“翻译”功能肯定也是基于这种规则的,c++filt也然,不过用的是和depends.exe不同的另一套规则

哪位老兄能提供这样的文档
不过也不知道ms有没有提供这样的文档或者有人总结过


下面这个可以翻译成:
?format_output@IpxSockAddress@@MBEXXZ
??0Counter64@@QAE@KK@Z
?snmp_parse_var_op@@YAPAEPAEPAKPAH02PAPAE2@Z
??0UTarget@@QAE@ABVAddress@@PBDH@Z
?EmfGetSnmpRecvBytes@@YAKXZ
??4Oid@@UAEAAVSnmpSyntax@@ABV1@@Z
?asn_build_objid@@YAPAEPAEPAHEPAKH@Z
?set_address@UTarget@@UAEHABVAddress@@@Z
??YPdu@@QAEAAV0@ABVVb@@@Z
?unlock@SnmpSynchronized@@QAEXXZ
?get_filter@CNotifyEvent@@QAEXAAV?$SnmpCollection@VOid@@@@AAV?$SnmpCollection@VSnmpTarget@@@@AAV?$SnmpCollection@VGenAddress@@@@@Z
?AddEntry@CSNMPMessageQueue@@QAEPAVCSNMPMessage@@KPAVSnmp@@HABVSnmpTarget@@AAVPdu@@PAEIABVAddress@@P6AXH02AAV4@PAX@Z6@Z
?get_printable@Oid@@UBEPBDXZ
??1Auth@@UAE@XZ
??1CUTEvent@@QAE@XZ
??1PrivDES@@UAE@XZ
?GetTimeout@CUTEvent@@QAEXAAVmsec@@@Z
?get_asn1_length@SnmpInt32@@UBEHXZ
??0EventListHolder@@QAE@PAVSnmp@@@Z
??0warmStartOid@@QAE@XZ
?set_error_index@@YAXPAVPdu@@H@Z
?load@SnmpMessage@@AAEHABVPdu@@ABVOctetStr@@W4snmp_version@@PBV3@3H@Z
??0CSNMPMessageQueue@@QAE@PAVEventListHolder@@PAVSnmp@@@Z

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void IpxSockAddress::format_output(void)
Counter64::Counter64(unsigned long,unsigned long)
unsigned char * snmp_parse_var_op(unsigned char *,unsigned long *,int *,unsigned char *,int *,unsigned char * *,int *)
UTarget::UTarget(class Address const &,char const *,int)
unsigned long EmfGetSnmpRecvBytes(void)
class SnmpSyntax & Oid::operator=(class SnmpSyntax const &)
unsigned char * asn_build_objid(unsigned char *,int *,unsigned char,unsigned long *,int)
int UTarget::set_address(class Address const &)
class Pdu & Pdu::operator+=(class Vb const &)
void SnmpSynchronized::unlock(void)
void CNotifyEvent::get_filter(class SnmpCollection<class Oid> &,class SnmpCollection<class SnmpTarget> &,class SnmpCollection<class GenAddress> &)
class CSNMPMessage * CSNMPMessageQueue::AddEntry(unsigned long,class Snmp *,int,class SnmpTarget const &,class Pdu &,unsigned char *,unsigned int,class Address const &,void (*)(int,class Snmp *,class Pdu &,class SnmpTarget &,void *),void *)
char const * Oid::get_printable(void)
Auth::~Auth(void)
CUTEvent::~CUTEvent(void)
PrivDES::~PrivDES(void)
void CUTEvent::GetTimeout(class msec &)
int SnmpInt32::get_asn1_length(void)
EventListHolder::EventListHolder(class Snmp *)
warmStartOid::warmStartOid(void)
void set_error_index(class Pdu *,int)
int SnmpMessage::load(class Pdu const &,class OctetStr const &,enum snmp_version,class OctetStr const *,class OctetStr const *,int)
CSNMPMessageQueue::CSNMPMessageQueue(class EventListHolder *,class Snmp *)

oyljerry 2004-11-02
  • 打赏
  • 举报
回复
对于C编译,__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_functionname@number。__cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_functionname。__fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@functionname@number。它们均不改变输出函数名中的自符大小写,这和PASCAL调用约定不同,PASCAL约定输出的函数名无任何修饰且全部大写
DentistryDoctor 2004-11-02
  • 打赏
  • 举报
回复
好像Inside the C++ Object Model中有相关内容。
Zhymax 2004-11-02
  • 打赏
  • 举报
回复
有这个功能那不发财了:)
flybusflybus 2004-11-02
  • 打赏
  • 举报
回复
大家理解错了
我的意思是谁知道vc的name mangling规则,比如通过
?GetRemoteEnvStrings@@YAHKPAD@Z,怎么知道函数原型?转换规则是什么

比如B@和A@字串可能分别表示函数是否定义为常量类型

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧