nixp.ru v3.0

22 октября 2017,
воскресенье,
22:23:53 MSK

DevOps с компанией «Флант»
vkle написал 4 декабря 2005 года в 20:13 (1687 просмотров) Ведет себя как мужчина; открыл 6 тем в форуме, оставил 28 комментариев на сайте.

Нельзя ли использовать DLL в Linux? Ведь разного рода плееры используют виндовые библиотеки… Просвятите, или толкните в нужном направлении.

decvar

DLL — это COFF/PE бинарник, который просто экспортирует набор символов. Если ты знаешь что это за символы, и по какому смещению они доступны, то есстественно можешь их вызывать. Другое дело, что они в свою очередь, тоже захотят какие-либо символы, которые тебе придется обеспечивать.

Не думаю, что эта затея имеете хоть какой-то смысл.

rgo

есть два мысли, как это сделать:

1) просто тупо загрузить PE в память процесса (как это технически сделать, в секцию .code см dlopen из libc, а может можно даже заставить ld этим заниматься), разрешить все символы и отлавливая исключения эмулировать виндовые syscall’ы. Может можно умнее (например модифицировав код dll’ки), но тут я тебя отошлю к mplayer’у, я в нём не копался и как он это делает — не знаю.

2) попробовать воспользоваться wine’ом. wine ведь уже умудряется сочетать в процессе виндовый PE и линуховый ELF. так что может и удасться. по крайней мере syscall’ы эмулировать не придётся.

vkle

У меня все немного проще, в DLL храняться некоторые алгоритмы, которые не пользуются windows api (ну или не должны это делать), может это упростит задачу?

rgo

если там алгоритмы которые на используют других dll, и виндовых syscall’ов, то имеет смысл прогулятся до wasm.ru изучить формат PE, и научится его грузить. Не так это сложно. Или… в общем если собрать binutils с поддержкой PE, то может получиться конвертнуть его в ELF, и использовать как обычную библиотеку. Ну с оговорками на конвенцию вызова. там, насколько я помню за отчистку стека от параметров отвечает вызываемая функция. помоему там stdcall используется (int func () __attribute__((stdcall));) могут быть ещё проблемы с именами функций: __imp__MessageBoxA@16 из C без дополнительного шаманства не вызвать :).

Хотя есть ещё один путь: алгоритмы можно рипнуть дизассемблером…