masm: исключение из выходного файла не используемых функций

Тема в разделе "WASM.ASSEMBLER", создана пользователем rain, 21 июл 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    возможно ли какими-то способами реализовать сабж?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    подробнее
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ну к примеру у меня есть много функций некоторые из которых не вызываются, можно ли как-то сделать что-бы эти функции не компилировались?
    или к примеру ситуцая есть хидер в котором сотня функций из которых реально может понадобиться лишь пару, и естественно не охота чтобы из-за пары функций включить бинарник всю сотню. а тупо каждый раз копипастить не по дзенски вовсе
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Этим занимается компоновщик, но ты должен ему помочь.

    Клади по функции на один модуль (.asm) и не включай их один в другой (только .inc). Для примера смотри m32lib в комплекте масма. Если используешь чью-то библиотеку, в которой всё свалено в один файл, то здесь ничем нельзя помочь - в общем случае весь код пойдёт в бинарь.
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    IceStudent спасибо
    м.. я так понял каждый asm прийдётся добавлять в командной строке к ml, это гимор имхо но раз ничё поделать, прийдётся копипастить
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    нет, посмотрите хотя бы тот bat файл которым компилируется masm32 lib,
    можно и другой написать
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    всё равно все имена написаны но в другом файле :)
    поподробней :)
    upd:
    возможно как-то прблему можно разрешить спомощью макросав, но опять же писать для каждой функци IFDEF funcname, потом в вызывающем файле каждый этот деф указывать облом
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ну написать например bat'ник типа
    for %%f in (*.asm) do c:\masm32\bin\ml /nologo /c /coff /Cp %%f
    батники рулят ;)
     
  9. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    вот это уже интересней :)
    Asterix
    /офтоп давно хотел найти разобраться в этом скриптовом языке да доку никак не находил, можте подскажете?
     
  10. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Конечно, Win + F1 _)
     
  11. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    стыдно мне стыдно, весь мсдн обискал %)
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    rain
    На RSDN.ru статья "Уроки BATаники" или как-то так. Да и help, команда /? - тоже хорошие источники информации.
     
  13. CnCVK

    CnCVK New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2006
    Сообщения:
    108
    а ведь LINK.EXE умеет убирать не нужные куски?
    Вроде "Global optimization" называется. Правда требует вроде специальных OBJ файлов.
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    CnCVK
    http://www.wasm.ru/forum/viewtopic.php?pid=191066#p191066
     
  15. BLiTZ

    BLiTZ Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    54
    rain, посмотри тут про скриптинг на bat файлах: http://www.robvanderwoude.com/
     
  16. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    rain
    По поводу темы - у компилятора C++ есть опция /Gy - function-level linking, она как раз разбивает файл на множество объектников, в каждом по функции. Плохо, что такой опции нет у masm'а :'(
     
  17. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    всем спасибо, для себя подойдёт и старая китайская методика копипаста, а если хочешь с кем-то поделиться и не краснеть потом за результат потрудись разбей по модулям
     
  18. tinok

    tinok New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2007
    Сообщения:
    26
    Можно, например и такие батики использовать:
    Для EXE'шников:
    Код (Text):
    1. @ECHO OFF
    2. ECHO.
    3. ECHO EXE compiler is runing...
    4. ECHO.
    5. ml /nologo /c /coff /ID:\MASM32\INCLUDE *.asm
    6. IF ERRORLEVEL 1 GOTO ASMError
    7.  
    8. IF NOT EXIST rs.res GOTO ASMToEXE_nores
    9. ECHO  Compile:    rs.res
    10. CVTRES /machine:ix86 rs.res > NUL
    11.  
    12. :ASMToEXE_nores
    13. ECHO  Create:     %~n0.exe
    14. link /nologo /out:%~n0.exe /SUBSYSTEM:WINDOWS /LIBPATH:D:\masm32\LIB *.obj
    15. IF ERRORLEVEL 1 GOTO LINKError
    16. DEL *.obj
    17. ECHO.
    18. ECHO EXE compile complited.
    19. ECHO.
    20. PAUSE > NUL
    21. GOTO TheEnd
    22.  
    23.  
    24.  
    25. :ASMError
    26. ECHO.
    27. ECHO.
    28. ECHO ERROR: Assembly error.
    29. ECHO.
    30. ECHO Press any key for exit.
    31. ECHO.
    32. PAUSE > NUL
    33. GOTO TheEnd
    34.  
    35.  
    36.  
    37. :LINKError
    38. ECHO.
    39. ECHO.
    40. ECHO ERROR: Link error.
    41. ECHO.
    42. ECHO Press any key for exit.
    43. ECHO.
    44. PAUSE > NUL
    45. GOTO TheEnd
    46.  
    47.  
    48.  
    49. :TheEnd
    И для DLL'шек - свой:
    Код (Text):
    1. @ECHO OFF
    2. ECHO.
    3. ECHO DLL compiler is runing...
    4. ECHO.
    5. ml /nologo /c /coff /ID:\MASM32\INCLUDE *.asm
    6. IF ERRORLEVEL 1 GOTO ASMError
    7.  
    8. ECHO.
    9.  
    10. IF NOT EXIST rs.res GOTO ASMToDLL_nores
    11. ECHO  Compile:    rs.res
    12. CVTRES /machine:ix86 rs.res > NUL
    13.  
    14. :ASMToDLL_nores
    15. ECHO  Create:     %~n0.dll
    16. ECHO.
    17. link /nologo /DLL /DEF:%~n0.def /out:%~n0.dll /SUBSYSTEM:WINDOWS /LIBPATH:D:\masm32\LIB *.obj
    18. IF ERRORLEVEL 1 GOTO LINKError
    19. IF EXIST %~n0.exp DEL %~n0.exp
    20. DEL *.obj
    21. DEL %~n0.lib
    22. ECHO.
    23. ECHO DLL compile complited.
    24. ECHO.
    25. PAUSE > NUL
    26. GOTO TheEnd
    27.  
    28.  
    29.  
    30. :ASMError
    31. ECHO.
    32. ECHO.
    33. ECHO ERROR: Assembly error.
    34. ECHO.
    35. ECHO Press any key for exit.
    36. ECHO.
    37. PAUSE > NUL
    38. GOTO TheEnd
    39.  
    40. :LINKError
    41. ECHO.
    42. ECHO.
    43. ECHO ERROR: Link error.
    44. ECHO.
    45. ECHO Press any key for exit.
    46. ECHO.
    47. PAUSE > NUL
    48. GOTO TheEnd
    49.  
    50. :TheEnd
    При этом проект должен быть не разбросан по папкам (все asm-файлы + файл ресурсов rs.res - в одной папке).
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Я для таких функций делаю макрообёртки, которые кроме вызова функции ставят флаг условной компиляции (например имя_функции_comp = True), а саму функцию соответственно заключаю в IFDEF имя_функции_comp и размещаю в конец файла (когда все макрообёртки гарантировано отработали).
    Конечно дело вкуса, но по мне вполне удобно. ;)