Ошибка при линковки

Тема в разделе "WASM.BEGINNERS", создана пользователем Entropy, 7 сен 2020.

  1. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    174
    Всем привет,у меня возникла такая проблема,не удается прилинковать библиотеку kernel32.lib,ну не то что бы не удается,просто полученная прога вылетает с ошибкой,объясню более конкретно,имеется у меня вот такой код:
    Код (ASM):
    1.  
    2. EXTERN __imp_ExitProcess:proc
    3.  
    4. public entry
    5.  
    6. .data
    7.  
    8.  
    9. txt db "HELLA WORLD",0
    10.  
    11. .code
    12.  
    13. entry:
    14.  
    15.  
    16.  
    17. mov rcx,0
    18. call __imp_ExitProcess
    19.  
    20.  
    21. end
    22.  
    23.  
    компилирую его ml64.exe из пакета DDK
    Код (Text):
    1. ml64.exe vetv.asm
    ,а линкую я его вот так
    Код (Text):
    1. link vetv.obj /DEFAULTLIB:kernel32.lib /SUBSYSTEM:console  /ENTRY:entry
    библиотеку kernel32.lib взял также из пакета DDK,после линковки получаю экзешник,запускаю его и сразу он вылетает с ошибкой,не могу понять в чём причина
     
    Последнее редактирование: 7 сен 2020
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Так с какой ошибкой? У меня чет режим телепатической отладки не включается сегодня.
     
  3. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    174

    Вложения:

    • err.PNG
      err.PNG
      Размер файла:
      63,4 КБ
      Просмотров:
      168
    • err2.PNG
      err2.PNG
      Размер файла:
      174,4 КБ
      Просмотров:
      167
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Скинь бинарник лучше. Или собери этим http://masm32.com/board/index.php?board=53.0

    Я тоже не экстрасенс, но предполагаю, что что-то с атрибутами секций , скажем на кодосекцию нет права на выполнения.
     
  5. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    174
    M0rg0t, вот держите
     

    Вложения:

    • binar.zip
      Размер файла:
      441 байт
      Просмотров:
      172
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Так а линкер тебе никаких ворнингов не выдал? Очень странно, что у тебя код на одной странице (1000h которая), а исполнять он пытается другую (2000h которая). Можно предположить, что у тебя с точкой входа что-то не то, но тогда бы линкер ругался на то, что ты неправильно ее указал или еще чего. Открой объектный файл в IDA или в другом дизассемблере и посмотри, чего он там нагенерил, может метку entry не сделал, или она по сишному называется там _entry или еще чего.
     
  7. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    174
    Rel, не каких ворнингов не было
    --- Сообщение объединено, 7 сен 2020 ---
    Rel, я посмотрел,там она называется entry,предполагаю что в kernel32.lib проблема
     

    Вложения:

    • screen.PNG
      screen.PNG
      Размер файла:
      52,1 КБ
      Просмотров:
      164
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Ну я посмотрел бинарь, точка входа у тебя нормальная. В начале секции (2000) у тебя лежит таблица импорта. Я не шарю в масме, но ты пытаешься вызвать как код запись в таблице импорта. Вероятно тебе не надо объявлять и пытаться вызвать __imp_ExitProcess, а вызывать собственно ExitProcess, не?
     
  9. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    174
    проверю, отпишу сюда
    --- Сообщение объединено, 7 сен 2020 ---
    Rel, спасибо,всё работает
     
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Rel, мой масм вообще это не может сбилдить; если заменить первую строку вот так
    Код (ASM):
    1. include \masm32\include64\masm64rt.inc
    2. ;EXTERN __imp_ExitProcess:proc
    тогда работает.

    А если взять билд Entropy, то там всего лишь надо поменять (в бинарнике, код то идентичный) call [exitprocess] на call qword ptr [exitprocess] , в х64дбг или в иде меняем, и норм работает. Почему так - хз, но факт.