linux非法指令错误,c-使用-mpopcnt编译会导致非法指令错误

我编译以下C代码

// main.cpp

#include

int main() {

unsigned char tab[4] = {0};

printf("%d\n", __builtin_popcount(*((int *)tab)));

}

使用命令行:

g++ -o prog main.cpp -mpopcnt

运行程序时出现错误:

Illegal instruction

不使用-mpopcnt进行编译不会产生错误(仅显示0).

问题:是什么原因导致此错误?

我正在同一台计算机上编译并运行该程序.

Valgrind没有发现任何问题.跑步

valgrind --leak-check=full ./prog

==12917== Memcheck, a memory error detector

==12917== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.

==12917== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info

==12917== Command: ./prog

==12917==

0

==12917==

==12917== HEAP SUMMARY:

==12917== in use at exit: 0 bytes in 0 blocks

==12917== total heap usage: 0 allocs, 0 frees, 0 bytes allocated

==12917==

==12917== All heap blocks were freed -- no leaks are possible

==12917==

==12917== For counts of detected and suppressed errors, rerun with: -v

==12917== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

下面,我给出一些系统规格.

我正在使用Ubuntu 12.04.跑步

uname -a

给我

Linux wtu-82 3.2.0-65-generic #99-Ubuntu SMP Fri Jul 4 21:03:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

跑步

g++ -v

Using built-in specs.

COLLECT_GCC=g++

COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper

Target: x86_64-linux-gnu

Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.4-1ubuntu1~12.04' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu

Thread model: posix

gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)

输出

cat /proc/cpuinfo

processor : 0

vendor_id : GenuineIntel

cpu family : 6

model : 23

model name : Intel(R) Core(TM)2 Duo CPU E8500 @ 3.16GHz

stepping : 10

microcode : 0xa0c

cpu MHz : 2000.000

cache size : 6144 KB

physical id : 0

siblings : 2

core id : 0

cpu cores : 2

apicid : 0

initial apicid : 0

fpu : yes

fpu_exception : yes

cpuid level : 13

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority

bogomips : 6317.48

clflush size : 64

cache_alignment : 64

address sizes : 36 bits physical, 48 bits virtual

power management:

processor : 1

vendor_id : GenuineIntel

cpu family : 6

model : 23

model name : Intel(R) Core(TM)2 Duo CPU E8500 @ 3.16GHz

stepping : 10

microcode : 0xa0c

cpu MHz : 2000.000

cache size : 6144 KB

physical id : 0

siblings : 2

core id : 1

cpu cores : 2

apicid : 1

initial apicid : 1

fpu : yes

fpu_exception : yes

cpuid level : 13

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm tpr_shadow vnmi flexpriority

bogomips : 6317.38

clflush size : 64

cache_alignment : 64

address sizes : 36 bits physical, 48 bits virtual

power management:

解决方法:

POPCNT在SSE 4.2中引入.您的处理器是SSE 4.1.因此,该指令完全丢失了.当使用-mpopcnt强制编译器使用处理器不知道的指令生成代码时,会出现非法指令错误.

标签:g,linux,c-4

来源: https://codeday.me/bug/20191120/2045661.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值