8

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 は正しく動作します。私の質問は次のとおりです。

  1. Linux カーネルが64 ビット整数と double/float にva_list/va_arg/va_start/va_end/va_arg使用できないのはなぜですか?printf
  2. を使用したとき__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list、なぜ gcc は " abort'"? But I can not find the definition of__builtin_va_* への未定義の参照" を表示し、その定義はどこにあるのでしょうか?
4

2 に答える 2

6

Linux ヘッダーから何かを切り取って貼り付けないでください。代わりに、これをソース ファイルの先頭に置きます。

#include <stdarg.h>

va_listこれにより、とを使用するために必要なすべてが得られますva_arg。ただし、標準の I/O 要素 ( に存在するもの) は取り込まれませんprintf<stdio.h>

于 2013-06-20T21:53:59.927 に答える