Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Jul 16, 2019 6:04 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 1 post ] 
Author Message
PostPosted: Mon Feb 26, 2018 7:04 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Так как решение проблемы с GCC и MSVC viewtopic.php?f=33&t=3669&p=69920#p69920 я не нашёл,
то решил создать такую утилиту.

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

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 1 post ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited