C++ 了解并排除SIGILL故障

C++ 了解并排除SIGILL故障,c++,arm,illegal-instruction,C++,Arm,Illegal Instruction,我已经为erlang构建了rocksdb的副本(gitlab.com/Vagabond1/erlang)-rocksdb@8708fe8)对于基于armv7的目标。这是一个iMX6 SoloX处理器,以下是cpuinfo: processor : 0 model name : ARMv7 Processor rev 10 (v7l) BogoMIPS : 7.54 Features : half thumb fastmult vfp edsp n

我已经为erlang构建了rocksdb的副本(gitlab.com/Vagabond1/erlang)-rocksdb@8708fe8)对于基于armv7的目标。这是一个iMX6 SoloX处理器,以下是cpuinfo:

processor       : 0
model name      : ARMv7 Processor rev 10 (v7l)
BogoMIPS        : 7.54
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x2
CPU part        : 0xc09
CPU revision    : 10

Hardware        : Freescale i.MX6 SoloX (Device Tree)
Revision        : 0500
我有一个程序加载编译后的
liberocksdb。因此
但是它崩溃了,出现了一个SIGILL,下面是回溯:

#0  0xb1b2a7b0 in std::__detail::_Mod_range_hashing::operator()(unsigned int, unsigned int) const () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#1  0xb1b79b48 in std::__detail::_Hash_code_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, std::__detail::_Select1st, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, true>::_M_bucket_index(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int) const () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#2  0xb1b751d4 in std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_bucket_index(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int) const ()
   from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#3  0xb1b6e01c in std::pair<std::__detail::_Node_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, false, true>, bool> std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_insert<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> const&, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, true> > > >(std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> const&, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, true> > > const&, std::integral_constant<bool, true>) () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#4  0xb1b63edc in std::__detail::_Insert_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::insert(std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> const&) ()
   from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#5  0xb1b568b8 in std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_Hashtable<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> const*>(std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> const*, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> const*, unsigned int, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__detail::_Mod_range_hashing const&, std::__detail::_Default_ranged_hash const&, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::__detail::_Select1st const&, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> > const&) () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#6  0xb1b489fc in std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_Hashtable(std::initializer_list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, unsigned int, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> > const&) () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#7  0xb1b3c10c in std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, rocksdb::OptionsSanityCheckLevel, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> > >::unordered_map(std::initializer_list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> >, unsigned int, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, rocksdb::OptionsSanityCheckLevel> > const&) () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#8  0xb1b28b04 in __static_initialization_and_destruction_0 () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#9  0xb1b29d30 in _GLOBAL__sub_I_db_impl.cc () from /opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so
#10 0xb6fddff8 in ?? () from /lib/ld-linux-armhf.so.3
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
标准中的0 0xb1b2a7b0::u详细信息::_Mod_range_hashing::operator()(unsigned int,unsigned int)const(),来自/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so #标准中的1 0xb1b79b48::uu详细信息::Hash_code_base::M_bucket_index(标准::uuuCxx11::basic_Stringconst&,unsigned int,unsigned int)const()来自/opt/miner/lib/rocksdb-1.5.0/priv/libertocksdb.so #2 0xb1b751d4,标准格式::_哈希表::_M_bucket_索引(标准格式::_cxx11::基本字符串常量和,无符号整数)常量() from/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so #std::pair std::_哈希表::_M_插入(std::pair const&,std:_详细信息::_allocodeconst&,std::integral_constant)from/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so #标准中的4 0xb1b63edc::uu详细信息::u Insert_ubase::Insert(标准::成对常数&)() from/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so #5 0xb1b568b8在标准中::(哈希表:):)哈希表(标准::成对常数*,标准::成对常数*,无符号整数,标准::哈希常数和,标准:)详细信息:)范围散列常数和,标准:)详细信息:(默认范围散列常数和,标准::等于常数和,标准:)详细信息:(从/opt/miner/lib/rocksdb-1.5/privock #std::_哈希表::_哈希表(std::initializer_list,unsigned int,std::hash const&,std::equal_to const&,std::allocator const&)()from/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so #7 0xb1b3c10c在std::无序映射::无序映射(std::初始值设定项列表,无符号int,std::散列常量&,std::等于常量&,std::分配器常量&(),来自/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so #来自/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so的8 0xb1b28b04英寸静态初始化和销毁 #来自/opt/miner/lib/rocksdb-1.5.0/priv/liberocksdb.so的9 0xb1b29d30 in_GLOBAL___sub_I_db_impl.cc() #10 0xb6fddff8英寸??()来自/lib/ld linux armhf.so.3 反向跟踪停止:上一帧与此帧相同(堆栈损坏?) 以下是拆解:

