pwn学习笔记(二)

源文件到可执行文件的过程

#include<stdio.h>
int main(){

    printf("hello,world!");
    return 0;
} 

在这里插入图片描述

gcc -S -o test.s test.c 编译生成汇编文件test.s

(只编译,不汇编,不链接)
在这里插入图片描述

内容
在这里插入图片描述

汇编文件变成目标文件

gcc -c -o test.o test.s (编译且汇编,但不链接)

在这里插入图片描述
.o文件已经是01码了,但cat方式查看会转换成ASCII码
在这里插入图片描述

目标文件变成可执行文件(动态链接)

gcc -o test test.o
要是静态链接 则:gcc -static -o test test.o
在这里插入图片描述

在这里插入图片描述
通过编译器把.c文件变成汇编代码,再通过汇编器把.s文件翻译成.o文件(gcc可充当编译器和汇编器)。最后链接形成可执行性文件。
最后一步为什么要链接?

int main(){
	printf("hello,world!");
	reutrn 0;
}

int main和return 0是可以被识别翻译成机器码的,但是printf函数不是可以被识别的关键字。printf被写好编译在libc里,我们直接调用libc库用就可以。如果直接运行.o文件不链接的话,是缺省printf函数的。只有链接才知道printf函数实现在了哪里。以上所说的是动态链接的情况,静态链接也是如此,不链接就找不到函数在哪。
在这里插入图片描述
动态链接是在装载这一步可见的,需要哪个函数就会进行调用,在链接这一步只是知道需要的函数所实现的位置在哪。
静态链接在链接这一步就已经把所有需要的函数全部装载到elf文件中了。

windows和LINUX下的可执行性文件

在这里插入图片描述

ELF

在这里插入图片描述

在这里插入图片描述

elf文件从磁盘装载到内存

在这里插入图片描述
磁盘上的节可分为两大部分,可读可写的节有.data,.bss,.got.plt。 可读可执行的节有.rodata,.text,.init。当elf从磁盘被装载到内存上时,会根据这两大部分变成data段和code段。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值