Здравствуйте, wl., Вы писали:
wl.>Не знаю, правильный ли выбрал форум... wl.>Мне понадобилось, чтобы параметры в функцию передавались как в System V ABI: wl.>Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?
Это вряд ли. А тебе принципиально, чтоб был fastcall? cdecl, stdcall — не катят?
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, 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
Здравствуйте, wl., Вы писали:
wl.>Но в компиляторах clang, gcc, visual studio для Windows параметры передаются так:
Правильно, потому что они генерируют код под ABI ОС.
wl.>Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?
Варианты:
а) написать переходник на ассемблере.
б) написать переходник на С и скомпилировать его отдельно, с другим target triple. Потом слинковать его с основным кодом.
Попробую stdcall, но вроде бы в x64 оно игнорируется.
Верно, в x64 есть лишь одно соглашение о вызовах, другие ключевые слова (тысячи их) игнорируются компилятором.
Здравствуйте, wl., Вы писали:
wl.>Не знаю, правильный ли выбрал форум... wl.>Мне понадобилось, чтобы параметры в функцию передавались как в System V ABI:
wl.>Можно ли как-то извратиться, настройкой компилятора, или ключевым словом, чтобы передавать параметры по-первому варианту?
тут слова sysv_abi, ms_abi.
Облом вычислять самую раннюю версию, но в 4.8 уже есть.
Здравствуйте, flаt, Вы писали:
F>Варианты: F>а) написать переходник на ассемблере. F>б) написать переходник на С и скомпилировать его отдельно, с другим target triple. Потом слинковать его с основным кодом.
Здравствуйте, 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.
Здравствуйте, netch80, Вы писали:
N>Сами свою ссылку не читаете N>Starting with Visual Studio 2013, Microsoft introduced the __vectorcall calling convention which extends the x64 convention.
Запустил HelloWorld от Playstation 4 на винде. Загрузил бинарник в память, привязал импорты (вот тут мне нужно было sysv abi), и прыгнул на точку входа.