当我在ARM中创建程序的asm文件时,GCC有时不会在函数本身中生成函数epilogue,而是创建一些标签,然后调用function epilogue的标签。这只发生在汇编代码中,然后稍后的链接器修复它。有没有强制汇编程序代码生成不将函数尾声放在标签中的.s文件?
stmfd sp!, {fp, lr} add fp, sp, #4 sub sp, sp, #32 str r0, [fp, #-32] ldr r3, .L19 sub ip, fp, #28 ldmia r3, {r0, r1, r2, r3} stmia ip, {r0, r1, r2, r3} mov r3, #0 str r3, [fp, #-8] b .L8 .L8: ldr r3, [fp, #-8] cmp r3, #3 bls .L17 mov r0, r0 @ nop .L17: ldr r3, [fp, #-8] mov r3, r3, asl #2 sub r2, fp, #4 add r3, r2, r3 ldr r3, [r3, #-24] ldr r1, .L19+4 mov r0, r3 bl fopen str r0, [fp, #-12] ldr r3, [fp, #-12] cmp r3, #0 bne .L9 ldr r3, [fp, #-8] mov r3, r3, asl #2 sub r2, fp, #4 add r3, r2, r3 ldr r3, [r3, #-24] mov r1, r3 ldr r0, .L19+8 bl printf b .L7 .L7: sub sp, fp, #4 @ sp needed ldmfd sp!, {fp, pc}
下面是functionx
的反汇编:
00010c88 <FunctionX>:
10c88: e92d4800 push {fp, lr}
10c8c: e28db004 add fp, sp, #4
10c90: e24dd028 sub sp, sp, #40 ; 0x28
10c94: e50b0028 str r0, [fp, #-40] ; 0xffffffd8
10c98: e59f3198 ldr r3, [pc, #408] ; 10e38 <FunctionX+0x1b0>
10c9c: e5933000 ldr r3, [r3]
10ca0: e50b3008 str r3, [fp, #-8]
10ca4: e59f3190 ldr r3, [pc, #400] ; 10e3c <FunctionX>
10ca8: e24bc018 sub ip, fp, #24
10cac: e893000f ldm r3, {r0, r1, r2, r3}
10cb0: e88c000f stm ip, {r0, r1, r2, r3}
10cb4: e3a03000 mov r3, #0
10cb8: e50b3020 str r3, [fp, #-32] ; 0xffffffe0
10cbc: ea000051 b 10e08 <FunctionX+0x180>
10cc0: e51b3020 ldr r3, [fp, #-32] ; 0xffffffe0
10cc4: e1a03103 lsl r3, r3, #2
10cc8: e24b2004 sub r2, fp, #4
10ccc: e0823003 add r3, r2, r3
10cd0: e5133014 ldr r3, [r3, #-20] ; 0xffffffec
10cd4: e59f1164 ldr r1, [pc, #356] ; 10e40 < FunctionX +0x1b8>
10cd8: e1a00003 mov r0, r3
10cdc: ebffff01 bl 108e8 <fopen@plt>
10ce0: e50b001c str r0, [fp, #-28] ; 0xffffffe4
10ce4: e51b301c ldr r3, [fp, #-28] ; 0xffffffe4
10ce8: e3530000 cmp r3, #0
10cec: 1a000008 bne 10d14 < FunctionX +0x8c>
10cf0: e51b3020 ldr r3, [fp, #-32] ; 0xffffffe0
10cf4: e1a03103 lsl r3, r3, #2
10cf8: e24b2004 sub r2, fp, #4
10cfc: e0823003 add r3, r2, r3
10d00: e5133014 ldr r3, [r3, #-20] ; 0xffffffec
10d04: e1a01003 mov r1, r3
10d08: e59f0134 ldr r0, [pc, #308] ; 10e44 < FunctionX +0x1bc>
10d0c: ebfffef2 bl 108dc <printf@plt>
10d10: ea000040 b 10e18 < FunctionX +0x190>
10d14: e51b001c ldr r0, [fp, #-28] ; 0xffffffe4
10d18: ebffff1c bl 10990 <fileno@plt>
10d1c: e1a03000 mov r3, r0
10d20: e3a01002 mov r1, #2
10d24: e1a00003 mov r0, r3
10d28: ebffff0c bl 10960 <flock@plt>
10d2c: e51b3020 ldr r3, [fp, #-32] ; 0xffffffe0
10d30: e3530003 cmp r3, #3
10d34: 979ff103 ldrls pc, [pc, r3, lsl #2]
10d38: ea000027 b 10ddc <FunctionX+0x154>
10d3c: 00010d4c .word 0x00010d4c
10d40: 00010d70 .word 0x00010d70
10d44: 00010d94 .word 0x00010d94
10d48: 00010db8 .word 0x00010db8
10d4c: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10d50: e5930010 ldr r0, [r3, #16]
10d54: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10d58: e5933000 ldr r3, [r3]
10d5c: e1a02003 mov r2, r3
10d60: e51b301c ldr r3, [fp, #-28] ; 0xffffffe4
10d64: e3a01001 mov r1, #1
10d68: ebfffeea bl 10918 <fwrite@plt>
10d6c: ea00001a b 10ddc < FunctionX+0x154>
10d70: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10d74: e5930014 ldr r0, [r3, #20]
10d78: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10d7c: e5933004 ldr r3, [r3, #4]
10d80: e1a02003 mov r2, r3
10d84: e51b301c ldr r3, [fp, #-28] ; 0xffffffe4
10d88: e3a01001 mov r1, #1
10d8c: ebfffee1 bl 10918 <fwrite@plt>
10d90: ea000011 b 10ddc < FunctionX+0x154>
10d94: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10d98: e5930018 ldr r0, [r3, #24]
10d9c: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10da0: e5933008 ldr r3, [r3, #8]
10da4: e1a02003 mov r2, r3
10da8: e51b301c ldr r3, [fp, #-28] ; 0xffffffe4
10dac: e3a01002 mov r1, #2
10db0: ebfffed8 bl 10918 <fwrite@plt>
10db4: ea000008 b 10ddc < FunctionX+0x154>
10db8: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10dbc: e593001c ldr r0, [r3, #28]
10dc0: e51b3028 ldr r3, [fp, #-40] ; 0xffffffd8
10dc4: e593300c ldr r3, [r3, #12]
10dc8: e1a02003 mov r2, r3
10dcc: e51b301c ldr r3, [fp, #-28] ; 0xffffffe4
10dd0: e3a01002 mov r1, #2
10dd4: ebfffecf bl 10918 <fwrite@plt>
10dd8: e1a00000 nop ; (mov r0, r0)
10ddc: e51b001c ldr r0, [fp, #-28] ; 0xffffffe4
10de0: ebfffeea bl 10990 <fileno@plt>
10de4: e1a03000 mov r3, r0
10de8: e3a01008 mov r1, #8
10dec: e1a00003 mov r0, r3
10df0: ebfffeda bl 10960 <flock@plt>
10df4: e51b001c ldr r0, [fp, #-28] ; 0xffffffe4
10df8: ebfffee7 bl 1099c <fclose@plt>
10dfc: e51b3020 ldr r3, [fp, #-32] ; 0xffffffe0
10e00: e2833001 add r3, r3, #1
10e04: e50b3020 str r3, [fp, #-32] ; 0xffffffe0
10e08: e51b3020 ldr r3, [fp, #-32] ; 0xffffffe0
10e0c: e3530003 cmp r3, #3
10e10: 9affffaa bls 10cc0 <FunctionX+0x38>
10e14: e1a00000 nop ; (mov r0, r0)
10e18: e59f3018 ldr r3, [pc, #24] ; 10e38 <FunctionX+0x1b0>
10e1c: e51b2008 ldr r2, [fp, #-8]
10e20: e5933000 ldr r3, [r3]
10e24: e1520003 cmp r2, r3
10e28: 0a000000 beq 10e30 <FunctionX+0x1a8>
10e2c: ebfffeb6 bl 1090c <__stack_chk_fail@plt>
10e30: e24bd004 sub sp, fp, #4
10e34: e8bd8800 pop {fp, pc}
10e38: 00022008 .word 0x00022008
10e3c: 000110f4 .word 0x000110f4
10e40: 00011098 .word 0x00011098
10e44: 0001109c .word 0x0001109c
正如您所看到的,L7
实际上是为functionx
保存函数尾声的那个。一旦我将代码编译成二进制,它将以正确的形式出现(函数结尾处的函数尾声),您可以在地址0x10E34处看到。但是,有没有可能在汇编代码中也具有相同的形式(当我使用-s
开关将源文件编译到asm时),并强制gcc不为函数尾声制作标签?
.l7
是本地标签。它是函数中分支的跳转目标。正如@Ross指出的,到.l7
的分支只是b
(跳转)指令,而不是bl
(调用)。
这些标签不是单独的函数,它们只是基本块。
问题内容: 在Java代码的标签中使用break语句时出现错误。这正在显示。编写这样的代码是错误的。请协助我正确使用它。提前致谢。 问题答案: 带标签的A 与声明不同。Java没有声明。 标签标记了其后的语句。您可以使用它来突破该语句,并且只能脱离该语句。流的控制权将始终转移到标记语句的末尾。 那你这里有什么? 由于if后的分号,实际上这是整个标记的语句。因此,您根本不在其范围内。如果您没有该分号
我想使用ArchUnit来强制使用SLF4J日志框架,避免使用简单的系统。out调用。此外,我希望避免使用任何其他日志框架。我该如何实施此类检查? 目前我写了这个测试 但它实际上并没有强制SLF4J的使用,只是限制的使用,并防止依赖于类(实际上常量所在的位置)。 是否是我的案例更优雅的解决方案?
问题内容: 因此,在相当庞大的项目中,您会得到一些遗留代码。您如何找到和删除无效功能? 我已经看到了这两个参考:查找未使用的代码和用于在php项目中查找未使用的函数的工具,但它们似乎分别特定于C#和PHP。 是否有Python工具可帮助您找到源代码中其他地方未引用的函数(尽管有反射/等)? 问题答案: 在Python中,您可以使用动态或静态代码分析器查找未使用的代码。动态分析器的两个示例是和。它们
关于使用强化代码注释的名称和语法,我有一个问题。 简短、简短、非常简短的版本是:我正在寻找一个指南/手册,它将列出可用的代码内注释,并为它们的预期用途提供一个示例。专门用于从Fortify扫描结果中省略一组“SQL注入”和“SQL注入:持久性”问题。 TL;博士;细节: 强化版:19.1.0 平台:Java 8;Web App(Weblogic 12.2.1.4.0(12c));Redhat Un
我试图使用Auth在我的Kohana应用程序中强制使用强(er)密码,方法是使用以下正则表达式要求至少一个大写字母、一个小写字母、一个数字、一个非字母数字(特殊字符)和至少8个字符。 正则表达式正在工作,正如在Rubular上可以看到的那样。这是我在Kohana的Model\u Auth\u User中使用的代码,它扩展了ORM。 但是,当创建一个新的用户帐户或更改现有帐户的密码时,这个正则表达式
问题内容: 我如何强制Spark执行对map的调用,即使它认为由于其惰性求值而无需执行该调用? 我已经尝试过使用map调用了,但是仍然不能解决问题。我的地图方法实际上将结果上传到HDFS。因此,它不是无用的,但Spark认为是。 问题答案: 简短答案: 要强制Spark执行转换,您需要要求一个结果。有时,一个简单的动作就足够了。 TL; DR: 好的,让我们回顾一下 操作。 支持两种类型的操作: