点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看嵌入式笔记!
在Linux下,我们经gcc编译之后生成的可执行文件属于ELF文件:
ELF是一类文件类型,而不是特指某一后缀的文件。ELF(Executable and Linkable Format,可执行与可链接格式
)文件格式,在Linux下主要有如下三种文件:
ELF格式可结构大致为:
(图片来源:百度百科)
ELF文件由4部分组成,分别是ELF头(ELF header)
、程序头表(Program header table)
、节(Section)
和节头表(Section header table)
。
实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。
在Linux下,我们可以使用readelf
命令工具可以查看ELF格式文件的一些信息。
下面我们先准备一个动态链接相关的demo,就拿我们之前分享的文章:静态链接与动态链接补充(Linux)中的demo来做演示:
文件1(main.c):
#include "test.h"
int main(void)
{
print_hello();
return 0;
}
文件2(test.c):
#include "test.h"
void print_hello(void)
{
printf("hello world\n");
}
文件3(test.h):
#ifndef __TEST_H
#define __TEST_H
#include <stdio.h>
void print_hello(void);
#endif
执行相关命令生成相关文件:.out文件
、.o文件
、.so文件
。如:
下面我们使用readelf
命令来查看这三类文件的一些信息。readelf命令格式为:
readelf <option(s)> elf-file(s)
查看可执行文件头部信息:
查看可执行文件头部信息是,我们发现这样一个问题,头部信息中的类型竟然是共享库文件,而我们查看的是可执行文件,自相矛盾?
查了一些资料:
https://blog.csdn.net/cclethe/article/details/83387685
发现:gcc编译默认加了--enable-default-pie
选项:
Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码–能像共享库一样可重分配地址的程序,这种程序必须连接到Scrt1.o。
标准的可执行程序需要固定的地址,并且只有被装载到这个地址时,程序才能正确执行。
PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。
引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。
类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小。
也就是说,pie这是一种保护我们可执行程序的一种手段。这里我们只是做实验,我们可以加-no-pie
参数先把pie给关掉:
可以看到,类型终于对得上了。ELF头部信息还包含有Entry point address(入口地址)、Start of program headers(程序头的起始字节)、Start of section headers(节头的起始字节)等信息。
查看可重定位文件头部信息:
查看共享目标文件头部信息:
同样的,readelf
搭配其它参数可以查看ELF文件的其它信息:
objdump工具用于显示一个或多个目标文件的信息。objdump命令格式:
objdump <option(s)> <file(s)>
可执行文件、可重定位文件与共享目标文件都属于目标文件,所以都可以使用这个命令来查看一些信息。
查看可重定位文件反汇编信息:
查看可执行文件反汇编信息:
查看共享目标文件反汇编信息:
以上就是本次的分享。简单地介绍了ELF文件的一些信息,同时介绍了分析ELF文件的两个工具。
ELF文件的内容很多,并且比较抽象,详细分析起来是个深坑。我们大致先进行一个简单的了解,之后如果深入学习时再做另外的分享。
以上就是本次的分享,如有错误,欢迎指出!谢谢
欢迎大家进群交流、共同进步。同时,我也会关注一些大家问的一些问题,从中挑选一些具有代表性的、并且在我知识范围内的问题写出相关文章做分享。
Linux下socket编程实例
Linux下应用开发基础
Linux下能编译成功,而Windows下编译不过?
【Linux笔记】Vi/Vim编辑器
C语言、嵌入式中几个非常实用的宏技巧
C语言、嵌入式应用:TCP通信实例分析
C语言、嵌入式重点知识:回调函数
C语言、嵌入式位操作精华技巧大汇总
玻璃钢生产厂家广州商业街玻璃钢雕塑生产厂家广东玻璃钢景观雕塑材料宁波户外景观玻璃钢雕塑江苏开业商场美陈怎么样商场巨型蛋糕模型美陈玻璃钢抽象不锈钢雕塑生产玻璃钢雕塑女商场如何 简单美陈肇庆玻璃钢卡通动物雕塑家居玻璃钢花盆广西玻璃钢雕塑出售玻璃钢雕塑算非遗商场美陈粉色云朵茂名玻璃钢花盆雕塑广东玻璃钢广场雕塑厂家十堰玻璃钢雕塑摆件多少钱驻马店玻璃钢雕塑厂家电话雕塑玻璃钢鹿块面图片户外玻璃钢雕塑联系方式邵阳玻璃钢雕塑价格玻璃钢雕塑冬奥会雕塑石膏玻璃钢陶瓷妇女节商场美陈布置湛江玻璃钢卡通雕塑经销商锻铜玻璃钢仿铜雕塑价格秦皇岛公园玻璃钢雕塑价格玻璃钢户外人物雕塑湖北仿铜玻璃钢雕塑安装乌鲁木齐玻璃钢雕塑价格表西安玻璃钢花盆香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万