当前位置: 首页 > 知识库问答 >
问题:

如何强制gcc在asm代码的标签中不使用函数尾声

夏振国
2023-03-14

当我在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不为函数尾声制作标签?

共有1个答案

慕容坚
2023-03-14

.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: 好的,让我们回顾一下 操作。 支持两种类型的操作: