Ada_Ru форум

Обсуждение языка Ада

Stdcall on Linux

Оставить новое сообщение

Сообщения

Dmitriy Anisimkov
Stdcall on Linux
2007-09-19 05:42:38

Есть такой продукт Wine, он предоставляет Win32 API в Linux.

Он сносно позволяет запускать Win32 приложения в линуксе, это есть binary совместимость.

Так же можно в чисто линукс приложениях пользоваться Win32 API, это есть совместимость по исходникам.

 

Win32 API поставляется Wine-ом в Stdcall calling convention.

 

GNAT позволяет делать Stdcall вызовы только в Windows.

В Linux Stdcall делает сишное соглашение.

 

Получается, что пользоваться Wine Win32 API в GNAT Linux напрямую невозможно.

Можно писать какие то враперы конечно преобразующие вызов из одного соглашения в другое,

но это как то нехорошо, по моему мнению.

 

Разрешить настоящий Stdcall в линуксе, можно 2-мя способами.

 

1. Сделать парамер командной строки для линукса, который означает, что Stdcall надо

воспринимать как настоящий Stdcall, несмотря на то что мы в линуксе.

2. Сделать дополнительный calling convention, который независимо от операционки делает

виндовое соглашение о вызове, назвать его например Win_API.

 

1 вариант лично для меня выглядить предпочтительнее, потому что не надо будет

переписывать тип соглашения в Win32Ada.

Можно и оба варианта сделать, они друг другу не противоречат.

 

Вопрос.

 

Кто нибудь изучал GNAT исходники настолько, что бы подсказать мне, где эти функции можно внедрить

в GNAT ?

 

Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается.

 

Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается.

 

decl.c:

 

/* Convention_Stdcall should be processed in a specific way on Windows targets

only. The macro below is a helper to avoid having to check for a Windows

specific attribute throughout this unit. */

 

#if TARGET_DLLIMPORT_DECL_ATTRIBUTES

#define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall)

#else

#define Has_Stdcall_Convention(E) (0)

#endif

Vadim Godunko wrote:

Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается.

 

decl.c:

 

/* Convention_Stdcall should be processed in a specific way on Windows targets

only. The macro below is a helper to avoid having to check for a Windows specific attribute throughout this unit. */

 

#if TARGET_DLLIMPORT_DECL_ATTRIBUTES

#define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall) #else

#define Has_Stdcall_Convention(E) (0)

#endif

 

Тупо удалил условие и оставил только

 

#define Has_Stdcall_Convention(E) (Convention (E) == Convention_Stdcall)

Stdcall в линуксе стал работать, но с вайном все равно дружить не стало. Там наверное что то еще хитрее.

Dmitriy Anisimkov wrote:

 

Stdcall в линуксе стал работать, но с вайном все равно дружить не стало.

Там наверное что то еще хитрее.

 

А зачем такое хитрое решение?

 

PS. Может там кросскомпиляция нужна?

Vadim Godunko wrote:

Dmitriy Anisimkov wrote:

 

Stdcall в линуксе стал работать, но с вайном все равно дружить не стало. Там наверное что то еще хитрее.

зачем такое хитрое решение?

 

Для совместимости с Win32 приложениями на уровне исходников.

Что бы не надо было кросс компилятор, если уже есть линуксовый компилятор.

PS. Может там кросскомпиляция нужна?

Кросскомпиляция не нужна, Win32 API доступно через вот такие файлы user32.dll.so.

Там наверное какое то хитрое соглашение о вызове.

Или может я че не так делаю.

 

А на самом деле это уже стало мне не актуально, потому что DDE под Wine глючит само по себе,

и все равно пришлось в виндах тестировать.

19.09.2007 11:42, Dmitriy Anisimkov пишет:

Есть такой продукт Wine, он предоставляет Win32 API в Linux.

Он сносно позволяет запускать Win32 приложения в линуксе, это есть binary совместимость.

Так же можно в чисто линукс приложениях пользоваться Win32 API, это есть совместимость по исходникам.

 

Win32 API поставляется Wine-ом в Stdcall calling convention.

 

GNAT позволяет делать Stdcall вызовы только в Windows.

В Linux Stdcall делает сишное соглашение.

 

Получается, что пользоваться Wine Win32 API в GNAT Linux напрямую невозможно.

Можно писать какие то враперы конечно преобразующие вызов из одного соглашения в другое,

но это как то нехорошо, по моему мнению.

 

Разбираясь с возможностями GNAT, обнаружил такое:

 

https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gnat_rm/Pragma-Machine_005fAttribute.html#Pragma-Machine_005fAttribute

 

Это можно скомбинировать с атрибутом stdcall отсюда:

https://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Function-Attributes.html

 

А для своих целей я искал, как бы сделать адскую функцию varargs. Потому что интринсик __builtin_va_start импортировать получается, а

воспользоваться им — нет.

 

error: 'va_start' used in function with fixed args

 

Атрибута varargs, к сожалению, не вижу, а жаль. Это бы многое упростило. Может, varargs в GCC — это не свойство функции, как в Delphi, а наличие аргумента какого–т оособог отип. аН еразгада лпок аэт узагадк,

упридёт, сяпохо, жевооб, libffi щеподключа, тьслишк ом ужгуст API, о йскотор ымнуж норабота.

 

т ьСуважени,

емЛеваш евИв,

анБарна

 

--

If you want to get to the top, you have to start at the bottom

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти