vkle
написал 4 декабря 2005 года в 20:13 (3316 просмотров)
Ведет себя
как мужчина; открыл 6 тем в форуме, оставил 28 комментариев на сайте.
Нельзя ли использовать DLL в Linux? Ведь разного рода плееры используют виндовые библиотеки… Просвятите, или толкните в нужном направлении.
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
DLL — это COFF/PE бинарник, который просто экспортирует набор символов. Если ты знаешь что это за символы, и по какому смещению они доступны, то есстественно можешь их вызывать. Другое дело, что они в свою очередь, тоже захотят какие-либо символы, которые тебе придется обеспечивать.
Не думаю, что эта затея имеете хоть какой-то смысл.
есть два мысли, как это сделать:
1) просто тупо загрузить PE в память процесса (как это технически сделать, в секцию .code см dlopen из libc, а может можно даже заставить ld этим заниматься), разрешить все символы и отлавливая исключения эмулировать виндовые syscall’ы. Может можно умнее (например модифицировав код dll’ки), но тут я тебя отошлю к mplayer’у, я в нём не копался и как он это делает — не знаю.
2) попробовать воспользоваться wine’ом. wine ведь уже умудряется сочетать в процессе виндовый PE и линуховый ELF. так что может и удасться. по крайней мере syscall’ы эмулировать не придётся.
У меня все немного проще, в DLL храняться некоторые алгоритмы, которые не пользуются windows api (ну или не должны это делать), может это упростит задачу?
если там алгоритмы которые на используют других dll, и виндовых syscall’ов, то имеет смысл прогулятся до wasm.ru изучить формат PE, и научится его грузить. Не так это сложно. Или… в общем если собрать binutils с поддержкой PE, то может получиться конвертнуть его в ELF, и использовать как обычную библиотеку. Ну с оговорками на конвенцию вызова. там, насколько я помню за отчистку стека от параметров отвечает вызываемая функция. помоему там stdcall используется (int func () __attribute__((stdcall));) могут быть ещё проблемы с именами функций: __imp__MessageBoxA@16 из C без дополнительного шаманства не вызвать :).
Хотя есть ещё один путь: алгоритмы можно рипнуть дизассемблером…