ARM64函数调用流程分析

这篇具有很好参考价值的文章主要介绍了ARM64函数调用流程分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARM64 程序调用标准

1 ARM64 函数调用实例

下图是介绍一个简单函数调用的示例,在该示例中简单介绍了栈的使用。
ARM64函数调用流程分析,arm64,ARM64函数调用流程分析,AAPCS,栈帧使用

2 对应代码的分析

2.1 main函数及其对应的汇编程序

2.1.1 main的C代码实现

int main(void)
{
        long a = 1;                                                                             
        long b = 2;

        printf("The current function is %s a:%ld b:%ld\r\n", __func__, a, b); 

        test_fun_a(a, b, 0, 1); 

        a = a + b;
        b = a + b;

        return 0;
}

2.1.2 main函数对应汇编及其分析

  • 0000000000000114 <main>:main函数的入口
  • 114: a9be7bfd stp x29, x30, [sp, #-32]! 将sp = sp - 32,为main函数开一个32Byte的栈空间,然后将x29(FP),X30(LR)寄存器的值存放在SP和SP + 8的位置处。
  • 118: 910003fd mov x29, sp 将SP寄存器的值存放到X29(FP)寄存器中,即FP寄存器指向当前main函数的栈顶。
  • 11c: d2800020 mov x0, #0x1 // #1 将局部变量a的值保存到x0寄存器中
  • 120: f9000be0 str x0, [sp, #16] 将局部变量a的值保存到sp + 16的位置处。
  • 124: d2800040 mov x0, #0x2 // #2 将局部变量b的值保存到x0寄存器中
  • 128: f9000fe0 str x0, [sp, #24] 将局部变量b的值保存到sp + 24栈内存处
  • 12c: f9400fe3 ldr x3, [sp, #24] 从栈中加载局部变量b的值到x3寄存器中
  • 130: f9400be2 ldr x2, [sp, #16]从栈中加载局部变量a的值到x2寄存器中
  • 134: 90000000 adrp x0, 0 <test_fun_b>加载test_func_b函数的地址到x0寄存器中
  • 138: 91000001 add x1, x0, #0x0将x0 + 0的值保存到x1寄存器中
  • 13c: 90000000 adrp x0, 0 <test_fun_b>加载test_func_b函数的地址到x0寄存器中
  • 140: 91000000 add x0, x0, #0x0将x0 + 0的值保存到x0寄存器中
  • 144: 94000000 bl 0 <printf>调用函数printf
  • 148: d2800023 mov x3, #0x1 // #1将1保存到x3寄存器中,作为调用test_fun_a函数的第4个参数
  • 14c: d2800002 mov x2, #0x0 // #0将0保存到寄存器x2中,作为调用test_fun_a函数的第3个参数
  • 150: f9400fe1 ldr x1, [sp, #24]从栈中取出局部变量b的值,放到x1寄存器中,作为调用test_fun_a的第2个参数
  • 154: f9400be0 ldr x0, [sp, #16]从栈中取出局部变量a的值,放到x0寄存器中,作为调用test_fun_a的第1个参数
  • 158: 94000000 bl 80 <test_fun_a>调用test_func_a函数,其参数分别为前面的x0 ~ x3寄存器的值
  • 15c: f9400be1 ldr x1, [sp, #16] 加载局部变量a的值到x1寄存器
  • 160: f9400fe0 ldr x0, [sp, #24]加载局部变量b的值到x0寄存器
  • 164: 8b000020 add x0, x1, x0 a = a + b
  • 168: f9000be0 str x0, [sp, #16] 将计算到的局部变量a的值重新存到栈中
  • 16c: f9400fe1 ldr x1, [sp, #24]从栈中取出局部变量b的值
  • 170: f9400be0 ldr x0, [sp, #16]从栈中取出局部变量a的值
  • 174: 8b000020 add x0, x1, x0 b = a + b
  • 178: f9000fe0 str x0, [sp, #24]将新计算得到的局部变量b的值重新保存到栈中
  • 17c: 52800000 mov w0, #0x0 // #0给w0寄存器赋值为0,该操作是用在ret指令执行时,返回0值。
  • 180: a8c27bfd ldp x29, x30, [sp], #32恢复x29(FP)和X30(LR)的值,同时SP = SP + 32
  • 184: d65f03c0 ret 返回调用的指令,该指令执行的时候会返回lr寄存器指向的函数中。
                                                                                             
0000000000000114 <main>:
 114:   a9be7bfd        stp     x29, x30, [sp, #-32]!
 118:   910003fd        mov     x29, sp
 11c:   d2800020        mov     x0, #0x1                        // #1
 120:   f9000be0        str     x0, [sp, #16]
 124:   d2800040        mov     x0, #0x2                        // #2
 128:   f9000fe0        str     x0, [sp, #24]
 12c:   f9400fe3        ldr     x3, [sp, #24]
 130:   f9400be2        ldr     x2, [sp, #16]
 134:   90000000        adrp    x0, 0 <test_fun_b>
 138:   91000001        add     x1, x0, #0x0
 13c:   90000000        adrp    x0, 0 <test_fun_b>
 140:   91000000        add     x0, x0, #0x0
 144:   94000000        bl      0 <printf>
 148:   d2800023        mov     x3, #0x1                        // #1
 14c:   d2800002        mov     x2, #0x0                        // #0
 150:   f9400fe1        ldr     x1, [sp, #24]
 154:   f9400be0        ldr     x0, [sp, #16]
 158:   94000000        bl      80 <test_fun_a>
 15c:   f9400be1        ldr     x1, [sp, #16]
 160:   f9400fe0        ldr     x0, [sp, #24]
 164:   8b000020        add     x0, x1, x0
 168:   f9000be0        str     x0, [sp, #16]
 16c:   f9400fe1        ldr     x1, [sp, #24]
 170:   f9400be0        ldr     x0, [sp, #16]
 174:   8b000020        add     x0, x1, x0
 178:   f9000fe0        str     x0, [sp, #24]
 17c:   52800000        mov     w0, #0x0                        // #0
 180:   a8c27bfd        ldp     x29, x30, [sp], #32
 184:   d65f03c0        ret

2.1.3 执行完成之后栈的存放情况

ARM64函数调用流程分析,arm64,ARM64函数调用流程分析,AAPCS,栈帧使用

2.2 test_fun_a函数及其对应的汇编程序

2.2.1 test_fun_a函数的C实现

void test_fun_a(long m, long n, long x, long y)
{
        long b = 2;
        long c = 3;

        printf("The current function is %s b:%ld c:%ld\r\n", __func__, b, c); 

        test_fun_b(b, c, 0, 2); 

        b = b + c + m;
        c = b + c + n;
}

2.2.2 test_fun_a函数对应汇编及其分析

  • 0000000000000080 <test_fun_a>:test_fun_a函数的入口
  • 80: a9bc7bfd stp x29, x30, [sp, #-64]!为test_fun_a函数开栈64B,同时把X29(FP),X30(LR)保存到栈顶sp和sp + 8的栈内存位置处
  • 84: 910003fd mov x29, sp将sp保存到x29(FP)寄存器中,相当于FP指向栈的栈顶
  • 88: f90017e0 str x0, [sp, #40]将参数1保存到栈的sp + 40栈内存位置处
  • 8c: f90013e1 str x1, [sp, #32]将参数2保存到栈sp + 32的栈内存位置处
  • 90: f9000fe2 str x2, [sp, #24]将参数3保存到栈sp + 24栈内存位置处
  • 94: f9000be3 str x3, [sp, #16]将参数4保存到栈sp + 16栈内存位置处
  • 98: d2800040 mov x0, #0x2 // #2将test_fun_a函数的局部变量b保存到x0寄存器中
  • 9c: f9001be0 str x0, [sp, #48]将test_fun_a函数的局部变量b保存到sp + 48栈内存位置处
  • a0: d2800060 mov x0, #0x3 // #3将test_fun_a函数的局部变量c保存到x1寄存器中
  • a4: f9001fe0 str x0, [sp, #56]将test_fun_a函数的局部变量c保存到栈sp + 56栈内存位置处
  • a8: f9401fe3 ldr x3, [sp, #56]从栈中取出局部变量c的值放到x3寄存器中
  • ac: f9401be2 ldr x2, [sp, #48]从栈中取出局部变量b的值放到x2寄存器中
  • b0: 90000000 adrp x0, 0 <test_fun_b>将test_fun_b函数的地址加载到x0寄存器中
  • b4: 91000001 add x1, x0, #0x0 x1 = x0 + 0,其中x0保存的是test_fun_b的起始地址
  • b8: 90000000 adrp x0, 0 <test_fun_b>将test_fun_b函数的地址加载到x0寄存器中
  • bc: 91000000 add x0, x0, #0x0 x0 = x0 + 0,其中x0保存的是test_fun_b的起始地址
  • c0: 94000000 bl 0 <printf>调用函数printf
  • c4: d2800043 mov x3, #0x2 // #2给x3寄存器赋值为2,作为test_fun_b的第4个参数
  • c8: d2800002 mov x2, #0x0 // #0给x2寄存器赋值为0,作为test_func_b的第三个参数
  • cc: f9401fe1 ldr x1, [sp, #56]从栈中取出局部变量c,存放到x1寄存器,作为test_fun_b的第二个参数
  • d0: f9401be0 ldr x0, [sp, #48]从栈中取出局部变量b,存放到x0寄存器,作为test_fun_b的第一个参数
  • d4: 94000000 bl 0 <test_fun_b>调用test_fun_b函数,x0 ~ x3作为test_fun_a的四个参数
  • d8: f9401be1 ldr x1, [sp, #48]从栈中取出test_fun_a的局部变量b,放到x1寄存器中
  • dc: f9401fe0 ldr x0, [sp, #56]从栈中取出test_fun_a的局部变量c,放到x0寄存器中
  • e0: 8b000020 add x0, x1, x0 c = b + c,将c的结果保存到x0寄存器中。
  • e4: f94017e1 ldr x1, [sp, #40]从栈中取出调用test_fun_a时传入的第1个参数取出,放到x1寄存器中
  • e8: 8b000020 add x0, x1, x0 c = c + m,将计算的结果放到x0寄存器中
  • ec: f9001be0 str x0, [sp, #48]将计算的结果x0的值重新保存到局部变量b的栈内存位置处
  • f0: f9401be1 ldr x1, [sp, #48]从栈中取出局部变量b的值放到x1寄存器中。
  • f4: f9401fe0 ldr x0, [sp, #56]从栈中取出局部变量x的值放到x0寄存器中
  • f8: 8b000020 add x0, x1, x0c = b + c
  • fc: f94013e1 ldr x1, [sp, #32]从栈中取出调用test_fun_a函数时传入的第2个参数放到x1寄存器中
  • 100: 8b000020 add x0, x1, x0 c = c + n,计算的结果放到x0寄存器中
  • 104: f9001fe0 str x0, [sp, #56]将计算的新值存放到原局部变量c的栈内存位置处
  • 108: d503201f nop空操作
  • 10c: a8c47bfd ldp x29, x30, [sp], #64恢复X29(FP),X30(LR)寄存器的值,同时sp = sp + 64栈指针寄存器
  • 110: d65f03c0 ret返回X30(LR)寄存器保存的返回函数处
0000000000000080 <test_fun_a>:
  80:   a9bc7bfd        stp     x29, x30, [sp, #-64]!
  84:   910003fd        mov     x29, sp 
  88:   f90017e0        str     x0, [sp, #40]
  8c:   f90013e1        str     x1, [sp, #32]
  90:   f9000fe2        str     x2, [sp, #24]
  94:   f9000be3        str     x3, [sp, #16]
  98:   d2800040        mov     x0, #0x2                        // #2   
  9c:   f9001be0        str     x0, [sp, #48]
  a0:   d2800060        mov     x0, #0x3                        // #3   
  a4:   f9001fe0        str     x0, [sp, #56]
  a8:   f9401fe3        ldr     x3, [sp, #56]
  ac:   f9401be2        ldr     x2, [sp, #48]
  b0:   90000000        adrp    x0, 0 <test_fun_b>
  b4:   91000001        add     x1, x0, #0x0
  b8:   90000000        adrp    x0, 0 <test_fun_b>
  bc:   91000000        add     x0, x0, #0x0
  c0:   94000000        bl      0 <printf>
  c4:   d2800043        mov     x3, #0x2                        // #2
  c8:   d2800002        mov     x2, #0x0                        // #0
  cc:   f9401fe1        ldr     x1, [sp, #56]
  d0:   f9401be0        ldr     x0, [sp, #48]                                                 
  d4:   94000000        bl      0 <test_fun_b>
  d8:   f9401be1        ldr     x1, [sp, #48]
  dc:   f9401fe0        ldr     x0, [sp, #56]
  e0:   8b000020        add     x0, x1, x0
  e4:   f94017e1        ldr     x1, [sp, #40]
  e8:   8b000020        add     x0, x1, x0
  ec:   f9001be0        str     x0, [sp, #48]
  f0:   f9401be1        ldr     x1, [sp, #48]
  f4:   f9401fe0        ldr     x0, [sp, #56]
  f8:   8b000020        add     x0, x1, x0
  fc:   f94013e1        ldr     x1, [sp, #32]
 100:   8b000020        add     x0, x1, x0
 104:   f9001fe0        str     x0, [sp, #56]
 108:   d503201f        nop
 10c:   a8c47bfd        ldp     x29, x30, [sp], #64
 110:   d65f03c0        ret

2.2.3 执行完成之后栈帧的使用情况

ARM64函数调用流程分析,arm64,ARM64函数调用流程分析,AAPCS,栈帧使用

2.3 test_fun_b函数及其对应的汇编程序

2.3.1 test_func_b函数的C实现

void test_fun_b(long m, long n, long x, long y)
{
        long c = 3;
        long d = 4;

        printf("The current function is %s c:%ld d:%ld\r\n", __func__, c, d); 

        c = c + d + m;
        d = c + d + n;
}

2.3.2 test_fun_b函数对应汇编及其分析

  • 0000000000000000 <test_fun_b>:test_fun_b函数的入口
  • 0: a9bc7bfd stp x29, x30, [sp, #-64]!为test_fun_b函数开栈64B,同时把X29(FP),X30(LR)保存到栈顶sp和sp + 8的栈内存位置处
  • 4: 910003fd mov x29, sp将sp保存到x29(FP)寄存器中,相当于FP指向栈的栈顶
  • 8: f90017e0 str x0, [sp, #40]将参数1保存到栈的sp + 40栈内存位置处
  • c: f90013e1 str x1, [sp, #32]将参数2保存到栈sp + 32的栈内存位置处
  • 10: f9000fe2 str x2, [sp, #24]将参数3保存到栈sp + 24栈内存位置处
  • 14: f9000be3 str x3, [sp, #16]将参数4保存到栈sp + 16栈内存位置处
  • 18: d2800060 mov x0, #0x3 // #3将test_fun_b函数的局部变量c保存到x0寄存器中
  • 1c: f9001be0 str x0, [sp, #48]将test_fun_b函数的局部变量c保存到sp + 48栈内存位置处
  • 20: d2800080 mov x0, #0x4 // #4将test_fun_b函数的局部变量d保存到x1寄存器中
  • 24: f9001fe0 str x0, [sp, #56]将test_fun_b函数的局部变量d保存到栈sp + 56栈内存位置处
  • 28: f9401fe3 ldr x3, [sp, #56]从栈中取出局部变量d的值放到x3寄存器中
  • 2c: f9401be2 ldr x2, [sp, #48]从栈中取出局部变量c的值放到x2寄存器中
  • 30: 90000000 adrp x0, 0 <test_fun_b>将test_fun_b函数的地址加载到x0寄存器中
  • 34: 91000001 add x1, x0, #0x0x1 = x0 + 0,其中x0保存的是test_fun_b的起始地址
  • 38: 90000000 adrp x0, 0 <test_fun_b>将test_fun_b函数的地址加载到x0寄存器中
  • 3c: 91000000 add x0, x0, #0x0x0 = x0 + 0,其中x0保存的是test_fun_b的起始地址
  • 40: 94000000 bl 0 <printf>调用函数printf
  • 44: f9401be1 ldr x1, [sp, #48]从栈中取出局部变量c,存放到x1寄存器
  • 48: f9401fe0 ldr x0, [sp, #56]从栈中取出局部变量d,存放到x0寄存器
  • 4c: 8b000020 add x0, x1, x0 d = c + d,将d的结果保存到x0寄存器中。
  • 50: f94017e1 ldr x1, [sp, #40]从栈中取出调用test_fun_b时传入的第1个参数取出,放到x1寄存器中
  • 54: 8b000020 add x0, x1, x0 d = d + m
  • 58: f9001be0 str x0, [sp, #48]将计算的结果x0的值重新保存到局部变量c的栈内存位置处
  • 5c: f9401be1 ldr x1, [sp, #48]从栈中取出局部变量c的值放到x1寄存器中。
  • 60: f9401fe0 ldr x0, [sp, #56]从栈中取出局部变量d的值放到x0寄存器中
  • 64: 8b000020 add x0, x1, x0 c = c + d
  • 68: f94013e1 ldr x1, [sp, #32]从栈中取出调用test_fun_b函数时传入的第2个参数放到x1寄存器中
  • 6c: 8b000020 add x0, x1, x0 c = c + n
  • 70: f9001fe0 str x0, [sp, #56]将计算的新值存放到原局部变量d的栈内存位置处
  • 74: d503201f nop空操作
  • 78: a8c47bfd ldp x29, x30, [sp], #64恢复X29(FP),X30(LR)寄存器的值,同时sp = sp + 64栈指针寄存器
  • 7c: d65f03c0 ret返回X30(LR)寄存器保存的返回函数处
0000000000000000 <test_fun_b>:
   0:   a9bc7bfd        stp     x29, x30, [sp, #-64]!
   4:   910003fd        mov     x29, sp
   8:   f90017e0        str     x0, [sp, #40]
   c:   f90013e1        str     x1, [sp, #32]
  10:   f9000fe2        str     x2, [sp, #24]
  14:   f9000be3        str     x3, [sp, #16]
  18:   d2800060        mov     x0, #0x3                        // #3
  1c:   f9001be0        str     x0, [sp, #48]
  20:   d2800080        mov     x0, #0x4                        // #4
  24:   f9001fe0        str     x0, [sp, #56]
  28:   f9401fe3        ldr     x3, [sp, #56]
  2c:   f9401be2        ldr     x2, [sp, #48]
  30:   90000000        adrp    x0, 0 <test_fun_b>                                            
  34:   91000001        add     x1, x0, #0x0
  38:   90000000        adrp    x0, 0 <test_fun_b>
  3c:   91000000        add     x0, x0, #0x0
  40:   94000000        bl      0 <printf>
  44:   f9401be1        ldr     x1, [sp, #48]
  48:   f9401fe0        ldr     x0, [sp, #56]
  4c:   8b000020        add     x0, x1, x0
  50:   f94017e1        ldr     x1, [sp, #40]
  54:   8b000020        add     x0, x1, x0
  58:   f9001be0        str     x0, [sp, #48]
  5c:   f9401be1        ldr     x1, [sp, #48]
  60:   f9401fe0        ldr     x0, [sp, #56]
  64:   8b000020        add     x0, x1, x0
  68:   f94013e1        ldr     x1, [sp, #32]
  6c:   8b000020        add     x0, x1, x0
  70:   f9001fe0        str     x0, [sp, #56]
  74:   d503201f        nop     
  78:   a8c47bfd        ldp     x29, x30, [sp], #64
  7c:   d65f03c0        ret

2.3.3 执行完成之后栈帧的使用情况

ARM64函数调用流程分析,arm64,ARM64函数调用流程分析,AAPCS,栈帧使用文章来源地址https://www.toymoban.com/news/detail-670264.html

到了这里,关于ARM64函数调用流程分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用 docker pull 拉取特定架构amd64、arm64、aarch64的容器镜像

    通过修改 dockerd 配置文件,并重载,可以在服务器上开启 dockerd 的实验属性。为配置文件 /etc/docker/daemon.json 添加 “experimental”: true。 修改后的配置文件看起来和下面的比较像: 修改完成后,使用以下命令重置服务: 在 docker pull 时指定参数,即可完成指定架构镜像的拉取。

    2024年02月11日
    浏览(62)
  • X86_64函数调用汇编程序分析

    %rdi, %rsi, %rdx, %rcx, %r8, %r9分别用于函数调用过程中的前6个参数,对于6的参数存放在栈中传递 %rsp用做栈指针寄存器,指向栈顶 %rbp用作栈框寄存器,指向栈底 %rax用做函数返回值的第一个寄存器 2.1.1 main的C代码实现 2.1.2 main函数对应汇编及其分析 这段汇编代码实现了一个简单的

    2024年02月09日
    浏览(42)
  • docker使用buildx构建多平台(x86,arm64)构架镜像

    docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx docker版本较低时,请升级docker版本 有部分docker未带有,比如arm版本,则需要单独下载文件: 重启docker 系统环境要求 如果版本较低,需要升级内核 安装binfmt,支持的平台 安装编译时需要支持的平台,这里选择所有 bin

    2024年02月02日
    浏览(75)
  • 使用QEMU(x86)模拟运行ARM64架构并进行内核调试

    在 x86 上使用 QEMU 虚拟机模拟并调试 ARM64。 参考:ubuntu虚拟机中使用QEMU搭建ARM64环境 主机 ubuntu 20.04, Linux 5.16.0 QEMU emulator version 7.2.92 (v8.0.0-rc2-23-gefcd0ec14b) :qemu-7.2.29 合适的ARM64内核源码:linux-4.14.221.tar.gz 安装交叉编译工具: sudo apt-get install gcc-aarch64-linux-gnu 命令安装以及源码

    2024年02月09日
    浏览(61)
  • 使用树莓派搭建K8S集群(ARM64架构,附安装脚本)

    为了能够更好的学习K8S,王道还是得自己动手 在虚拟机上玩K8S,没啥感觉。决定挑战自己,然后买了6个树莓派,在真实的硬件上从零开始搭建部署K8S。以下内容在自己的树莓派集群上经过充分验证,没毛病。成品如下图: 树莓派供电用的是带POE功能的交换机,每一个树莓派

    2024年02月06日
    浏览(77)
  • debian 11 arm64 aarch64 源码变异winehq arm64 笔记

    安装华为毕昇编译器 sudo apt install libc++1-13   编译tools cd tools su root export PATH=/opt/bisheng-compiler-1.3.3-aarch64-linux/bin:$PATH root@debian:/home/yeqiang/下载/src/wine/tools# ../configure CC=/opt/bisheng-compiler-1.3.3-aarch64-linux/bin/clang CXX=/opt/bisheng-compiler-1.3.3-aarch64-linux/bin/clang++ --host=aarch64-unknown-linux --wi

    2024年01月16日
    浏览(56)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(48)
  • 记录MacOS M1芯片(ARM64架构)使用docker-compose方式部署Kafka

    amd架构的镜像非常好找,但由于博主是arm64架构的机器,所以一些开发环境非常的难找,所以在这里记录一下arm64环境部署Kafka。 准备 docker-compose.yml 文件: 博主的虚拟机IP是192.168.153.131,注意替换你的服务器IP。 这个文件部署了zookeeper、kakfa以及kafkaUI 在docker-compose.yml目录下,

    2024年02月15日
    浏览(57)
  • mac m1芯片 pycharm使用etree报错:incompatible architecture(have ‘x86_64‘, need ‘arm64e‘)

    背景: 相同的代码,在同事mac电脑上运行正常,自己电脑会报错。自己电脑上的相关信息: mac m1 芯片,使用homebrew安装python3.9 pycharm配置虚拟环境,使用homebrew安装的python 运行 from lxml import etree报错: mach-o file, but is an incompatible architecture (have \\\'x86_64\\\', need \\\'arm64e\\\') [如图所示] 【

    2024年02月10日
    浏览(56)
  • electron 使用electron-packager打linux-x64包与linux-arm64包,解决打包缓慢问题

    使用electron-packager打linux-x64包与linux-arm64包,解决下载zip打包缓慢问题 在使用electron-packager打包的过程中,需要在第一次下载electron版本对应的zip文件,下载很缓慢,而且还可能出现每次都在下载zip的情况 解决思路是提前下载好zip文件并修改electron—packager源码将zip的路径指定到

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包