то решил создать такую утилиту.
Утилита убирает в объектных COFF файлах суффикс "@size" из имён StdCall функций.
Также есть опция, убирающая символ подчёркивания в начале имени.
Code: Select all
StdCall Decoration Remover Version 0.1; 2018.
Usage: KillAt [<options>] [<file>]
-L Remove leading underscores in StdCall decorated names
-U Remove decoration only if symbol not in this object file
-l Output a listing of symbol conversions
Ключ -U подразумевает, что обычно это объявлено как extern, например extern void __stdcall MyFunction(void).
Например, после использования GCC -c %NAME%.c -o %NAME%.obj
мы получим объектный файл с декорированными StdCall именами в таблице символов
Spoiler:
Code: Select all
Symbol table
------------
# Section Type Class Aux Value Name
--------------------------------------------------------------------------------
0 FFFE 0 67 1 00000000 .file
<AUX>
2 1 20 2 1 00000000 _Main
<AUX>
4 1 0 3 1 00000000 .text
<AUX>
6 2 0 3 1 00000000 .data
<AUX>
8 3 0 3 1 00000000 .bss
<AUX>
A 4 0 3 1 00000000 .rdata
<AUX>
C 5 0 3 1 00000000 .rdata$zzz
<AUX>
E 6 0 3 1 00000000 .eh_frame
<AUX>
10 0 0 2 0 00000004 _Screen
11 0 0 2 0 00000010 _Window
12 0 20 2 0 00000000 _GetScreenSize@0
13 0 20 2 0 00000000 _WaitEvent@0
14 0 20 2 0 00000000 _GetButton@0
15 0 20 2 0 00000000 _ThreadTerminate@0
16 0 20 2 0 00000000 _GetKey@0
17 0 20 2 0 00000000 _BeginDraw@0
18 0 20 2 0 00000000 _DrawWindow@32
19 0 20 2 0 00000000 _DrawText@28
1A 0 20 2 0 00000000 _EndDraw@0
получим листинг преобразований
Code: Select all
_GetScreenSize@0 --> GetScreenSize
_WaitEvent@0 --> WaitEvent
_GetButton@0 --> GetButton
_ThreadTerminate@0 --> ThreadTerminate
_GetKey@0 --> GetKey
_BeginDraw@0 --> BeginDraw
_DrawWindow@32 --> DrawWindow
_DrawText@28 --> DrawText
_EndDraw@0 --> EndDraw
Spoiler:
Code: Select all
Symbol table
------------
# Section Type Class Aux Value Name
--------------------------------------------------------------------------------
0 FFFE 0 67 1 00000000 .file
<AUX>
2 1 20 2 1 00000000 _Main
<AUX>
4 1 0 3 1 00000000 .text
<AUX>
6 2 0 3 1 00000000 .data
<AUX>
8 3 0 3 1 00000000 .bss
<AUX>
A 4 0 3 1 00000000 .rdata
<AUX>
C 5 0 3 1 00000000 .rdata$zzz
<AUX>
E 6 0 3 1 00000000 .eh_frame
<AUX>
10 0 0 2 0 00000004 _Screen
11 0 0 2 0 00000010 _Window
12 0 20 2 0 00000000 GetScreenSize
13 0 20 2 0 00000000 WaitEvent
14 0 20 2 0 00000000 GetButton
15 0 20 2 0 00000000 ThreadTerminate
16 0 20 2 0 00000000 GetKey
17 0 20 2 0 00000000 BeginDraw
18 0 20 2 0 00000000 DrawWindow
19 0 20 2 0 00000000 DrawText
1A 0 20 2 0 00000000 EndDraw
Хочу обратить внимание, что эта утилита создавалась прежде всего из-за трудностей с Си.
В случае же проблем с С++ декорированием утилиту можно снабдить дополнительными опциями(если не ошибаюсь, имена декорированных функций начинаются с символа ?).