使用gcc编译一个显示"未定义引用`abort'"的项目

Ezi*_*zio 7 c linux printf variadic-functions

我写了一个使用va_list/va_arg/va_start/va_end/va_arg的printf myselef.

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))))
Run Code Online (Sandbox Code Playgroud)

首先,我从linux内核复制这些宏,printf可以打印32位整数正确但不能打印64位整数和打印double/float可能会失败或崩溃.然后我检查代码,我猜va_*可能有错误,所以我使用__builtin_va_*而不是内核的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)
Run Code Online (Sandbox Code Playgroud)

但是gcc提示"未定义引用`abort'",所以我写了一个空的abort()和myprintf正确地工作.我的问题是:

  1. 为什么linux内核va_list/va_arg/va_start/va_end/va_arg不能用于printf64位整数和double/float?
  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_*`,这是他们的定义?

Quu*_*one 6

不要从 Linux 头文件中剪切和粘贴内容。相反,将其放在源文件的顶部:

#include <stdarg.h>
Run Code Online (Sandbox Code Playgroud)

这将为您提供使用va_list和所需的一切va_arg。但是,它不会引入printf或任何标准 I/O 内容(位于 中<stdio.h>)。