Как прочесть аргументы функции на стеке / заставить gcc хранить аргументы функции на стеке?

Для понимания того, как прочитать аргументы функции на стеке, необходимо понимать, как функции работают в C и как данные передаются между функциями.

В C, при вызове функции, аргументы передаются в регистры или кладутся на стек в обратном порядке, начиная с последнего аргумента. В зависимости от платформы и архитектуры, есть различные соглашения о том, как передаются аргументы (например, соглашение cdecl, stdcall, fastcall и т.д.).

Если вам нужно заставить компилятор GCC хранить аргументы функции на стеке, вместо передачи через регистры, есть несколько способов сделать это.

Первый способ - это использование атрибута __attribute__((force_stack_args)). Этот атрибут сообщает компилятору, что он должен положить аргументы функции на стек, вместо регистров. Пример:

void my_function(int arg1, int arg2) __attribute__((force_stack_args));

void my_function(int arg1, int arg2) {
    // Ваш код здесь
}

Второй способ - это использование ключевого слова __builtin_ms_va_list. Оно позволяет вам явно создать указатель на список аргументов и избежать использования регистров для передачи аргументов. Пример:

void my_function(int arg1, int arg2, ...) {
    __builtin_ms_va_list args;
    __builtin_ms_va_start(args, arg2);

    // Чтение аргументов из стека
    int arg3 = __builtin_ms_va_arg(args, int);
    int arg4 = __builtin_ms_va_arg(args, int);

    // Ваш код здесь

    __builtin_ms_va_end(args);
}

Обратите внимание, что способ использования __builtin_ms_va_list является специфичным для компилятора GCC и может не работать на других компиляторах.

Надеюсь, данная информация будет полезной для вас при чтении аргументов функции на стеке и при использовании гибкости компилятора GCC.