(gdb) disas /m
Dump of assembler code for function _ZNKSt8__detail18_Mod_range_hashingclEjj:
   0xb1b2a790 <+0>:     push    {r11}           ; (str r11, [sp, #-4]!)
   0xb1b2a794 <+4>:     add     r11, sp, #0
   0xb1b2a798 <+8>:     sub     sp, sp, #20
   0xb1b2a79c <+12>:    str     r0, [r11, #-8]
   0xb1b2a7a0 <+16>:    str     r1, [r11, #-12]
   0xb1b2a7a4 <+20>:    str     r2, [r11, #-16]
   0xb1b2a7a8 <+24>:    ldr     r3, [r11, #-12]
   0xb1b2a7ac <+28>:    ldr     r2, [r11, #-16]
=> 0xb1b2a7b0 <+32>:    udiv    r2, r3, r2
   0xb1b2a7b4 <+36>:    ldr     r1, [r11, #-16]
   0xb1b2a7b8 <+40>:    mul     r2, r1, r2
   0xb1b2a7bc <+44>:    sub     r3, r3, r2
   0xb1b2a7c0 <+48>:    mov     r0, r3
   0xb1b2a7c4 <+52>:    add     sp, r11, #0
   0xb1b2a7c8 <+56>:    pop     {r11}           ; (ldr r11, [sp], #4)
   0xb1b2a7cc <+60>:    bx      lr
End of assembler dump.
(gdb)disas/m
函数_ZNKSt8___detail18_Mod_range_hashingclEjj的汇编程序代码转储:
0xb1b2a790:推{r11};(str r11,[sp,#-4]!)
0xb1b2a794:添加r11,sp,#0
0xb1b2a798:子sp,sp,#20
0xb1b2a79c:str r0,[r11,#-8]
0xb1b2a7a0:str r1[r11,#-12]
0xb1b2a7a4:str r2[r11,#-16]
0xb1b2a7a8:ldr r3[r11,#-12]
0xb1b2a7ac:ldr r2[r11,#-16]
=>0xb1b2a7b0:udiv r2、r3、r2
0xb1b2a7b4:ldr r1[r11,#-16]
0xb1b2a7b8:mul r2、r1、r2
0xb1b2a7bc:子r3、r3、r2
0xb1b2a7c0:mov r0,r3
0xb1b2a7c4:添加sp、r11和#0
0xb1b2a7c8:pop{r11};(ldr r11,[sp],#4)
0xb1b2a7cc:bx lr
汇编程序转储结束。
我不是这方面的专家,但据我所知,程序崩溃是因为指令
udiv
对我的CPU是非法的。 我查过ARM开发者网站,这是一个,我相信我的CPU是,所以我想它应该有这个指令

也许我的分析是错误的,这是另一回事

我的交叉编译是使用该CPU和rootfs的交叉工具链进行的,其中包含了一些参数,如
-march=armv7-a-marm-mfpu=neon-mfloat abi=hard
,这些参数应该提供兼容的二进制文件


谢谢

cmake脚本强制使用了与我的CPU不兼容的
-march=armv8-a+crc


cmake脚本强制使用与我的CPU不兼容的
-march=armv8-a+crc


你提出问题的方式让我很困惑。i.MX 6SoloX是一个多核系统,带有Cortex®-A9(不是Cortex®-A7)和Cortex®-M4。因此,任何使用
-march=armv7-a-marm-mfpu=neon-mfloat abi=hard
编译的程序都只能在Cortex®-A9上执行,而使用
-march=armv7-m-mtune=Cortex-m4
编译的程序只能在Cortex®-m4上执行。这里的编译器选项/程序/核心可能不匹配。我已经达到了我的知识极限。在执行程序时,如何选取核心?这是否意味着Linux在A9上运行该程序,并试图运行为M4设计的指令?如何让程序在M4上运行?生成此信号的代码不是我的,它来自rocksdb依赖项。也许Linux本身只在A9上运行?那么M4是如何使用的呢?我知道我的问题不是很明确,但我正在努力使这个程序在我的目标上运行,我不是设计它的人,我对CPU、指令和交叉编译几乎没有经验。这几乎100%确定Linux只在Cortex-A9上运行。你的目标是什么?运行Linux应用程序的CortexA9?我想是这样的,但是你能说得更清楚一点吗?NXP确实提供了软件支持,可以在Cortex-M4上执行FreeRTOS应用程序。你必须参考NXP文档了解更多关于如何解决问题的细节。你提出问题的方式让我感到困惑。i.MX 6SoloX是一个多核系统,带有Cortex®-A9(不是Cortex®-A7)和Cortex®-M4。因此,任何使用
-march=armv7-a-marm-mfpu=neon-mfloat abi=hard
编译的程序都只能在Cortex®-A9上执行,而使用
-march=armv7-m-mtune=Cortex-m4
编译的程序只能在Cortex®-m4上执行。这里的编译器选项/程序/核心可能不匹配。我已经达到了我的知识极限。在执行程序时,如何选取核心?这是否意味着Linux运行了这个程序