Сейчас на форуме: hgdagon, asfa (+4 невидимых)

 eXeL@B —› Программирование —› DLL и русские в Borland C++...
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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?




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 31 июля 2006 14:37
· Личное сообщение · #2

единственное что у меня есть, это retail dll2lib



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 31 июля 2006 14:44
· Личное сообщение · #3

Av0id
Retail? А можешь поделиться?

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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?





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 01 августа 2006 02:56
· Личное сообщение · #5

Эта, а зачем тебе в static lib это конвернировать? Я вижу два простых варианта:
a) напиши обёрточку которая компилится в Lib, занружает DLL, получает функции и предоставляет Interface остальному коду (этот вариант без imports)

b) попробуй сделать lib обёртку в стиле kernel32.lib что б она использовала dll import

Или тебя парит что ещё один файл в каталоге? Тогда можешь его сунуть в ресурс....



Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 01 августа 2006 03:11
· Личное сообщение · #6

TimTim пишет:
Непонятно, зачем линкер запихал все в новые секции. Пытался как-то это исправить - ничего не получилось.

Борландовский линкер (как, впрочем, и многие другие линкеры) использует слудующее простое правило для совмещения секций: одноимённые секции совмещаются. Если мы имеем в одном обьектнике секцию _TEXT и в другом обьектнике тоже секцию с именем _TEXT, то в экзешнике получим одну секцию _TEXT, содержащую код из обоих обьектников. Поэтому, чтобы исправить это недоразумение с дублированием секций, достаточно переименовать секцию .text в _TEXT в OMF-обьектнике. Сделать это можно вручную, в хекс-редакторе - имена секций хранятся в самом начале файла, или с помощью утиля. OMF2D для этого как нельзя кстати подходит. Мой скромный o4delphi тоже умеет переименовывать секции, но omf2d навороченнее

Tim пишет:
Что я только не пробовал, постоянно получаю Unresolved external.

Посмотри в хекс-редакторе - есть ли эти символы вообще в обьектнике. Если dll2lib не ретейловый, то там используется один грязный трюк с экспортом...



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 01 августа 2006 04:15
· Личное сообщение · #7

Quantum
ну а на васме ретейл ведь версия?

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 01 августа 2006 05:05
· Личное сообщение · #8

Tim
На васме - демо, или плохо крякнутая демо. Демо кладёт код в один обьектник, а публичные символы, ссылающиеся на этот код - в другой. Возможно, при конвертировании в OMF, эти символы вообще пропали. Допустим, в dll была функция myproc. Посмотри сначала в coff-обьектниках куда попал символ myproc. Потом, после конвертирования в OMF, опять поищи этот символ. Возможно, имеет место манглинг и myproc стал называться _myproc@0. Против манглинга тоже помогает omf2d. Если либа не очень большая, цепляй её сюда.



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 01 августа 2006 05:35
· Личное сообщение · #9

Av0id пишет:
единственное что у меня есть, это retail dll2lib


я уже второй раз вижу твою подобную фразу, первый раз на руборде,
только не понимаю смысл, ну и что что у тебя есть, ты хочешь поделится с народом
или похвастаться?



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 01 августа 2006 05:35
· Личное сообщение · #10

Вопрос так и остался открытым... где можно достать Retail версию DLL to Lib?

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 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...;)




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 01 августа 2006 15:02
· Личное сообщение · #12

Av0id, Asterix
Буду очень признателен. Да и Володе следовало бы обновить многие программки. Часто встречаю, написано 1.7, а на самом деле в архиве 1.5. Непорядок.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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?




Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 01 августа 2006 17:26
· Личное сообщение · #14

Tim пишет:
PUBD32 '00000000' Segment: _TEXT:0000E200

Это первая функция из экспорта DLL, просто теперь она называется 00000000. Можешь прямо в хекс-редакторе поменять это имя на более внятное и начинать использовать.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 01 августа 2006 18:05
· Личное сообщение · #15

Quantum
Понятно. Но все-таки хотелось увидеть этот пресловутый RETAIL... если он вообще существует.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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?





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 02 августа 2006 17:46
· Личное сообщение · #17

Компилятор на С++ юзает иногда фишки типа не прямого вызова импорта, а mov reg32,import, а потом call reg32. Подозреваю, что тут именно так. А вот как поправить-фиг знает.



Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 02 августа 2006 19:08
· Личное сообщение · #18

MSVC вызывает импорт прямо через call [addr] или mov reg32,addr call reg32, как заметил Archer. Борландовские компиляторы предпочитают классический вариант с call <jmp addr>. OMF2D умеет исправлять это дело. В общем, не проблема.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 02 августа 2006 21:33
· Личное сообщение · #19

Решил провести эксперимент - проделать все то же самое в Visual C++. Так вот работает как часики. Никаких проблем!

Попробую поразбираться с OMF2D...

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 03 августа 2006 16:16
· Личное сообщение · #20

Что-то я не понимаю одного. Почему все-таки линкер ругается "Additional segments need to be defined in a .def file", когда в моем сконвертированном объектнике нет ни одного сегмента, которого не было бы в Project1.obj?

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 04 августа 2006 03:31
· Личное сообщение · #23

В общем, с горем пополам, а все-таки получилось у меня изготовить рабочую статическую библу... На имена секций пришлось забить... Не суть важно...

Думаю, написать, чтоли, тутор... Нужен ли он вообще?

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 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, нуждается в определении. Хотя, если имена в точности совпадают, то этой проблемы быть не должно.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 04 августа 2006 06:57
· Личное сообщение · #25

Tim пишет:
Думаю, написать, чтоли, тутор... Нужен ли он вообще?


Напиши!
Прочтут этот тутор, и может, кто укажет, как проще это все сделать, да и вдруг новые подводные камни начнут появляться придется исправлять и их.

Цитата:
Мои благодарности Asterix'у за выявление досадной ошибки в предыдущей версии данного описания и за тестирование Dll2lib!

P. S.
Выложи здесь!?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 04 августа 2006 07:05
· Личное сообщение · #26

Av0id пишет:
Asterix, мне достаточно тяжело заливать один мегабайт, а тут целых три постараюсь залить. очевидно, на ру-борде он особо никому не нужен


А ты отдельно ключик выложи ;)



Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 04 августа 2006 07:06
· Личное сообщение · #27

Присоединяюсь. Пиши тутор.



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 04 августа 2006 07:08
· Личное сообщение · #28

Demon666 пишет:
Мои благодарности Asterix'у за выявление досадной ошибки в предыдущей версии данного описания и за тестирование Dll2lib!


это вобще-то в финале тутора Quantum



Ранг: 29.5 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 04 августа 2006 07:22
· Личное сообщение · #29

Asterix
Сдаётся мне, что задумывалось оно не как тутор вообще. Да и тутором пару абзацев не назовёшь. А вообще, на васме в форуме, кажется, потом предложили более прямое решение.



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 04 августа 2006 08:46
· Личное сообщение · #30

Asterix пишет:
это вобще-то в финале тутора Quantum'а


Да нет тут чуть по-другому, это намек, уже давно… на васме после статьи/тутор`а идут комментарии, иногда в них (комментариях) можно много полезной инфы увидеть для автора и …

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com



. 1 . 2 . >>
 eXeL@B —› Программирование —› DLL и русские в Borland C++...
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати