当前位置: 首页 > news >正文

编译-链接过程备忘录

目录

1. 静态库(.a / .lib)—— 不是链接器生成的

2. 动态库(.so / .dylib / .dll)—— 由链接器生成

3. 可执行文件(app / exe)—— 由链接器生成

4.动态库内部藏着两张“符号表”

5,为什么 strip“通常”没事?(以及“有事”的例外)


1. 静态库(.a / .lib)—— 不是链接器生成的

  • 生成工具归档器(ar),而不是链接器(ld)。

  • 过程:编译器先把源码编译成目标文件(.o / .obj),然后ar命令把这些 .o 文件打包成一个静态库文件。这一步只是“打包”,不进行符号解析和重定位(即没有“连接”过程)。

  • 命令ar rcs libmylib.a file1.o file2.o

2. 动态库(.so / .dylib / .dll)—— 由链接器生成

  • 生成工具链接器(ld),带上特殊参数(如-shared-dynamiclib)。

  • 过程:链接器将多个 .o 文件或依赖的静态库进行部分链接。它会解析内部符号,但会故意保留外部依赖符号为“未定义”,生成一个可重定位且位置无关(PIC)的共享对象文件。

  • 命令gcc -shared -o libmylib.so file1.o file2.o(后台实际调用 ld)

3. 可执行文件(app / exe)—— 由链接器生成

  • 生成工具链接器(ld),默认模式。

  • 过程:链接器将所有 .o 文件、静态库(复制代码)、动态库(登记导入表)进行完整链接。这一步会把所有静态符号的地址固定下来(或留作重定位),生成操作系统可以直接加载运行的文件格式(ELF / PE / Mach-O)。

  • 命令gcc -o myapp main.o -lmylib(后台调用 ld)

直观变换流程:

  1. 源码编译.c/.cpp——(编译器 cc1plus)——>.o目标文件(二进制机器码,但地址是乱的)

  2. 打包成静态库.o文件们——(ar 归档器)——>.a静态库(相当于一个 .o 的压缩包,没有链接

  3. 链接生成动态库.o/.a——(ld 链接器 + -shared)——>.so动态库(半链接状态,保留外部跳转钩子)

  4. 链接生成可执行文件.o/.a/.so——(ld 链接器,默认)——>app可执行文件(全链接状态,具备运行入口)


4.动态库内部藏着两张“符号表”

  • 第一张:动态符号表(.dynsym——这是命根子

    • 这张表记录了对外公开的函数名(比如int add(int a, int b))。

    • 作用:当你的可执行文件或其他库要调用这个库时,动态链接器就靠这张表里的名字去查找地址。如果这张表没了,外部程序就找不到入口,加载时会直接报错“undefined symbol”

  • 第二张:调试符号表(.symtab+ 行号信息)——这是说明书

    • 这张表记录了变量名、源码文件名、代码在第几行、甚至函数参数名。

    • 作用:仅用于 GDB 调试、反汇编时看函数名、或者崩溃时打印堆栈。运行时完全不需要它


5,为什么 strip“通常”没事?(以及“有事”的例外)

  • 标准 strip 行为(Linux):大多数 Linux 上的strip命令默认只删除调试符号表(第二张),而保留动态符号表(第一张)。所以你在 Linux 上直接strip libxxx.so,库能正常跑,因为命根子还在。这叫“安全瘦身”。

http://www.jsqmd.com/news/1400240/

相关文章:

  • Path of Building流放之路离线Build规划工具终极指南:10分钟从零跑通天赋树与伤害计算
  • JSON 翻译实战:jsontt 让多语言文件转换从一小时变成三分钟
  • 网盘直链下载助手从零上手:60秒解锁8大网盘的真实下载地址
  • Playnite游戏库管理器实战:把Steam、Epic和模拟器游戏整合到一个界面
  • Dynamic Wallpaper 新手实战:半小时让 Linux 壁纸按时间自动切换
  • Swift Distributed Actors源码解析:核心架构与关键算法
  • 告别几十KB/s的龟速下载:trackerslist公共Tracker完整配置指南,三步让BT速度翻倍
  • 三步完成微信聊天记录导出:免费本地永久保存与年度报告完整指南
  • WeKnora向量数据库配置实战:从pgvector起步到Elasticsearch扩容的一套完整清单
  • 2026杭州地下室防潮装修一体化:防水修缮与装修防水一站式方案解析 - 晒太阳的龟
  • 择机出手杭州黄金首饰,收的顶实时更新黄金回收行情 - 日常前沿快讯
  • TCP/UDP 调试终极指南:用免费的 Sokit 完成收发与数据转发
  • 深圳旅游出行服务行业如何借助GEO抢占AI搜索入口?本地靠谱服务商与代理加盟推荐 - 企业新闻快传
  • Template7高级技巧:掌握js_if与js helper实现动态数据处理
  • GEO 优化需要搭建什么内容?装修建材人如何抢占 AI 流量入口 - 装企自媒体训练营辉哥
  • GodotFirebase本地模拟器配置指南:无需联网开发Firebase功能
  • 没有Mac也能轻松搞定macOS系统下载:gibMacOS免费工具全攻略
  • 河北邯郸斗式提升机漏料怎么办 - 推客
  • 停车王车牌键盘版本更新日志:最新功能与优化全记录
  • Minetest Game保姆级上手指南:6步从安装到建起第一座基地
  • Mac 安装 Office 终极指南:用 Microsoft-Office-For-MacOS 从零到一完成安装激活
  • 上海美妆个护行业GEO服务商代理加盟怎么选?2026年本地靠谱推荐与避坑指南 - 子柔传媒
  • 2026年国内高密橡塑皮鞋底代工 适配多场景采购需求参考 - 滚动商讯
  • 2026年廊坊电力工程电缆阻燃涂料商贸公司挑选攻略 三月春等企业实测梳理 - 小范同学a
  • 2026年广东建筑机电安装二级资质代办公司名单:专业实力与高效服务深度解析 - 卓企推荐
  • 深圳机械设备行业GEO服务商代理加盟怎么选?本地靠谱推荐指南 - 科技快讯
  • 线上专业吧台椅工厂的实际运营数据具体都有哪些? - 阿雨生活聊家具
  • Tullio.jl与TensorOperations集成:梯度计算的最佳实践
  • Playlistor部署教程:3步搭建属于自己的音乐播放列表转换服务
  • 三步搞定微信公众号数据采集:用 Python 高效抓取公众号文章与账号信息