powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сделать lib (COFF) из dll (OMF)
16 сообщений из 41, страница 2 из 2
Сделать lib (COFF) из dll (OMF)
    #33289591
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет implib.exe от Микрософта.... есть такая программа, вернее была в Miscrosoft C. В Visual C ее уже нету. И делала она точно такие-же OMF библиотеки как Борландовская утилита, потому что тогда Микрософт не использовал COFF формат :)

В Visual C зато есть утилита lib.exe, которая сама умеет делать библиотеки для импорта. Любыми средствами (хоть вручную хоть через борландовский imdef) делаешь def файл для своей dll. Потом lib /def:myimport.def , и все.
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33289631
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MustDieВот к чему я пришел. Разница между стандартами библиотек в работе со стеком (где-то вычитал).
Не верно. В одной и тоже библиотеке (и библиотеке объектников и в DLL) ты можешь иметь функции работающие со стеком как угодно.

MustDieНеужели никто не знает как это сделать? У меня в библиотеке более 1200 функций - я свихнусь их динамически подключать!
а сделать массив имен и массив адресов?
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33289663
Фотография MustDie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВ Visual C зато есть утилита lib.exe, которая сама умеет делать библиотеки для импорта. Любыми средствами (хоть вручную хоть через борландовский imdef) делаешь def файл для своей dll. Потом lib /def:myimport.def , и все.
Я с этого начал (см. начало темы). Lib нормально собирается и безошибочно прилинковывается, однако, при вызове функций (причем после их отработки) вылетает сообщение:

Чтобы это значило?
При динамическом подключении все ОК. Изменения директив вызова функций в родном h-нике, либо устранение/добавление extern "C" приводят либо к ошибке на этапе компиляции, либо к ошибке в доступе к памяти в момент обращения к функции. Тогда как в первом случае функции хотя бы успевают отработать.
White Owlа сделать массив имен и массив адресов?Что-то вроде этого и пришлось на данный момент наваять, но ведь обидно, что не удается разобраться! Причем заковырка-то, скорее всего, плевая...
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33289719
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MustDieЧтобы это значило?
А вот это как раз и есть разная работа со стеком. В dll функция сама чистит стек а потом еще и вызывающая программа чистит стек или наоборот ни тот ни другой стек не чистят. Смотри как сделаны вызовы в dll и как в программе.
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33289835
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MustDieПопробовал. Не катит. Кроме того, все что там описано можно получить просто используя impdef с опцией -а. При этом в Билдере есть еще и утилита для преобразования lib-ов из COFF в OMF. Поэтому проблем-то никаких при использовании MSVC-библиотеки в Builder, надо-то как раз НАОБОРОТ! Если бы все так просто было - там черточку убрал, сюда поставил, то уж написал бы кто-то парсер для DEF-файлов, однако я ничего не нашел в Интернете.

Если наоборот , то у меня дома в какойто книжке это было написанно как сделать ...
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33291708
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для MustDie: На поразвлекайся.
Там исходные тексты и батник собирающий:
1) BC dll с двумя процедурами (cdecl и stdcall) и тестовый пример использования этой dll через сам BC.
2) VC1_test - библиотека импорта делается через "lib /def". Идеально работает с cdecl функциями, но падает на stdcall
3) VC2_test - VC делает промежуточную пустотелую dll, на ее основе линкер создает библиотеку импорта. Промежуточная dll убивается, а библиотека импорта идет в проект. Работает одновременно и с cdecl и с stdcall функциями.
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33291906
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
MustDieНеужели никто не знает как это сделать? У меня в библиотеке более 1200 функций - я свихнусь их динамически подключать!
а сделать массив имен и массив адресов?

Да вот, действительно. Вот например из MFC ODBC API грузиться динамически (по крайней мере в какой-то версии так было , может сейчас они отказались от этого). И ничего, написали себе кучу макросов, и -- вперед с песнями, все API. Сколько там функций ? Порядка нескольких сотен, кажется ?
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33293163
ii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй вот так

Для твоих исходный условий вроде подходит:DLL перекомпилировать не надо
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33318612
Фотография MustDie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!
Прощу прощения за длительное отсутствие, но, думаю, следует эту тему продолжить, ибо конкретного решения до сих пор нет, а ситуация, судя по цитируемости в Инете, весьма распространенная.
Во-первых, всем большое спасибо за участие в дискуссии.
Во-вторых - результаты моих мучений.
Спасибо White Owl за наглядный пример. Реально он не помог, но его исследование привело к некоторым умозаключениям.
Дело в том, что есть набор библиотек, которые обновляются практически каждый день. Есть ряд разработок на различных языках, использующих эти библиотеки, в том числе и на VC (с чем и проблема). Кроме того, эти библиотеки поставляются еще и сторонним разработчикам. Соотвествено, писать промежуточные библиотеки для создания lib-ов для VC, как в примере White Owl , равно как и плодить дубликаты этих библиотек для каждой среды разработки - не есть приемлимый вариант. Утилита, скачаная по ссылке от ii , кроме того, что отказывается воспринимать DLL со смешанными вызовами функций _cdecl и _stdcall (и в help-e ничего путного про это не написано), также еще и не является программой "open source", что не приветствуется моей компанией.
Итак, чтобы статически прилинковать библиотеку формата OMF в проект VC, требуется выполнить ряд шагов (самый простой пока вариант):
1) сделать def.
для этого, используя borland-овский impdef, генерируем def-файл с перечнем функций библиотеки, далее правим его следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
LIBRARY     <DLLNAME>.DLL
EXPORTS 
//а) для __stdcall-функций
   my_stdcall_func@xx     @yy
   //где xx-суммарное количество байт параметров функции
   //yy - порядковый номер функции, как сгенерил impdef
   //my_stdcall_func - реальное имя функции в библиотеке 

