Page 1 of 1

StdCall Decoration Remover

Posted: Mon Feb 26, 2018 7:04 pm
by 0CodErr
Так как решение проблемы с GCC и MSVC http://board.kolibrios.org/viewtopic.ph ... 920#p69920 я не нашёл,
то решил создать такую утилиту.

Утилита убирает в объектных 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
Ключ -L действует только на StdCall декорированные имена, другие имена остаются без изменений.
Ключ -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
После вызова утилиты KillAt -l -L test.obj
получим листинг преобразований

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
Некоторый код в этой программе был взят из программы CoffDump http://board.kolibrios.org/viewtopic.php?f=9&t=3577

Хочу обратить внимание, что эта утилита создавалась прежде всего из-за трудностей с Си.
В случае же проблем с С++ декорированием утилиту можно снабдить дополнительными опциями(если не ошибаюсь, имена декорированных функций начинаются с символа ?).
KillAt.7z (11.72 KiB)
Downloaded 549 times