gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: Molchalnik  
Дата: 23.09.14 14:16
Оценка:
gcc по непонятной мне причине выдаёт варнинг
__attribute__((stdcall))  int  foo(int, int);

warning: 'stdcall' attribute ignored

При этом тип соглашения не имеет значения, хоть cdecl ставь, хоть fastcall

особых ключей компиляции нет.
флаг -mrtd не имеет эффекта, компилятор пишет что-то про "не работает в 64битном режиме"

Как исправить?
Re: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: niXman Ниоткуда https://github.com/niXman
Дата: 23.09.14 14:17
Оценка:
речь про MinGW?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: Zhendos  
Дата: 23.09.14 14:27
Оценка: +1
Здравствуйте, 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)) и т.п.
От: Zhendos  
Дата: 23.09.14 14:32
Оценка: -1
Здравствуйте, Zhendos, Вы писали:


M>>Как исправить?


Z>stdcall, fastcall это соглашения вызова функций для i386, т.е. 32 битного режима,

Z>зачем вам это нужно в 64 битном, и как именно это должно работать?

можно еще почитать:
http://blogs.msdn.com/b/freik/archive/2005/03/17/398200.aspx

хотя это и блог MS, но ИМХО x64 ABI едино и для Linux,
и для Windows.
Re: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: watchmaker  
Дата: 23.09.14 14:33
Оценка:
Здравствуйте, Molchalnik, Вы писали:


M>компилятор пишет что-то про "не работает в 64битном режиме"

M>gcc по непонятной мне причине выдаёт варнинг
Причина — соглашения stdcall не существует в 64-битном режиме, оно есть только в мире i386.

M>Как исправить?

Не использовать __attribute__((stdcall))
Re[3]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: watchmaker  
Дата: 23.09.14 14:40
Оценка: 4 (1) +1
Здравствуйте, Zhendos, Вы писали:

Z> но ИМХО x64 ABI едино и для Linux, и для Windows.


Совсем нет. ABI отличаются. И в соглашениях вызова тоже. Впрочем важно тут другое — ни там, ни там stdcall, fastcall, cdecl и прочих как таковых уже не существует — вместо них есть единственное соглашение о вызове для данной платформы и использовать можно только его.
Re[2]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: Molchalnik  
Дата: 23.09.14 15:28
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>stdcall, fastcall это соглашения вызова функций для i386, т.е. 32 битного режима,

Не знал

Z>зачем вам это нужно в 64 битном, и как именно это должно работать?

Мне нужно гарантировать правильную работу функций, скомпиленных разными Makefile'ами. У Makefile'ов разные авторы.
Если вдруг в функцию параметры через регистры будут передаваться, а функция будет считать. что передача через стек, да ещё его и зачищать, то будет беда-беда. И не очень пока понимаю, как это изменится на 64битной системе. Почитаю приведённые тут ссылки, может, тогда соображу.
Re[2]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: Molchalnik  
Дата: 23.09.14 16:06
Оценка:
Здравствуйте, watchmaker, Вы писали:

M>>Как исправить?

W>Не использовать __attribute__((stdcall))
Т.е. если есть некий сторонний Makefile c миллионом строк и неизвестным мне набором ключей компилящий одни мои файлы и мой мэйкфайл, компилящий другие мои файлы (и то, и другое в 64битном режиме), то я могу быть уверен, что у меня не будет неприятностей со стеком и неверной передачей параметров?
Re[3]: gcc игнорит calling conventions - __attribute__((any_call)) и т.п.
От: watchmaker  
Дата: 23.09.14 16:52
Оценка:
Здравствуйте, 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)) и т.п.
От: Zhendos  
Дата: 23.09.14 18:29
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Здравствуйте, Zhendos, Вы писали:


Z>> но ИМХО x64 ABI едино и для Linux, и для Windows.


W>Совсем нет. ABI отличаются. И в соглашениях вызова тоже. Впрочем важно тут другое — ни там, ни там stdcall, fastcall, cdecl и прочих как таковых уже не существует — вместо них есть единственное соглашение о вызове для данной платформы и использовать можно только его.


Спасибо, всегда почему-то думал, что насчет amd64 они все-таки смогли договориться
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.