Подскажите, как можно использовать функцию из некоторого юнита, написанного на дельфях, в MASM'е? Я создал .obj файлы, указав в Project->Options->Linker 'Generate C .obj files'. Но когда пытаюсь слинковать потом этот объектник с моими масмовскими, то получаю: My.obj : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt Что можно исправить, чтобы эта ошибка не появлялась? Или может быть можно ещё как-то получить возможность использовать функции юнита? Причем хотелось бы именно статический вариант, .dll мне не очень подходит :-/ Заранее спасибо всем ответившим
Во первых надо придерживаться соглашения передачи параметров Там по другому, не через стэк, а через регистры eax, edx если мало параметров Во вторых поменять компилятор на TASM, Бормановские компиляторы не понимают .obj созданные MASM поэтому и выскакивает ошибка LNK1123
LNK1123 выдаёт MS link.exe при конвертации OMF формата объектника, который использует Borland. По крайней мере версии 5.012.8078 и 7.10.3052. Можно попробовать наоборот конвертить MASM'овый объектник посредством coff2omf.exe и линковать ilink32.exe Или сгенерить ASM файл и его уже компилировать MASM'ом после доработки напильником. А вообще SteelRat прав, проще TASM заюзать.
Спасибо за советы Проблема в том, что в юните, функции из которого мне нужны , используются юниты System и SysUtils Слишком много лишнего кода получается :-/ Кстати идея с тасмом - очень хороша Он всё сразу схватил, если бы не размер кода, то это было бы лучшим решением. А нет ли какого-нибудь способа сделать статическую библиотеку, которую можно было бы использовать потом с масмом? ну или в крайнем случае хотя бы с тасмом?
Barracuda > Проблема в том, что в юните, функции из которого мне нужны , используются юниты System и SysUtils Слишком много лишнего кода получается :-/ SysUtils добавляет ~30Kb к размеру exe'шника. Про System ничего не скажу, т.к. не пробовал.
System даже внешне выглядит громоздко. Мне к тому же стало лениво генерить .obj для всех юнитов, которые входят в System и SysUtils То есть у меня не получилось настроить Дельфю так, чтобы генерились .obj файлы для всех включенных юнитов, хотя переключатель Project->Options->Linker 'Generate C .obj files' установлен. Почему-то генерит .obj, только если написано UnitXXX in 'unitXXX.pas' и то только в том случае, когда удаляю соотв. .dcu файл. Короче как-то глючно А мне в настройках Дельфы копаться не сильно нравится, до этого никогда не пользовался ею Так что я не стал терзать .obj, а сделал так: создал .dll, в которую включил нужные мне юниты. Потом bin2db и она уже в MASMе При запуске просто распаковываю в temp и LoadLibrary+GetProcAddress Кстати, может кто-нибудь знает, как можно убрать лишний хлам из дельфовой .dll, пошаманив в настройках Дельфи? В том числе стандартные ресурсы, которые Дельфя пихает в .dll?
Кстати, а почему бы DLL не запаковать? Это, конечно, не то, что ты спрашивал, но как крайний метод...
SolidCode, а всё, я уже даволен результатом К конечному exe-шнику чуть более 20 кил прибавляется (пожат UPXом), даже при оставленных ресурсах. Я посмотрел - они всего пару кб Главная 'тонкость' - отключить модуль Classes, который дельфя зачем-то по дефолту включает Таким образом 40 кб экономим (или ~20 по размеру конечного файла).
Эти вопросы лучше на королевстве делфей задать, я тоже бился над удалением мусора, но без результатов, дельфя по умолчанию даже окно ввода пароля для подключения к БД в ресурсы сует и диалоги InputBox, так, что бы было Кажется и Classes отключал, только после этого чего-то добился...
Ради того, чтобы получить точно такую же функцию в масме На асме переписать - это конечно хорошо Но реализовывать криптографию на асме для каждого алгоритма - слишком долго :-/ Я вообще смог из этого юнита рипнуть нужный мне код с помощью IDA (правда поправлять пришлось изрядно :-/), но это слишком долго и не очень весело, особенно когда у функций большая вложенность. Плюс к этому IDA любит иногда писать вместо lea xxx, SomeDword[yyy] -> lea xxx, адрес_SomeDword_в_виде_числа[yyy], то есть просто не может отличить метку от числа. А такие команды достаточно часто встречаются в различных реализациях, потому что используется работа с таблицами. К тому же придется заменять все эти LStrAddRef, LStrAsgn и пр. на свой код. Существует, конечно же, масса уже готовых реализаций, но они не всегда подходят, то есть могут быть небольшие отличия, а могут совершенно менять суть дела. Например, взять тот же самый DES. Существуют несколько стандартов, которые имеют принципиальные отличия. А все готовые реализации гордо называют себя DES'ом и не пытаются указать стандарт, в соответствии с которым всё это было написано В такой ситуации найти аналог даже на Си проблематично. Просто мне хотелось получить какое-нибудь решение, которое было бы более или менее универсальным Чтобы можно было в следующий раз взять и вместо одной .dll подгрузить другую и использовать другой крипто-алгоритм.
Barracuda System даже внешне выглядит громоздко. Мне к тому же стало лениво генерить .obj для всех юнитов, которые входят в System и SysUtils Попробуй поискать урезанный вариант модуля System, с ним минимальный размер DLL становится 7 килобайт вместо 13-ти. А потом нужные функции других модулей ручками вырезать из исходников Борланда и вставить в текст программы. Только про классы, строковые утилиты и т.п. придется забыть - размер моментально вырастет на десятки Кб. Можно еще решать задачу с другого конца: MASMовские исходники перегнать в формат TASM или сделать из них OBJ и впихнуть в программу на Delphi.