C-对GCC - 静态选项或其在虚拟机中的行为感到困惑



我写一个幼稚的C程序try.c

#include <stdlib.h>
int main() {return 0;}

然后,我尝试使用下面的shell脚本进行编译并运行它

CFLAGS='-Wpedantic -Wall -Wextra -Werror -std=c89'
gcc -o try  ${CFLAGS}  try.c -static
valgrind ./try -v --track-origins=yes

然后输出很混乱:

==16641== Memcheck, a memory error detector
==16641== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==16641== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==16641== Command: ./try -v --track-origins=yes
==16641== 
==16641== Conditional jump or move depends on uninitialised value(s)
==16641==    at 0x419349: _int_free (in  /home/su/ca/hw/1_try/try_static/trytrytry/try)
==16641==    by 0x41D296: free (in    /home/su/ca/hw/1_try/try_static/trytrytry/try)
==16641==    by 0x46CCAE: fillin_rpath (in /home/su/ca/hw/1_try/try_static/trytrytry/try)
==16641==    by 0x46D57A: _dl_init_paths (in /home/su/ca/hw/1_try/try_static/trytrytry/try)
==16641==    by 0x44282B: _dl_non_dynamic_init (in /home/su/ca/hw/1_try/try_static/trytrytry/try)
==16641==    by 0x443557: __libc_init_first (in /home/su/ca/hw/1_try/try_static/trytrytry/try)
==16641==    by 0x400B77: (below main) (in /home/su/ca/hw/1_try/try_static/trytrytry/try)

但是,如果我删除选项" - 静态",则一切都很好。我在Ubuntu 16.04(虚拟机)和Ubuntu 14.04(虚拟机)上尝试过它也许与虚拟机有关系?

此错误是呼叫堆栈的一部分,该错误默认情况下可能会抑制。抑制是特定于共享库的呼叫是(即libc)的一部分的共享库 - 因此,将您的程序构建为静态可执行文件可防止Valgrind识别它应该忽略此错误。

无论如何,此错误是LIBC初始化代码的内部错误,因此您应该忽略它。

最新更新