Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc何时生成函数的指令_Gcc_Assembly_Compilation_Arm - Fatal编程技术网

gcc何时生成函数的指令

gcc何时生成函数的指令,gcc,assembly,compilation,arm,Gcc,Assembly,Compilation,Arm,我最近遇到了一个SEGV_映射器故障,由故障addr 0xfffffab8引起。但是没有明确调用此地址的地方。因此,我使用arm linux AndroidAbi objdump转储了So库,并在函数中找到了一些地方,如: 000a42f8 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()>: a42f8: 4b08

我最近遇到了一个SEGV_映射器故障,由故障addr 0xfffffab8引起。但是没有明确调用此地址的地方。因此,我使用arm linux AndroidAbi objdump转储了So库,并在函数中找到了一些地方,如:

000a42f8 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()>:
   a42f8:       4b08            ldr     r3, [pc, #32]   ; (a431c <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()+0x24>)
   a42fa:       4a09            ldr     r2, [pc, #36]   ; (a4320 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()+0x28>)
   a42fc:       447b            add     r3, pc
   a42fe:       b510            push    {r4, lr}
   a4300:       4604            mov     r4, r0
   a4302:       589a            ldr     r2, [r3, r2]
   a4304:       4907            ldr     r1, [pc, #28]   ; (a4324 <std::__1::basic_ostream<char, std::__1::char_traits<char> >::~basic_ostream()+0x2c>)
   a4306:       320c            adds    r2, #12
   a4308:       6022            str     r2, [r4, #0]
   a430a:       585b            ldr     r3, [r3, r1]
   a430c:       f103 0108       add.w   r1, r3, #8
   a4310:       f840 1f04       str.w   r1, [r0, #4]!
   a4314:       f7c3 ee80       blx     68018 <std::__1::ios_base::~ios_base()@plt>
   a4318:       4620            mov     r0, r4
   a431a:       bd10            pop     {r4, pc}
   a431c:       7758            strb    r0, [r3, #29]
   a431e:       0024            movs    r4, r4
   a4320:       fabc ffff                       ; <UNDEFINED> instruction: 0xfabcffff
   a4324:       fab8 ffff                       ; <UNDEFINED> instruction: 0xfab8ffff

显然,这个问题是由访问这些未定义的指令引起的。所以我的问题是,为什么gcc会生成这些未定义的指令,以及何时访问这些指令?它是否像编译器生成的某种保护?谢谢大家。

通常这些说明根本不是说明;它们要么是函数使用的内联数据,要么只是编译器或链接器发出的填充,以保持函数/方法地址正确对齐。不管怎样,它们永远不会被执行,除非你在某个地方有一个坏的跳转,比如函数指针


注意——在您的例子中,它们都是内联数据类型;检查在a42f8、a42fa和a4304上进行的PC相关访问。

通常这些指令根本不是指令;它们要么是函数使用的内联数据,要么只是编译器或链接器发出的填充,以保持函数/方法地址正确对齐。不管怎样,它们永远不会被执行,除非你在某个地方有一个坏的跳转,比如函数指针


注意——在您的例子中,它们都是内联数据类型;检查在a42f8、a42fa和a4304上进行的PC相关访问。

但为什么在a42fa行有一条指令会显式地将这些指令加载到寄存器r2?它不是加载指令,而是加载数据。您的反汇编程序只是碰巧反汇编了数据,就好像它是一条指令一样。不是,真的。为什么不让它成为一个立即操作数,给出一个固定值呢?@BillRanderson,许多ARM指令的立即数限制为8位加一个移位;此函数中的值将无法满足该限制。无论如何,这正是编译器所选择的。这段代码似乎是Thumb2,它对立即数有更多的限制。但为什么在a42fa行有一条指令会显式加载这些指令以注册r2?它不是加载指令,而是加载数据。您的反汇编程序只是碰巧反汇编了数据,就好像它是一条指令一样。不是,真的。为什么不让它成为一个立即操作数,给出一个固定值呢?@BillRanderson,许多ARM指令的立即数限制为8位加一个移位;此函数中的值将无法满足该限制。不管怎样,这正是编译器选择要做的。这段代码似乎是Thumb2,它对立即数有更多的限制。