【问题标题】:vfscanf.c warning: the scanf functions add several kilobytes of bloatvfscanf.c 警告:scanf 函数增加了数千字节的膨胀
【发布时间】:2017-01-09 08:35:39
【问题描述】:

我在使用dietlibc 时收到此警告消息。是不是由于dietlibc版本。我正在使用饮食 0.33

我无法解决此警告,请帮帮我

【问题讨论】:

  • 如果您不关心额外的几个 kb,那么请忽略警告。
  • 第一:你知道这个警告是什么意思吗?第二:你知道dietlibc的用途吗?
  • 我正在努力建立董事会,并在寻找更小的库的过程中遇到了dietlibc。我发布了我的这个查询,因为我无法弄清楚这个警告的原因。因此,如果您有解决方案,请与我分享,否则有很多人可以解决您关于dietlibc 的目的以及警告的含义的疑问!!!!!!

标签: c linux warnings


【解决方案1】:

您的程序需要将 scanf 库函数添加到您的目标代码中。这可能是因为您使用了 sscanf 或其他类似函数,或者您调用的函数又需要 scanf 函数。

scanf(和 printf)库以庞大而闻名。它们需要解码(和编码)字符串以及十六进制和浮点等的所有函数。您最终可以将一个 2k 的程序扩展到 20k,因为您使用了一个 scanf 函数。

警告告诉您,您的程序可能会占用更多空间,因为您需要使用 scanf 库。

编辑:

库是目标文件的集合。链接器将任何需要的目标文件添加到您的程序中。它不能包含目标文件的一部分;要么全有,要么全无。因为 vscanf 包含在 Dietlib 的 libstdio.o 中,所以您使用的任何 stdio 函数都会拉入 vsscanf。

见https://github.com/hchunhui/dietlibc/blob/master/Makefile:

LIBSTDIOOBJ=$(patsubst libstdio/%.c,$(OBJDIR)/%.o,$(wildcard libstdio/*.c))

DIETLIBC_OBJ = $(OBJDIR)/unified.o \
$(SYSCALLOBJ) $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \
$(LIBCRUFTOBJ) $(LIBCRYPTOBJ) $(LIBSHELLOBJ) $(LIBREGEXOBJ) \
$(OBJDIR)/__longjmp.o $(OBJDIR)/setjmp.o \

$(OBJDIR)/dietlibc.a: $(DIETLIBC_OBJ) $(OBJDIR)/start.o
    $(CROSS)ar cru $@ $(DIETLIBC_OBJ)

并注意 vsscanf 在 libstdio 目录中。

我个人会尝试将 scanf 和 printf 函数放在单独的目标文件中,因为它们太大了。我还看到一些库附带了两个版本的 scanf 和 printf,其中一个不支持浮点只是为了减小代码大小。但是,按照他们的做法可能有充分的理由。

避免拉入所有 stdio 的唯一方法是不使用任何一个 - 使用文件描述符函数(打开而不是 fopen,读取而不是 getc)。

【讨论】:

  • 我知道我的 scanf 库函数没有添加。我追溯了 fflush call 生成的链接警告。但问题依然存在
  • 我看到 fflush 库也警告要占用 7k 的空间,但它似乎不需要 scanf。
  • 我刚刚查看了dietlib 源代码。 vsscanf 是 libstdio.o 对象模块的一部分。这意味着如果您使用任何 stdio 函数,那么您还将获得 scanf 包括在内。这不一定是我自己会做的事情,但这就是发生的事情。避免它的唯一方法是不使用任何 stdio 的东西。库是目标文件的集合。链接器将任何需要的目标文件添加到您的程序中。因为 vscanf 包含在 Dietlib 的 libstdio.o 中,所以您使用的任何 stdio 函数都会拉入 vsscanf。
  • 这是由于dietlibc的静态链接,因为dietlibc中不允许动态链接
  • 根据您之前关于“开发板”的评论,我假设您正在对嵌入式计算机进行编程。动态链接通常甚至通常不可用。我不是dietlib 方面的专家——这是我第一次遇到它——自述文件只提到了静态链接,但那个makefile 似乎也创建了一个动态库。
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
相关资源
最近更新 更多