• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2026-04-02 20:20 Aet 隐藏边栏 |   抢沙发  2 
文章评分 1 次,平均分 5.0

二进制文件类型

概述

  1. Windows 有好几种不同的二进制格式
    1. PE/COFF 用于 .exe/.dll/.obj/.sys
    2. 独立的 .pdb 格式
    3. 独立的 .lib 格式
  2. Linux 几乎全部统一为 ELF 格式
    1. 可执行文件、共享库、目标文件、内核模块、core dump 全都是 ELF,只是 ELF 头里的类型字段不同

Windows → Linux 的完整映射

file 命令识别

各类型详细说明

  1. 可执行文件
    1. ≈ .exe
    2. 没有固定扩展名,靠文件权限中的 "x"(执行位)标识

  1. 共享库
    1. ≈ .dll
    2. 命名规则:lib<name>.so[.主版本.次版本.补丁版本]

  1. 静态库
    1. ≈ .lib 静态版本
    2. 命名规则:lib<name>.a
    3. 本质上就是一堆 .o 文件打包在一起的 ar 归档

  1. 目标文件
    1. ≈ .obj
    2. 编译器的输出,链接器的输入
    3. 包含机器码,但地址还没有确定(需要链接器重定位)

  1. 内核模块
    1. ≈ .sys
    2. Linux 内核驱动以 .koKernel Object)形式存在
    3. 本质也是 ELF relocatable 文件,但包含内核模块特有的 section

  1. Core Dump
    1. ≈ .dmp
    2. 进程崩溃时的内存快照,也是 ELF 格式

ELF 文件的内部结构

概述

  1. ELF(Executable and Linkable Format)是理解 Linux 二进制文件的核心

整体布局

Section vs Segment

查看 ELF 结构

可执行文件的具体区别

代码

.o 目标文件

.a 静态库

.so 共享库

可执行文件

加载过程详解

静态链接的可执行文件加载

动态链接的可执行文件加载

GOT/PLT 机制详解

其他

二进制之外的重要文件格式

链接器脚本

pkg-config(库的元信息)

compile_commands.json

进程的内存映射

问题

默认静态链接还是动态链接

  1. g++ main.o -L. -lmylib -o program 时,链接器会在 -L. 指定的目录下同时搜索 libmylib.solibmylib.a
    1. 关键在于两个文件是否同时存在:

  1. 真正控制静态/动态链接的方式

  1. 为什么默认优先动态链接

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享