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 ?

Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается.
Vadim Godunko
Re: [ada_ru] Stdcall on Linux
2007-09-19 13:41:57
>
> Или хоть какой то ориентир. Я вообще не знаю от куда там что начинается.
>
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
Dmitriy Anisimkov
Re: [ada_ru] Stdcall on Linux
2007-09-21 10:14:36
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 в линуксе стал работать, но с вайном все равно дружить не стало.
Там наверное что то еще хитрее.
Vadim Godunko
Re: [ada_ru] Stdcall on Linux
2007-09-21 18:19:02
Dmitriy Anisimkov wrote:
> 
> Stdcall в линуксе стал работать, но с вайном все равно дружить не стало.
> Там наверное что то еще хитрее.
> 
А зачем такое хитрое решение?

PS. Может там кросскомпиляция нужна?
Dmitriy Anisimkov
Re: [ada_ru] Stdcall on Linux
2007-09-22 09:40:43
Vadim Godunko wrote:
> Dmitriy Anisimkov wrote:
>   
>> Stdcall в линуксе стал работать, но с вайном все равно дружить не стало.
>> Там наверное что то еще хитрее.
>  зачем такое хитрое решение?
>   
Для совместимости с Win32 приложениями на уровне исходников.
Что бы не надо было кросс компилятор, если уже есть линуксовый компилятор.

> PS. Может там кросскомпиляция нужна?
Кросскомпиляция не нужна, Win32 API доступно через вот такие файлы
user32.dll.so.
Там наверное какое то хитрое соглашение о вызове.
Или может я че не так делаю.

А на самом деле это уже стало мне не актуально, потому что DDE под Wine
глючит само по себе,
и все равно пришлось в виндах тестировать.
Иван Леваше
Re: Stdcall on Linux; varargs
2016-03-30 16:51:22
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

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