程序员的自我修养(三)

前言

本节主要介绍目标文件的格式,由于我主要是在Linux开发,所以关注Linux操作系统中的目标文件格式。在Linux中,目标文件的主要格式为ELF(Executable Linkable Format)格式。

ELF文件类型 说明 实例
可重定位文件(Relocatable File) 这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可归为这一类 Linux的.o
可执行文件(Executable File) 这类文件包含了可以直接执行的程序,它的代表就是ELF可执行文件,他们一般都没有扩展名 比如/bin/bash文件
共享目标文件(Shared Object File) 这种文件包含了代码和数据,可以在以下两种情况下使用。一种是链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件,第二种是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映射的一部分来运行 Linux的.so,如/lib/glibc-2.5.so
核心转储文件(Core Dump File) 当进程意外终止时,系统可以将该进程的地址空间的内容及终止时的一些其他信息转储到核心转储文件 Linux下的core dump

我们在Linux下使用file命令来查看相应的文件格式。可以使用以下命令查看ELF文件段信息:

bash 复制代码
objdump -h SimpleSection.o

打印的第二行会显示各个段的属性CONTENTS表示该段在文件中存在,我们可以看到.bss段是没有CONTENTS属性的,表示它在ELF文件中不存在。.note.GNU-stack虽然有CONTENTS但是它的长度为0。

使用objdump,参数-s表示打印各个段的详细内容,-d表示所有包含指令的段反汇编,所以结合起来就是:

bash 复制代码
objdump -s -d SimpleSection.o

还可以使用objdump -x打印各个段的详细内容。具体打印内容就需要详细熟悉了。

还有一个objcopy命令可以将一些文件作为目标文件中的一个段。比如我们有一个文件叫"image.jpg",那么我们想把它作为一个段放在目标文件中可以使用以下命令:

bash 复制代码
objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o
objdump -ht image.o

我们还可以指定段放置变量和函数,在gcc中可以这么做:

cpp 复制代码
__attribute__((section("FOO"))) int global = 42;
__attribute__((section("BAR"))) void foo(){}

那么这个全局变量和函数就会分别被放到FOO段和BAR段中。

(未完待续...)

相关推荐
间歇性努力持续性发呆的野生快乐选手2 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
旖旎夜光2 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
乐观勇敢坚强的老彭4 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
我变成萤火虫4 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
buhuizhiyuci5 小时前
【Linux 篇】数字世界的水流蓄水池 —— IO 缓冲区机制深度实战解析
linux·运维·服务器·c++
liulilittle5 小时前
LLM 推理引擎与内核系统工程原理
c++·ai·llm·内存·memory·core·kernel
啦啦啦啦啦zzzz5 小时前
moduo网络库 Acceptor TcpConnection
服务器·网络·c++·reactor·网络库
键盘会跳舞5 小时前
C++:右值引用与移动语义源码级深度拆解——现代C++性能优化的语言基石
c++·右值引用·移动语义
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的虚函数和多态
java·c++·面试
lidtao6 小时前
青少年信息学奥赛C++四阶段学习路线(L1-L4完整体系)
c++·学习·软件工程·教培资源分享