Здравствуйте, Molchalnik, Вы писали:
M>gcc по непонятной мне причине выдаёт варнинг M>
M>__attribute__((stdcall)) int foo(int, int);
M>
M>warning: 'stdcall' attribute ignored
M>При этом тип соглашения не имеет значения, хоть cdecl ставь, хоть fastcall
M>особых ключей компиляции нет. M>флаг -mrtd не имеет эффекта, компилятор пишет что-то про "не работает в 64битном режиме"
M>Как исправить?
stdcall, fastcall это соглашения вызова функций для i386, т.е. 32 битного режима,
зачем вам это нужно в 64 битном, и как именно это должно работать?
Re[2]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
M>>Как исправить?
Z>stdcall, fastcall это соглашения вызова функций для i386, т.е. 32 битного режима, Z>зачем вам это нужно в 64 битном, и как именно это должно работать?
M>компилятор пишет что-то про "не работает в 64битном режиме" M>gcc по непонятной мне причине выдаёт варнинг
Причина — соглашения stdcall не существует в 64-битном режиме, оно есть только в мире i386.
M>Как исправить?
Не использовать __attribute__((stdcall))
Re[3]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
Здравствуйте, Zhendos, Вы писали:
Z> но ИМХО x64 ABI едино и для Linux, и для Windows.
Совсем нет. ABI отличаются. И в соглашениях вызова тоже. Впрочем важно тут другое — ни там, ни там stdcall, fastcall, cdecl и прочих как таковых уже не существует — вместо них есть единственное соглашение о вызове для данной платформы и использовать можно только его.
Re[2]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
Здравствуйте, Zhendos, Вы писали:
Z>stdcall, fastcall это соглашения вызова функций для i386, т.е. 32 битного режима,
Не знал
Z>зачем вам это нужно в 64 битном, и как именно это должно работать?
Мне нужно гарантировать правильную работу функций, скомпиленных разными Makefile'ами. У Makefile'ов разные авторы.
Если вдруг в функцию параметры через регистры будут передаваться, а функция будет считать. что передача через стек, да ещё его и зачищать, то будет беда-беда. И не очень пока понимаю, как это изменится на 64битной системе. Почитаю приведённые тут ссылки, может, тогда соображу.
Re[2]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
Здравствуйте, watchmaker, Вы писали:
M>>Как исправить? W>Не использовать __attribute__((stdcall))
Т.е. если есть некий сторонний Makefile c миллионом строк и неизвестным мне набором ключей компилящий одни мои файлы и мой мэйкфайл, компилящий другие мои файлы (и то, и другое в 64битном режиме), то я могу быть уверен, что у меня не будет неприятностей со стеком и неверной передачей параметров?
Re[3]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
Здравствуйте, Molchalnik, Вы писали:
M>Здравствуйте, watchmaker, Вы писали:
M>>>Как исправить? W>>Не использовать __attribute__((stdcall)) M>Т.е. если есть некий сторонний Makefile c миллионом строк и неизвестным мне набором ключей компилящий одни мои файлы и мой мэйкфайл, компилящий другие мои файлы (и то, и другое в 64битном режиме), то я могу быть уверен, что у меня не будет неприятностей со стеком и неверной передачей параметров?
Ну конечно не можешь :)
Ведь формально среди этого неизвестного набора ключей компиляции вполне могут быть такие, которые нарушают ABI еще каким-нибудь способом. Ведь есть много возможностей создать тут проблем окромя как задать неверное соглашение о вызове. Например можно выставить разный размер wchar у сопрягаемых модулей — в этом случае проблем с передачей параметров не избежать. Впрочем, в контексте твоего изначального вопроса, наличие stdcall никак эту ситуацию не исправит — вызов и в этом случае закончится катастрофой, просто из-за того, что это проблема лежит вне области соглашений о передачи параметров. Так что задавая произвольные параметры компиляции можно разломать почти всё.
Если же специально и намеренно не вредить, то в windows и unix на x86-64 (ты ведь одно из этих называешь 64-х битным режимом?) никаких проблем с передачей параметров не будет, можешь быть спокоен. То есть на этих платформах есть только один способ сделать вызов и весь код его должен использовать. Если он делать этого не будет, то он просто не будет ни с чем ни совместим и сам по себе.
Re[4]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, Zhendos, Вы писали:
Z>> но ИМХО x64 ABI едино и для Linux, и для Windows.
W>Совсем нет. ABI отличаются. И в соглашениях вызова тоже. Впрочем важно тут другое — ни там, ни там stdcall, fastcall, cdecl и прочих как таковых уже не существует — вместо них есть единственное соглашение о вызове для данной платформы и использовать можно только его.
Спасибо, всегда почему-то думал, что насчет amd64 они все-таки смогли договориться