Я пишу 64-битную операционную систему, используя g ++, и у меня есть переменная функция, такая как:
void DbgPrint(const char *fmt, ...);
, который должен вести себя как printf.
Проблема здесь в том, что g ++ следует за ABI System V и, таким образом, передает первые аргументы в RDI, RSI, RDX, RCX, R8, R9, а затем помещает оставшиеся (если они есть) в стек.
Использовать старые макросы stdarg.h va_start, va_arg и т. Д. С cdecl было довольно просто, поскольку va_arg просто взял следующий элемент в стеке. Но теперь эти макросы не будут работать до седьмого аргумента.
Единственные возможные решения (ИМХО):
- Заставить g ++ создать функцию cdecl. Это кажется невозможным, поскольку атрибут __ __ ((cdecl)) сознательно и четко выделен как , игнорируемый .
- Иметь новый набор макросов, которые работают с новым способом передачи аргументов.
(на самом деле я работаю над Win, поэтому у меня нет заголовков glibc, чтобы проверить их реализацию).
Кто-нибудь с решением? Заранее спасибо.