COFF > Intel OMF > Borland OMF [delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Flame of Soul, 9 Dec 2010.

  1. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    Решила сделать доброе (не бескорыстное) дело, сделать порт Lua в Delphi по аналогии модуля zLib. Т.е. свободного использования скриптового движка без тягания за собой dll.

    В связи с реализацией, выявила 3 варианта развития:

    1) переписать с 0, (прозаично и геморно)
    2) загнать dll в ресурс и извращаться с распаковкой в память (быдлокод и реализация через * )
    3) перегнать скомпанованные "Release/*.o" из coff to borland omf

    Пошла третьим путем. Слила исходники с SF. Собрала Билд Release dll. Далее начала тянуть все *.о файлы.

    Перегнала все через coff2omf aka [1994 by Walter Oney]
    После чего попытка бинда.

    Code:
    {$L obj\lapi.o}
    {$L obj\lauxlib.o}
    {$L obj\lbaselib.o}
    {$L obj\lcode.o}
    {$L obj\ldblib.o}
    {$L obj\ldebug.o}
    {$L obj\ldo.o}
    {$L obj\ldump.o}
    {$L obj\lfunc.o}
    {$L obj\lgc.o}
    {$L obj\linit.o}
    {$L obj\liolib.o}
    {$L obj\llex.o}
    {$L obj\lmathlib.o}
    {$L obj\lmem.o}
    {$L obj\loslib.o}
    {$L obj\lopcodes.o}
    {$L obj\lobject.o}
    {$L obj\loadlib.o}
    {$L obj\lparser.o}
    {$L obj\ltm.o}
    {$L obj\main.o}
    В итоге получаем 37 ерроров по не декрарейшен.
    Code:
    [Error] lua.dpr(37): Unsatisfied forward or external declaration: '_lua_setfield'
    [Error] lua.dpr(37): Unsatisfied forward or external declaration: '_lua_yield'
    ...
    [Error] lua.dpr(37): Unsatisfied forward or external declaration: '_lua_xmove'
    [Fatal Error] lua.dpr(37): Compilation terminated; too many errors
    собственно ручная декларация влечет за собой фактически переписывание, но по всей видимости Omf не съелся как надо и ошибки в перессылках внутри obj.

    Решила прогнать еще через OMF2D, чтобы наверняка компилятор все это дело скушал, но ничего путевого с этим не вышло, там сдвиги offset`ов при конверте, я так и не поняла что именно он не съел. Сдвигает все правильно.

    Накопала
    lua.o
    lauxlib.o
    ...
    в сорцах пакетов под FPC, но они также coff и самое страшное что их не есть coff2omf, точнее после него DCC32 вообще не признает. Как и после дополнительной прогонки через omf2d. И при этом сам пакет опять таки не использует их а просит тягать dll,so,mylib (от платформы)

    + пыталась гонять через 2010 by Agner Fog objconverter, результат аналогичный.

    _________________________________

    Ну собственно вопрос, как обойти эти грабли, возможно какие то параметры нужно дополнительные ставить в omf2d ? Какие еще есть пути развития ситуации. Запарилась уже брутфорсить, жду советов по кормлению)).

    Буду рада любым советам.
     
    1 person likes this.
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А в чем была скомпилена DLL ?
    почему сразу *.o? Это что MinGW компилятор чтоли?
    В большенстве случаев надо просто скомпилить в MS компиляторах и врать obj файлы
    А также зависит от того как именно были определены прототипы функций.
    Возможно просто когда делаешь DLL надо убрать что они экспортируются. А просто компилить как обычные функции.
    и В делфяных прототипах функций описать что это обычные функции stdcall а не экспортируемые откуданить
     
    1 person likes this.
  3. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    да, сижу под CodeBlocks и под вин и под Kubunty
    всегда думала что VS создает Coff а Delphi есть только свой OMF, со 2 версии не есть даже интеловский.
    "MYCFLAGS=-DLUA_BUILD_AS_DLL"
    через #define LUA_API __declspec(dllexport)
    Code:
    Возможно просто когда делаешь DLL надо убрать что они экспортируются.
    я конечно попробую, но банальный example под Library с экспортом сознает нормальный obj (*.о) и далее методом шаманства coff2omf > omf2d > {$L 'name'*.o} цепляется в Delphi и вызывается;

    Code:
    и В делфяных прототипах функций описать что это обычные функции stdcall
    так и сделано, но до прототипов еще не доходит
     
  4. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45
    дело не в версии и не в компиляторе MSVS или MinGW, проверила.
    Также не в експорте, тоже проверенно, походу при конвертации из-за offseta происходят сдвиги. Чтож качаю Ида, придется смотреть перессылки друг на друга внутри объектников, мож он имена правит... Узнаю правда попробую рассказать.