Вызов функции gcc x64 - PullRequest
       41

Вызов функции gcc x64

1 голос
/ 26 октября 2011

Насколько я знаю, существует два возможных соглашения о вызовах для кода x64 - Microsoft x64 и AMD64.

Теперь gcc можно запустить с параметром -mregparm=0, который не работает, если мы работаем по соглашению о вызовах AMD64. Это происходит потому, что соглашение AMD64 предписывает использование регистров для первых 6 переменных (я не совсем уверен, почему это делается, но я подозреваю, что это реализовано из-за возможных проблем со стеком)

Итак, вот вопрос:

Существуют ли строгие правила, подобные этим (принудительное использование регистра) при компиляции с использованием gcc в соответствии с Microsoft x64 соглашением? И, если да, как их можно обойти, не нарушив совместимость ABI?

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Я не знаю Microsoft Windows (и никогда не использовал ее), поэтому, вероятно, не могу ответить на ваш вопрос по этому поводу.

Тем не менее, соглашения о вызовах двоичного интерфейса приложений AMD64 (в Linux и других Unixes) описаны в спецификации AMD64 ABI (возможно, вам также следует найти и прочитать эквивалентный документ для соглашений о вызовах Microsoft). Я полагаю, что они используют регистры для 6 первых аргументов из соображений производительности (передача значений через регистр быстрее, чем передача их в стек), а не из соображений безопасности.

И какой бы компилятор C ++ вы ни использовали, вы хотите, чтобы он следовал некоторым соглашениям о вызовах, и они практически диктуются системой (потому что вы хотите иметь возможность вызывать системные библиотеки из своего кода). Поэтому, если вы нарушите их, вы нарушите совместимость ABI.

Но я не могу догадаться, почему задают такой вопрос. Вы разрабатываете компилятор с собственными соглашениями о вызовах? Если да, у вас все еще должны быть какие-то средства для вызова библиотек C, и для этого необходимо, чтобы при обращении к внешним библиотекам C вы следовали соглашениям ABI, регулирующим их. Посмотрите на компилятор Ocaml для примера.

3 голосов
/ 26 октября 2011

Я не думаю, что вы можете обойти это без нарушения ABI.Вызов функции и то, как это влияет на регистры и т. Д., Является фундаментальной частью платформы ABI.

Скорее всего, ваша программа не будет работать в Windows x64 из-за несовпадающего вызова функции ABI.

Длявсю необходимую документацию смотрите по этой ссылке MSDN

...