Совместное использование obj из tasm'a и masm'a

Тема в разделе "WASM.ASSEMBLER", создана пользователем BAY, 6 июл 2006.

  1. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    Есть прога на masm'e. Я в нее хочу добавить очень редкую функцию. Перерыл весь интернет, нашол её реализацию, но она доступна только в виде obj файла, сделанного tasm'ом. При попытке слинковать этот файл с основной прогой (сделанной в masm'e) майкросовтским линкером он выдает 19 ошибок типа:
    unresolved external symbol VirtualProtect
    unresolved external symbol VirtualLock

    Как правильно прилинковать tasm'овский obj к masm'овскому?
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    BAY
    OBJ имеет формат, какой у тебя?
     
  3. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    tasm'овский - OMF
    masm'овсий - COFF
     
  4. Asterix

    Asterix New Member

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

    или ищи omf2coff
    но я таких не встречал =)
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Сделай в масме ещё один OBJ (или добавь в уже имеющийся), в котором будет экспортироваться функция VirtualLock, вызывающая __imp__VirtualLock@8, и так для каждой из 19 ошибок.
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    БОевое тебе и партийное задание, изучить ОБЖ форматы и забодяжить Omf2Coff :)))
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum предложил оригинальное и изящное решение, остается его проверить
    и сообщить результат в топике
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. Asterix
    Нет, что будет если челу что нить другое понадобиться, а omf2coff
    нету!! как тогда?
     
  9. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    ок... спасибо.. попробую, отпишусь
     
  10. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    2Quantum: можно пример кода хотябы для одной функции а то доков в интернете мало по этой теме
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    может так(скопировать код в fakeobj.bat и запустить)
    Код (Text):
    1. ;@echo off
    2. ;goto make
    3.  
    4. format MS COFF
    5.  
    6. extrn __imp__VirtualLock@8:dword
    7. extrn __imp__VirtualProtect@16:dword
    8.  
    9. section '.text' code readable executable
    10.  
    11. public VirtualLock
    12. VirtualLock:
    13. jmp [__imp__VirtualLock@8]
    14.  
    15. public VirtualProtect
    16. VirtualProtect:
    17. jmp [__imp__VirtualProtect@16]
    18.  
    19. ;:make
    20. ;SET PROJECTNAME=fakeobj
    21. ;if exist %PROJECTNAME%.obj del %PROJECTNAME%.obj
    22. ;C:\Fasm\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.obj
    23. ;echo.
    24. ;pause
    25. ;cls
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    может по этой причине у Борланда импорт через переходники идет,
    в частности у Дельфи? ;)
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Говорят, импорт через переходники экономит размер кода :)
     
  14. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    Asterix: так-с... tasm с masm уже есть... пускай еще и фасм будет)
     
  15. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    И сокращает время загрузки. Размер кода экономится только если одна и та же АПИ используется многократно.
     
  16. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    способ рабочий... от 19 ошибок осталось всего 4

    error LNK2001: unresolved external symbol __imp__NtQuerySystemInformation@16
    error LNK2001: unresolved external symbol __imp__NtUnmapViewOfSection@16
    error LNK2001: unresolved external symbol __imp__NtMapViewOfSection@40
    error LNK2001: unresolved external symbol __imp__NtOpenSection@12


    я так понимаю что это нестандартные функции, которых нет в библиотеках по умолчанию.. все они есть в kernel.dll .. Как мне сделать так чтобы эти ошибки невозникали? Отказаться от этих функций невозможно так как на них строится вся программа
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    скачай KmdKit в нем есть инклуды с этими функциями
     
  18. BAY

    BAY New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    23
    прочитал статью "Как создать invoke'абельную библиотеку импорта". Проблемы разрешились. Создал *.lib файл, занес туда нужные функции и скомпилировал. Все заработало!!! спасибо вам огромное.. вы мне сэкономили целую неделю труда.. имхо тему можно закрывать...
     
  19. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Видимо в случае использования релоков - править приходиться только адреса в переходниках.
    Вот это объясните пожалуйста.
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Bill_Prisoner
    Пример №1 (через переходник):
    Код (Text):
    1. E8 2C FF FF FF     call <jmp MessageBoxA>
    2. FF 25 50 70 4C 00 jmp MessageBoxA
    Размер = 6 + 5 * n байт, где n - кол-во вызовов.

    Пример №2 (прямой вызов):
    Код (Text):
    1. FF 15 24 10 40 00 call MessageBoxA
    Размер = 6 * n байт, где n - кол-во вызовов.

    Если MessageBoxA вызывается только 1 раз, то в п1 имеем 11 байт, а в п2 - только 6. Короче:
    Код (Text):
    1. n №1 №2
    2. 1 11  6
    3. 2 16  12
    4. 3 21  18
    5. 4 26  24
    6. 5 31  30
    7. 6 36  36
    8. 7 41  42
    Таким образом, если вызовов 7 или более, первый способ начинает давать выйгрыш по размеру.