//б) для __cdecl-функций
   my_cdecl_func = _my_cdecl_func      @yy
   //где yy - порядковый номер функции, как сгенерил impdef
   //my_cdecl_func - реальное имя функции в библиотеке 
2) используя поправленный def, сделать lib:
lib /def:<defname>.def
3) подключить lib: #pragma comment (lib, "<libname>.lib")
4) использовать функции с описанием их как __cdecl или __stdcall соответственно.

Однако, при таком раскладе не удается автоматизировать процесс создания lib из существующей dll, что в моей ситуации необходимо. Парсер для создания def-файла, даже имея все h-файлы с описаниями функций библиотек, представляется мне весьма сложным в отношении _stdcall -функций, ибо возможность подсчитать байты параметров функций себе плохо представляю, учитывая наличие множества пользовательских типов данных.
Соответсвенно, вопрос остается открытым.

Алгоритм, описанный выше, является плодом моих исследований в данной области, соответсвенно использовать его как руководство я бы не рекомендовал, не смотря на то, что у меня он работает безошибочно.

Жду ваших рекомендаций и замечаний по этому вопросу.
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33318646
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у вас действительно есть dll c cdecl и stdlib вызовами? Обычно все же либо одно, либо другое. И чаще всего cdecl.
Во вторых, если хочется делать такую библиотеку импорта регулярно... я бы взял perl, и на нем накатал бы небольшой скрипт который на основе SomeLib.h генироровал бы SomeLib.c. Собственно говоря там писать всего ничего. Что-то в духе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
while(<>) {
  if( /(\w)(\s.+?\(\.+?\));/im ) {
    if( $ 1  == "void" ) {
      print "$1$2 { return;}\n";
    } else {
      print "$1$2 { return ($1)0;}\n";
    }
  }
}
Полученый сишник вместе с хедером - компилируется в промежуточную dll, полученая библиотека импорта - то что нужно. И запускай это все, хоть десять раз на дню.

Впрочем, есть еще вариант - написать свой собственный implib.exe который будет делать COFF библиотеки :)
Да и загрузку dll в рантайме, никто еще не запрещал.
Так что, если честно я не очень понимаю в чем затык.
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33318994
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нафига нужно грузить все эти DLL именно статически ???
Грузи динамически, для этого lib-ы не нужны
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33321273
Фотография MustDie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)А нафига нужно грузить все эти DLL именно статически ???
Грузи динамически, для этого lib-ы не нужны

Выше я описал проблему и то, почему надо именно статически.
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33321282
Фотография MustDie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, еще один вопрос в ту же тему.
В def-файле для каждой функции прописывается ее номер:
Код: plaintext
myfunc@ 4     @number
При использовании Borland-ового IMPLIB можно указать опцию -f (force by name), тогда при подключении lib-a в проект, определение точек входа будет осуществляться по имени, а не по номеру. Вопрос: как заставить так же работать lib.exe (от MS), чтобы компилятор VC не ругался на lib, собранный по def-у, в котором не указаны номера функций (или указаны не те)?
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33321713
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MustDie Gluk (Kazan)А нафига нужно грузить все эти DLL именно статически ???
Грузи динамически, для этого lib-ы не нужны

Выше я описал проблему и то, почему надо именно статически.

Не убедил Ничего кроме чиста спортивного интэрэса ВЫШЕ я не обнаружил
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33341284
Фотография MustDie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я никого и не старался тут в чем-то убеждать. Просто по жизни люблю халяву и просто плохо сплю, когда мне дают библиотеки, дают готовые h-ники, а я должен для каждой функции писать динамический вызов....
Вопрос-то практически уже решен. Как только lib.exe заставить собирать lib-ы из def-ов без нумерации функций?
...
Рейтинг: 0 / 0
Сделать lib (COFF) из dll (OMF)
    #33341338
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не пиши ты эти номера функций в def и все. Нашел проблему...
К тому же я тебе уже показывал как можно на основе *.h получить *.c в автоматическом режиме и делать библиотеку экспорта через временную dll.
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сделать lib (COFF) из dll (OMF)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]