Пользовательское соглашение вызова X86_64 для вызова функции C - PullRequest
5 голосов
/ 15 января 2010

Я должен сделать интерфейс (скажем, оболочку), который позволяет вызывать код сборки X86_64, используя его соглашение о вызовах к функции C, с другим соглашением о вызовах. Лучше всего было бы быть довольно «независимым от компилятора» (просто измените оболочку), поэтому я ищу что-то, что помещает регистры / стек обратно в компилятор. Я уже посмотрел здесь: Пользовательское соглашение о вызовах для P / Invoke и C # , и оно близко к тому, что я должен сделать. В настоящее время я использую GCC, но приветствуются советы от других компиляторов!

Итак, вот что нужно для лучшего понимания проблемы (нестандартное соглашение о кодировании странно):

pushq  %r11    # saves r11 for call
movq 64bits_address %r11 # move a 64 bits address that points on a data structure
callq *8(%r11) # calls an address in the data structure
popq %r11      # restores %r11 ; return value is in the structure

Мне нужно иметь возможность вызывать "специальную" (упаковочную) функцию C; здесь работа будет заключаться в распределении вызовов между другими функциями C. Таким образом, эта оболочка должна найти% r11, сохранить все регистры и подготовить стек для дальнейшего вызова. Есть ли правильный способ сделать это в C (с некоторым встроенным ассемблером)?

Большое спасибо

1 Ответ

3 голосов
/ 15 января 2010

Для получения документации о соглашениях о вызовах и о том, как параметр передается функции (в регистрах? Что? Что в стеке и т. Д.), Посмотрите документ Агнера Фога .

Затем вы можете взглянуть на исходный код libffi , чтобы увидеть, как они это делают.

...