You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

amd64汇编函数内存加载调用失败问题排查

内存加载执行汇编代码时的段错误问题

我正在编写一个小型JIT编译器,需要将生成的代码加载到内存并执行。目前编译器输出了一段仅用于相加第2和第3个参数的函数汇编代码:

push %rbp
mov %rsp, %rbp
sub $44, %rsp
movl %esi, -4(%rbp)
movl %edx, -8(%rbp)
#     return a+b
movl -4(%rbp), %esi
movl -8(%rbp), %r11d
addl %r11d, %esi
movl %esi, %eax
leave
ret

我将这段汇编保存为subfunction.S,通过as -o subfunction.o subfunction.S编译为目标文件,随后尝试用以下C代码加载到内存并执行:

#include <stdio.h>
#include <sys/mman.h>

typedef int (*fun_pointer)(int, int, int);

int main(){
    FILE *f = fopen("subfunction.o", "r");

  if (f)
  {
    fseek(f, 0, SEEK_END);
    int length = ftell(f);
    fseek(f, 0, SEEK_SET);
    char *memory = mmap(NULL,   // address
                        length+10, // size
                        PROT_READ | PROT_WRITE | PROT_EXEC,
                        MAP_PRIVATE | MAP_ANONYMOUS,
                        -1, // fd (not used here)
                        0); // offset (not used here)
    if (memory)
    {
      fread(memory, 1, length, f);
      fclose(f);
      fun_pointer function = memory;
      int res = function(0,1,2);
      printf("RESULT: %d", res);
      fflush(stdout);
    }
  }
}

注:我的汇编代码无外部链接依赖。但执行时出现段错误,我猜测as的编译步骤不适合生成可直接在内存执行的二进制数据,尝试用ld链接后加载仍失败。另外,将sub $44, %rsp改为sub 44, %rsp(该写法无意义,44会被解析为内存地址)后无段错误但无正确返回值,怀疑是对齐问题?

内容的提问来源于stack exchange,提问作者lorenzw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:16:08