MT и Linux

 

Здравствуйте.

Например, устанавливаем mt4 в linux, запускаем через Wine. Возможно ли прикрутить динамические библиотеки линукса (.so) к wine->mt4? Возможно ли научить g++ (не из mingw) компилировать .dll?


Пока плотно этим вопросом не занимался, разбираюсь с Linux'ом, хочу понять перспективы.

 
220Volt:

Здравствуйте.

Например, устанавливаем mt4 в linux, запускаем через Wine. Возможно ли прикрутить динамические библиотеки линукса (.so) к wine->mt4? Возможно ли научить g++ (не из mingw) компилировать .dll?


Пока плотно этим вопросом не занимался, разбираюсь с Linux'ом, хочу понять перспективы.


Прикрутить so к виндовой программе так же нельзя как прикрутить dll к никсовой. Вот когда будет ось, которая будет сама понимать оба формата, тогда прикрутите (подсказка: ее не будет)
 

Мне кажется, что самой программе фиолетово .so или .dll, должен отличаться лишь загрузчик.

 
220Volt:

Мне кажется, что самой программе фиолетово .so или .dll, должен отличаться лишь загрузчик.


Напишите программу под винду с вызовом .so и покажите всем что так возможно сделать в принципе.
 
220Volt:

Мне кажется, что самой программе фиолетово .so или .dll, должен отличаться лишь загрузчик.


Как вам кажется, если отличается лишь загрузчик, то зачем тогда потребовалось писАть целый wine, аж эмулятор операционной системы, чтоб запускать виндовые программы на линуксе? Это же две совершенно рзлиные оси, у них и работа с памятью, и объекты, и файловые системы, да б-г знает что еще ну просто разное, на 0% совместимое друг с другом.

Хотя, конечно, если вы напишете прогу на ассемблере под x86/64 без использования ресурсов ОС (включая, скажем, такие базовые вещи как выделение памяти), то тогда да, работать она будет одинаково на любой системе. Да и то с поправкой на тот факт, что формат файла программы различается.

 

Вы таки удивитесь и очень будете смеяться, но код ассемблера тоже различается для Вин и Лин, не говоря уж про бинарники )))

Простой пример одной и той же программки:


Линь
Вынь
" section .data
msg: db "Hello, World!", 10
.len: equ $ - msg
section .text
global main
main:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msg.len
int 0x80
mov eax, 1
mov ebx, 0
int 0x80 "
%include 'win32n.inc'
extern GetStdHandle
import GetStdHandle kernel32.dll
extern WriteConsoleA
import WriteConsoleA kernel32.dll
extern ExitProcess
import ExitProcess kernel32.dll

section data use32 class = data
msg: db "Hello, World!", 13, 10
.len: equ $ - msg

section code use32 class = code
..start:
    push STD_OUTPUT_HANDLE
    call [GetStdHandle]
    push NULL
    push NULL
    push msg.len
    push msg
    push eax
    call [WriteConsoleA]
    push NULL
    call [ExitProcess]
 

Эту тему я создавал в прошой жизни ).

Удалось прикрутить linux библиотеки к wine->mt4. Для интересующихся оставлю небольшое руководство, все действия на debian i386:

  • $ apt-get install wine
  • $ apt-get install wine32-dev-tools
  • Делаем тествовую linux библиотеку, копируем (скомпилированную) (в каталоге проекта библиотека нужна для дальнейшей линковки) в один из каталогов для поиска библиотек или через LD_LIBRARY_PATH:
// linux_lib.cpp
extern int fn(int i, double d)   { return i + d; }
  •  $ gcc linux_lib.cpp -fpic -shared -o linux_lib.so
  • Создаем переходник wine <--> linux:
// wrapper.cpp
extern int fn(int, double);    // Должно быть в linux_lib.h
extern "C" int fn_wr(int i, double d)   { return fn(i, d); }
  • Создаём spec файл:
# wrapper.spec
1 cdecl fn_wr(long double)
  • Находим winegcc: $ find /usr -name winegcc       . Добавляем двоеточеи и каталог winegcc в переменную PATH.
  • $ winegcc wrapper.cpp wrapper.spec linux_lib.so -fpic -shared -o mt.dll
  • Библиотека переходник готова, кидаем ее в Libraries терминала.
  • Тест:
#property strict

#import "mt.dll.so"
   int fn_wr(int, double);
#import

void OnStart()
{
   Alert( fn_wr(5, 3) );
}

Синтаксис spec файла: http://www.winehq.org/docs/winelib-guide/spec-file

Целочисленный аргумента не превышающий 4 байта в spec файле указываются как long.

P.S: линукс библиотеку можно "вшить" в переходник, ключ -static если не ошибаюсь.

 

Я неправильно выбрал имя для linux библиотеки. Все имена либ должны начинаться с lib, например liblinux_lib.so. Иначе либа имеет шанс быть ненайденной в стандартных путях для поиска (/etc/ld.so.conf).

После того как положили либу в стандартное место (/usr/local/lib например), то возможно потребуется вызвать ldconfig от root'a, для обновления базы библиотек.

Причина обращения: