这以前在也16位的MSC++和32位MSVC++的时候名称约定也是分开的,就是因为分得太多实在麻烦,也给链接造成问题,到了64位MSVC++才合并了。
32位下的符号名称,__cdecl的是@YA,而__stdcall是@YG,main()函数是_main(64位下是main)。就是因为这样太麻烦,到64位才全部改回@YA了。
PUBLIC ?c_function@@YAHXZ ; c_function
PUBLIC ?stdcall_function@@YGHXZ ; stdcall_function
PUBLIC _main
//用32位命令行 CL.exe /Fa sym32.cpp 生成sym32.asm
int __cdecl c_function() {return 1;}
int __stdcall stdcall_function() {return 2;}
int main() { return c_function() + stdcall_function();}
/* sym32.asm
; Listing generated by Microsoft (R) Optimizing Compiler Version 19.37.32825.0
TITLE z:\t\sym32.obj
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
PUBLIC ?c_function@@YAHXZ ; c_function
PUBLIC ?stdcall_function@@YGHXZ ; stdcall_function
PUBLIC _main
; Function compile flags: /Odtp
_TEXT SEGMENT
_main PROC
; File z:\t\sym32.cpp
; Line 4
push ebp
mov ebp, esp
push esi
call ?c_function@@YAHXZ ; c_function
mov esi, eax
call ?stdcall_function@@YGHXZ ; stdcall_function
add eax, esi
pop esi
pop ebp
ret 0
_main ENDP
_TEXT ENDS
; Function compile flags: /Odtp
_TEXT SEGMENT
?stdcall_function@@YGHXZ PROC ; stdcall_function
; File z:\t\sym32.cpp
; Line 3
push ebp
mov ebp, esp
mov eax, 2
pop ebp
ret 0
?stdcall_function@@YGHXZ ENDP ; stdcall_function
_TEXT ENDS
; Function compile flags: /Odtp
_TEXT SEGMENT
?c_function@@YAHXZ PROC ; c_function
; File z:\t\sym32.cpp
; Line 2
push ebp
mov ebp, esp
mov eax, 1
pop ebp
ret 0
?c_function@@YAHXZ ENDP ; c_function
_TEXT ENDS
END
*/
【 在 z16166 的大作中提到: 】
: C和C++是肯定不一样的,C只是在函数名前面加个下划线,C++要做多一点mangling
: 我想说的是下面两个mangle之后的名字是一样的
: int __stdcall func() { return 2; }
: ...................
--
FROM 171.221.52.*