生成机器码
1、编写代码。
mul.c
int mul(int a, int b)
{
return a * b;
}
2、编译程序。
gcc -c mul.c -o mul.o
3、提取机器码。
objdump -j .text -d mul.o
输出
mul.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <mul>:
0: f3 0f 1e fa endbr64
4: 55 push %rbp
5: 48 89 e5 mov %rsp,%rbp
8: 89 7d fc mov %edi,-0x4(%rbp)
b: 89 75 f8 mov %esi,-0x8(%rbp)
e: 8b 45 fc mov -0x4(%rbp),%eax
11: 0f af 45 f8 imul -0x8(%rbp),%eax
15: 5d pop %rbp
16: c3 ret
执行机器码
1、编写代码。
test.c
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
int main()
{
static char code[] = {
0xf3, 0x0f, 0x1e, 0xfa, // endbr64
0x55, // push %rbp
0x48, 0x89, 0xe5, // mov %rsp,%rbp
0x89, 0x7d, 0xfc, // mov %edi,-0x4(%rbp)
0x89, 0x75, 0xf8, // mov %esi,-0x8(%rbp)
0x8b, 0x45, 0xfc, // mov -0x4(%rbp),%eax
0x0f, 0xaf, 0x45, 0xf8, // imul -0x8(%rbp),%eax
0x5d, // pop %rbp
0xc3 // ret
};
void *mem = mmap(NULL, sizeof(code), PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
memcpy(mem, code, sizeof(code));
int (*fn)() = mem;
printf("14*2=%d\n", fn(14, 2));
munmap(mem, sizeof(code));
}
2、编译并执行。
gcc test.c -o test
./test
输出结果
14*2=28