~/Code Archive by Genarch_
0x01.md TECHNICAL ARTICLE

~/archive/entries / 0x01

0x01 初步认识C语言的运行

1 从加法开始

#include <stdio.h>

int add(int a, int b)
{
    int result = a + b;
    return result;
}

int main(void)
{
    int x = 10;
    int y = 20;
    int sum = add(x, y);

    printf("%d\n", sum);
    return 0;
}

一个平平无奇的C程序,我们今天从中开始拆解。

首先安装gcc、g++。如果有不懂的可以参考其他教程。

之后开始编译:

gcc -O0 -g -fno-omit-frame-pointer hello.c -o hello

其中字段的含义:

  • -O0:关闭优化,原样输出汇编
  • -g:加入调试信息
  • -fno-omit-frame-pointer: 保留栈帧

随后运行

./hello

随之而来的输出就是:

x = 10
y = 20
sum = 30

恭喜你,你已经在Linux上成功编译了一个C语言程序!

之后我们需要知道另一个指令file

file hello

运行这个指令,你大概率会得到

hello: ELF 64-bit LSB pie executable, x86-64 ...

这里有几个词你可能不清楚,一一告诉你:

  • ELF:Linux系统下的可执行文件,类似Win下的pe文件
  • LSB:小端序
  • PIE:程序加载地址可以随机化

2 汇编化

现在进入转为汇编语言:

sudo apt install objdump
objdump -d -M intel hello | less

intel代表这是intel架构的CPU
好的,我们可以看到进入一个奇怪的编辑界面了,其实这和vi差不多,接下来输入

/add>:

你可能会看到:

push   rbp
mov    rbp,rsp
mov    DWORD PTR [rbp-0x14],edi
mov    DWORD PTR [rbp-0x18],esi
mov    edx,DWORD PTR [rbp-0x14]
mov    eax,DWORD PTR [rbp-0x18]
add    eax,edx
mov    DWORD PTR [rbp-0x4],eax
mov    eax,DWORD PTR [rbp-0x4]
pop    rbp
ret
  • push:push
  • mov:move
  • add:add

先知道这三个最基础的汇编指令。

随后输入q退出输入界面。

好的,我们先不深入讲解C语言的汇编,先说下一个章节。

3 GDB

(未完待续)

DISCUSSION.LOG

No comments yet

new_comment.json