eXeL@B —› Программирование —› DLL и русские в Borland C++... |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 31 июля 2006 09:15 · Личное сообщение · #1 Доброго времени суток, уважаемые. Есть такая прогамма DLL to Lib, которая конвертирует DLL в статическую библиотеку Lib. Автор сделал хороший help, с примерами. Но там ничего не говорится про Borland. Как известно, Borland использует Intel'овский формат объектных файлов OMF, а не Microsoft'овский COFF. Поэтому нужен конвертер. Штатный Borland'овский с этой задачей не справляется - генерирует пустые Lib'ы. Поэтому на помощь приходит другой, с таким же названием. Непонятки возникают во время линковки переконвертированной Lib'ы. Линкер ругается: "Additional segments need to be defined in a .def file". Но врядли тут простое дело. Может быть, у кого-нибудь был такой опыт? DLL to Lib: http://wasm.ru/baixado.php?mode=tool&id=174 http://wasm.ru/baixado.php?mode=tool&id=174 COFF to OMF: http://wasm.ru/baixado.php?mode=tool&id=216 http://wasm.ru/baixado.php?mode=tool&id=216 P.S. Буду рад, если здесь отметится Quantum. ----- MicroSoft? Is it some kind of a toilet paper? |
|
Создано: 31 июля 2006 14:37 · Личное сообщение · #2 |
|
Создано: 31 июля 2006 14:44 · Личное сообщение · #3 |
|
Создано: 01 августа 2006 00:49 · Личное сообщение · #4 В общем, расскажу, что у меня получилось. После создания LIB'ы я делаю вот так: lib /extract:aaa.obj aaa.lib На выходе получаю OBJ-файл формата COFF. Далее перевожу этот файл в формат OMF: coff2omf aaa.obj Подключаю OBJ к проекту, делаю Build. Линкер выдает следующее: Additional segments need to be defined in a .def file Делаю файл aaa.def следующего содержания: SEGMENTS _TEXT _DATA Подключаю DEF к проекту, делаю Build. В папке появляется EXE, заметно выросший по размеру. В нем присутствуют секции _TEXT и _DATA. Причем старые .text и .data очень маленькие. Непонятно, зачем линкер запихал все в новые секции. Пытался как-то это исправить - ничего не получилось. Но на это можно закрыть глаза - проблемы появляются дальше. Теперь я пытаюсь вызвать какую-нибудь функцию из этой библиотеки. Что я только не пробовал, постоянно получаю Unresolved external. Прототипы задаю в файле, сгенерированном DLL to Lib. Самое интересное то, что DllMain из библиотеки я могу вызвать, но что-то другое - всегда Unresolved external. Помогите пожалуйста! Нужно пролить свет на это темное дело. ----- MicroSoft? Is it some kind of a toilet paper? |
|
Создано: 01 августа 2006 02:56 · Личное сообщение · #5 Эта, а зачем тебе в static lib это конвернировать? Я вижу два простых варианта: a) напиши обёрточку которая компилится в Lib, занружает DLL, получает функции и предоставляет Interface остальному коду (этот вариант без imports) b) попробуй сделать lib обёртку в стиле kernel32.lib что б она использовала dll import Или тебя парит что ещё один файл в каталоге? Тогда можешь его сунуть в ресурс.... |
|
Создано: 01 августа 2006 03:11 · Личное сообщение · #6 TimTim пишет: Непонятно, зачем линкер запихал все в новые секции. Пытался как-то это исправить - ничего не получилось. Борландовский линкер (как, впрочем, и многие другие линкеры) использует слудующее простое правило для совмещения секций: одноимённые секции совмещаются. Если мы имеем в одном обьектнике секцию _TEXT и в другом обьектнике тоже секцию с именем _TEXT, то в экзешнике получим одну секцию _TEXT, содержащую код из обоих обьектников. Поэтому, чтобы исправить это недоразумение с дублированием секций, достаточно переименовать секцию .text в _TEXT в OMF-обьектнике. Сделать это можно вручную, в хекс-редакторе - имена секций хранятся в самом начале файла, или с помощью утиля. OMF2D для этого как нельзя кстати подходит. Мой скромный o4delphi тоже умеет переименовывать секции, но omf2d навороченнее Tim пишет: Что я только не пробовал, постоянно получаю Unresolved external. Посмотри в хекс-редакторе - есть ли эти символы вообще в обьектнике. Если dll2lib не ретейловый, то там используется один грязный трюк с экспортом... |
|
Создано: 01 августа 2006 04:15 · Личное сообщение · #7 |
|
Создано: 01 августа 2006 05:05 · Личное сообщение · #8 Tim На васме - демо, или плохо крякнутая демо. Демо кладёт код в один обьектник, а публичные символы, ссылающиеся на этот код - в другой. Возможно, при конвертировании в OMF, эти символы вообще пропали. Допустим, в dll была функция myproc. Посмотри сначала в coff-обьектниках куда попал символ myproc. Потом, после конвертирования в OMF, опять поищи этот символ. Возможно, имеет место манглинг и myproc стал называться _myproc@0. Против манглинга тоже помогает omf2d. Если либа не очень большая, цепляй её сюда. |
|
Создано: 01 августа 2006 05:35 · Личное сообщение · #9 |
|
Создано: 01 августа 2006 05:35 · Личное сообщение · #10 |
|
Создано: 01 августа 2006 13:14 · Поправил: Av0id · Личное сообщение · #11 Asterix, мне достаточно тяжело заливать один мегабайт, а тут целых три постараюсь залить. очевидно, на ру-борде он особо никому не нужен цитата из nfo, видимо это internal release (paradox), т.к. нигде в базах его не видно Note: ===== On several occasions we encountered misbehaviours (i.e. non-working static libs) of (hs rel name here), where the retail worked fine. So, we decided to release the real retail version for all you code rippers...;) |
|
Создано: 01 августа 2006 15:02 · Личное сообщение · #12 |
|
Создано: 01 августа 2006 15:22 · Поправил: Tim · Личное сообщение · #13 PUBD32 '00000000' Segment: _TEXT:0000E200 PUBD32 '00000001' Segment: _TEXT:00008EE0 PUBD32 '00000002' Segment: _TEXT:00008F00 PUBD32 '00000003' Segment: _TEXT:00008E10 PUBD32 '00000004' Segment: _TEXT:00008E60 PUBD32 '00000005' Segment: _TEXT:00008C60 PUBD32 '00000006' Segment: _TEXT:00008CB0 PUBD32 '00000007' Segment: _TEXT:00008D30 PUBD32 '00000008' Segment: _TEXT:00008D90 PUBD32 '00000009' Segment: _TEXT:0000E1F0 ... PUBD32 '0000009E' Segment: _TEXT:000012C0 PUBD32 '0000009F' Segment: _TEXT:00001310 PUBD32 '000000A0' Segment: _TEXT:00001790 PUBD32 '000000A1' Segment: _TEXT:00001800 PUBD32 '000000A2' Segment: _TEXT:00001A80 PUBD32 '000000A3' Segment: _TEXT:00001AB0 PUBD32 '000000A4' Segment: _TEXT:00001A20 PUBD32 '000000A5' Segment: _TEXT:00001870 PUBD32 '000000A6' Segment: _TEXT:000019A0 PUBD32 '000000A7' Segment: _TEXT:000019E0 PUBD32 '_RTS_DllMain@12' Segment: _TEXT:00010787 Осталась только _RTS_DllMain@12 ----- MicroSoft? Is it some kind of a toilet paper? |
|
Создано: 01 августа 2006 17:26 · Личное сообщение · #14 |
|
Создано: 01 августа 2006 18:05 · Личное сообщение · #15 |
|
Создано: 02 августа 2006 15:10 · Личное сообщение · #16 кое-как у меня получилось сделать нормальный OBJ. при вызове функции DllMain прога просто-напросто падает... access violation. примечательно, что она пытается считать вот эти 4 байта: 10001098: FF25AC810D10 jmp _adjust_fdiv ;MSVCRT этой командой: 10018262 |> 8B0D 98100010 MOV ECX, DWORD PTR DS:[10001098] спрашивается, нафига? =) что это такое? глюк линкера, или еще чего-то? ----- MicroSoft? Is it some kind of a toilet paper? |
|
Создано: 02 августа 2006 17:46 · Личное сообщение · #17 |
|
Создано: 02 августа 2006 19:08 · Личное сообщение · #18 |
|
Создано: 02 августа 2006 21:33 · Личное сообщение · #19 |
|
Создано: 03 августа 2006 16:16 · Личное сообщение · #20 |
|
Создано: 03 августа 2006 20:51 · Поправил: Tim · Личное сообщение · #21 Сегодня опять тр****ся с линкером. Все те же секции не дают покоя по ночам... Вот что я накопал. Цитата из справки: TDUMP command-line options ...the -oi switch is to check the names and sizes of the segments generated in a particular module. For instance, TDUMP -oiSEGDEF MYMODULE.OBJ displays the names, attributes, and sizes of all of the segments in MYMODULE. Делаю вот так: TDUMP -oiSEGDEF Unit1.obj Получаю: Turbo Dump Version 5.0.16.12 Copyright (c) 1988, 2000 Inprise Corporation Display of File UNIT1.OBJ 001B92 SEGDEF 1 : _TEXT DWORD PUBLIC USE32 Class 'CODE' Length: 0000 001B9C SEGDEF 2 : _DATA DWORD PUBLIC USE32 Class 'DATA' Length: 0000 001BA6 SEGDEF 3 : _BSS DWORD PUBLIC USE32 Class 'BSS' Length: 0004 001F10 SEGDEF 4 : $$BSYMS BYTE PUBLIC USE32 Class 'DEBSYM' Length: 13ba 001F1A SEGDEF 5 : $$BTYPES BYTE PUBLIC USE32 Class 'DEBTYP' Length: 157b 001F24 SEGDEF 6 : $$BNAMES BYTE PUBLIC USE32 Class 'DEBNAM' Length: 1e8b 001F2E SEGDEF 7 : $$BROWSE BYTE PUBLIC USE32 Class 'DEBSYM' Length: 0000 001F38 SEGDEF 8 : $$BROWFILE BYTE PUBLIC USE32 Class 'DEBSYM' Length: 0000 Теперь делаю так: TDUMP -oiSEGDEF модуль.obj Turbo Dump Version 5.0.16.12 Copyright (c) 1988, 2000 Inprise Corporation Display of File модуль.obj Т.е. ничего нет... Вот почему линкер ругался... Почему ничего нет-то? ----- MicroSoft? Is it some kind of a toilet paper? |
|
Создано: 03 августа 2006 23:13 · Личное сообщение · #22 Tim пишет: Т.е. ничего нет... Вот почему линкер ругался... Почему ничего нет-то? Начинаю сам отвечать на свои вопросы... Ничего нет... Конечно ничего и не будет... т.к. COFF2OMF делает сегменты типа SEGD32, а борландовский компилятор SEGDEF. Этим объясняется и то, что он ругается "Additional segments need to be defined in a .def file", хотя имена секций совпадают. Просто типы разные... Простая замена типа сегмента в OBJ-файле не помогает - TDUMP после этого выводит кашицу. Не знаю, что теперь делать... Как заставить COFF2OMF генерить сегменты типа SEGDEF? Подозреваю что никак... Тогда как переделать их вручную? Решил сейчас посмотреть сегменты какого типа делает Дельфи. Оказалось, что тоже SEGDEF. Так нафига тогда COFF2OMF делает SEGD32? ----- MicroSoft? Is it some kind of a toilet paper? |
|
Создано: 04 августа 2006 03:31 · Личное сообщение · #23 |
|
Создано: 04 августа 2006 05:35 · Личное сообщение · #24 Tim пишет: Этим объясняется и то, что он ругается "Additional segments need to be defined in a .def file", хотя имена секций совпадают. Просто типы разные... Даже тупой дельфийский линкер нормально обрабатывает оба типа сегментов. Ошибка не в этом. Tim пишет: Простая замена типа сегмента в OBJ-файле не помогает У них же размер различается. SEGDEF32, кажется, на 2 байта длиннее 16-битного. Tim пишет: Как заставить COFF2OMF генерить сегменты типа SEGDEF? В этом нет необходимости. Tim пишет: Additional segments need to be defined in a .def file Видимо, линкер воспринимает только 3 типа сегментов и всё, что им не воспринимается как text, data и bss, нуждается в определении. Хотя, если имена в точности совпадают, то этой проблемы быть не должно. |
|
Создано: 04 августа 2006 06:57 · Личное сообщение · #25 Tim пишет: Думаю, написать, чтоли, тутор... Нужен ли он вообще? Напиши! Прочтут этот тутор, и может, кто укажет, как проще это все сделать, да и вдруг новые подводные камни начнут появляться придется исправлять и их. Цитата: Мои благодарности Asterix'у за выявление досадной ошибки в предыдущей версии данного описания и за тестирование Dll2lib! P. S. Выложи здесь!? ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 04 августа 2006 07:05 · Личное сообщение · #26 |
|
Создано: 04 августа 2006 07:06 · Личное сообщение · #27 |
|
Создано: 04 августа 2006 07:08 · Личное сообщение · #28 |
|
Создано: 04 августа 2006 07:22 · Личное сообщение · #29 |
|
Создано: 04 августа 2006 08:46 · Личное сообщение · #30 |
. 1 . 2 . >> |
eXeL@B —› Программирование —› DLL и русские в Borland C++... |