Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб окт 20, 2018 7:41 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: StdCall Decoration Remover
СообщениеДобавлено: Пн фев 26, 2018 7:04 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1471
Так как решение проблемы с GCC и MSVC viewtopic.php?f=33&t=3669&p=69920#p69920 я не нашёл,
то решил создать такую утилиту.

Утилита убирает в объектных COFF файлах суффикс "@size" из имён StdCall функций.
Также есть опция, убирающая символ подчёркивания в начале имени.
Код:
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 именами в таблице символов
Спойлер: Показать
Код:
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
получим листинг преобразований
Код:
_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       
в таблице символов будут уже изменённые имена
Спойлер: Показать
Код:

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 viewtopic.php?f=9&t=3577

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB