va_list/va_arg/va_start/va_end/va_arg を使用する printf myself を作成しました。
typedef char *va_list;
#define _AUPBND (sizeof (acpi_native_int) - 1)
#define _ADNBND (sizeof (acpi_native_int) - 1)
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
最初に、これらのマクロを Linux カーネルからコピーすると、printf は 32 ビット整数を正しく出力できますが、64 ビット整数を出力できず、double/float の出力が失敗または崩壊する可能性があります。エラーが発生するので、カーネルの va_* の代わりに __builtin_va_* を使用します。
typedef __builtin_va_list va_list;
#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
しかし、gcc プロンプトは「`abort' への未定義の参照」であるため、空の abort() を記述し、myprintf は正しく動作します。私の質問は次のとおりです。
- Linux カーネルが64 ビット整数と double/float に
va_list/va_arg/va_start/va_end/va_arg
使用できないのはなぜですか?printf
- を使用したとき
__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list
、なぜ gcc は "abort'"? But I can not find the definition of
__builtin_va_* への未定義の参照" を表示し、その定義はどこにあるのでしょうか?