Masm -> Obj -> Delphi - проблемы с CRT(malloc, free)

Тема в разделе "WASM.BEGINNERS", создана пользователем GroundHog, 20 май 2008.

Статус темы:
Закрыта.
  1. GroundHog

    GroundHog New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    35
    Пытаюсь вырезать и пересобрать из чужого бинарника кусочек асм-кода. Компилирую Masm в OBJ, потом линкую в Delphi.

    Но есть одна проблема, в асм-коде есть вызовы из CRT - malloc/free, Delphi ругается:
    Как обойти эту проблему?

    Хотя, даже если слинкуется, я не совсем понимаю, как это будет жить с дельфовым менеджером памяти? В этой статье http://www.rsdn.ru/article/cpp/crt.xml написано, что для того, чтобы работали ф-и из CRT, нужно сначала выполнить инициализацию.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    GroundHog
    Я тоже не люблю Си и Си++(особенно), но если нет под Дельфи, то юзаю МС компилятор и иногда Интел.
    Дешевле получается. Ну и еще два способа :
    1) либо переделать выделение памяти - это не просто. но и не так уж сложно.
    2) попытаться скрестить ужа с ежом : проинициализировать CRT и поиметь много трудного секса.
    Кстати, тут попадался по нужде проектик c2pas - простые проги без проблем конвертятся.
     
  3. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    для примера, если юзается memset, то в делфевом юните (где делаешь $L file.obj) вставляешь:
    Код (Text):
    1. procedure _memset(P: Pointer; B: Byte; count: LongInt); cdecl;
    2. begin
    3.   FillChar(P^, count, B);
    4. end;
    Только проверь, что у тебя в obj-файле, часто перед именем компилер подчерк вставляет, т.е. memset -> _memset.
    А твои функции будут по аналогии.
    При этом, внутри них ты будешь вызывать делфевый манагер памяти типа GetMem/FreeMem.
     
  4. GroundHog

    GroundHog New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    35
    valterg
    Я не не люблю, задача такая просто.

    Max
    Т.е. я смогу из OBJ дёргать функции, которые в Delphi описаны?

    Начал переделывать всё это дело под HeapAlloc и т.п. и обнаружил что Delphi ругается и на другие функции. Вылечилось добавлением в uses Windows(в котором и объявлен HeapAlloc). Тогда ничего не понимаю, в OBJ вообще что попадает? :)
     
  5. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    да. в конечном итоге линкеру все равно - где и на каком языке эти функции написаны, главное чтоб они были найдены при сборке.
    ты можешь на делфе их написать (со своей реализацией), и тогда линкер заменит все вызовы malloc в obj, на вызов твоих делфевых функций.
    главное, чтоб совпадали имена функций, ну и тип вызова + параметры ес-но.
     
  6. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    ...для примера погугли minilzo - архиватор типа.
    он на сях написан, но есть порт под делфю, который юзает сишный obj + замена CRT функций
     
  7. GroundHog

    GroundHog New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2005
    Сообщения:
    35
    Max
    Огромное тебе спасибо! Разобрался, как это всё работает, топик можно закрывать.
     
Статус темы:
Закрыта.