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
相关产品推荐
相关产品推荐

