System V ABI на Windows?
От: wl. Россия  
Дата: 07.03.19 07:39
Оценка:
Не знаю, правильный ли выбрал форум...
Мне понадобилось, чтобы параметры в функцию передавались как в System V ABI:

; __int64 __fastcall test(unsigned __int64, unsigned __int64)
;public test(unsigned long, unsigned long)
    test(unsigned long, unsigned long) proc near
....
; Вызов
    mov     esi, 2          ; unsigned __int64
    mov     edi, 1          ; unsigned __int64
    call    test(ulong,ulong)


Но в компиляторах clang, gcc, visual studio для Windows параметры передаются так:

; __int64 __fastcall test(unsigned __int64, unsigned __int64)
;public test(unsigned long long, unsigned long long)
    test(unsigned long long, unsigned long long) proc near
....
; Вызов
    mov     edx, 2          ; unsigned __int64
    mov     ecx, 1          ; unsigned __int64
    call    test(ulong long,ulong long)


Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?
Re: System V ABI на Windows?
От: rg45 СССР  
Дата: 07.03.19 08:23
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Не знаю, правильный ли выбрал форум...

wl.>Мне понадобилось, чтобы параметры в функцию передавались как в System V ABI:
wl.>Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?

Это вряд ли. А тебе принципиально, чтоб был fastcall? cdecl, stdcall — не катят?
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 07.03.2019 8:26 rg45 . Предыдущая версия .
Re[2]: System V ABI на Windows?
От: wl. Россия  
Дата: 07.03.19 09:30
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это вряд ли. А тебе принципиально, чтоб был fastcall? cdecl, stdcall — не катят?


Это IDA подставляет, в исходнике ничего нет, настройки компиляторов по-умолчанию. Попробую stdcall, но вроде бы в x64 оно игнорируется. cdecl — тоже не через те регистры параметры передаются

#include <iostream>
uint64_t test(uint64_t x, uint64_t y) {
    return x + y;
}
int main() {
    test(1, 2);
}


Первая версия скомпилирована gcc в "windows 10 linux subsystem"(Ubuntu 18.04), вторая в mingw-w64.
Мне казалось, что win10 умеет напрямую эльфы запускать, оказалось нет, обязательно нужно через bash -c
Отредактировано 07.03.2019 9:31 wl. . Предыдущая версия .
Re: System V ABI на Windows?
От: flаt  
Дата: 07.03.19 11:23
Оценка:
Здравствуйте, wl., Вы писали:

wl.>Но в компиляторах clang, gcc, visual studio для Windows параметры передаются так:


Правильно, потому что они генерируют код под ABI ОС.


wl.>Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?


Варианты:
а) написать переходник на ассемблере.
б) написать переходник на С и скомпилировать его отдельно, с другим target triple. Потом слинковать его с основным кодом.


Попробую stdcall, но вроде бы в x64 оно игнорируется.


Верно, в x64 есть лишь одно соглашение о вызовах, другие ключевые слова (тысячи их) игнорируются компилятором.
Re: System V ABI на Windows?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 07.03.19 12:34
Оценка: 8 (1) +1
Здравствуйте, wl., Вы писали:

wl.>Не знаю, правильный ли выбрал форум...

wl.>Мне понадобилось, чтобы параметры в функцию передавались как в System V ABI:

wl.>Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?


тут слова sysv_abi, ms_abi.
Облом вычислять самую раннюю версию, но в 4.8 уже есть.
The God is real, unless declared integer.
Re[2]: System V ABI на Windows?
От: wl. Россия  
Дата: 07.03.19 12:34
Оценка:
Здравствуйте, flаt, Вы писали:

F>Варианты:

F>а) написать переходник на ассемблере.
F>б) написать переходник на С и скомпилировать его отдельно, с другим target triple. Потом слинковать его с основным кодом.

Спасибо.
Сложно как-то, придется на маке писать
Re[2]: System V ABI на Windows?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 07.03.19 12:42
Оценка:
Здравствуйте, flаt, Вы писали:

F>Верно, в x64 есть лишь одно соглашение о вызовах,


Сами свою ссылку не читаете
Starting with Visual Studio 2013, Microsoft introduced the __vectorcall calling convention which extends the x64 convention.
— уже расширение.
Ещё одно изменение описывает Agner Fog:

Early versions of the 64 bit Windows ABI specified that only the lower 64 bits of XMM6-XMM15have callee-save status while later versions specify that all 128 bits must be saved. An MSDN document dated June 14, 2004 specifies the now-obsolete rule while a later version dated February 18, 2005 specifies the new rule without comments on the change. The change is mentioned in Intel compiler manuals. The 2005 standard is supported by Intel C++ compiler version 8.1.015 and later. My tests show that Microsoft compiler version 14.00.2228.2 uses the obsolete convention, while version 14.00.40310.41 uses the new convention.


давно, но хвосты могут ещё торчать.
The God is real, unless declared integer.
Re[2]: System V ABI на Windows?
От: wl. Россия  
Дата: 07.03.19 13:00
Оценка:
Здравствуйте, netch80, Вы писали:

N>тут слова sysv_abi, ms_abi.

N>Облом вычислять самую раннюю версию, но в 4.8 уже есть.

Прокатило! Спасибо огромное!
Re[3]: System V ABI на Windows?
От: flаt  
Дата: 12.03.19 14:25
Оценка:
Здравствуйте, netch80, Вы писали:

N>Сами свою ссылку не читаете

N>Starting with Visual Studio 2013, Microsoft introduced the __vectorcall calling convention which extends the x64 convention.

И правда, это я пропустил. Спасибо
Re: System V ABI на Windows?
От: wl. Россия  
Дата: 26.03.19 15:28
Оценка:
Здравствуйте, wl., Вы писали:

Запустил HelloWorld от Playstation 4 на винде. Загрузил бинарник в память, привязал импорты (вот тут мне нужно было sysv abi), и прыгнул на точку входа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.