Day.4深入理解连结之Object file

目标文件格式 (Object file)

  • 可重定位目标文件 (Relocatable Object File)
    • 这类文件包含了二进制程序码和数据,其形式可以再编一时与其他可重新店为目标文件合并起来,建立一个可执行的目标文件
  • 可执行目标文件 (Executable Object File)
    • 包含二进制程序码和数据,其形式可以直接复制到记忆体并执行
  • 共享的目标文件 (Shared Object File)
    • 一种特殊类型的可重定位目标文件,可在执行时期动态连结并载入到主记忆体,也可在载入到记忆体时期,才动态连结此档案

可执行目标文件格式

一个程序码Source code档案被Compile後,会依照指令和资料部份分开存到Obj File上不同的Section中。

  • ELF head

Section 介绍

  • .text, .bss, .data 是一般编译器之预设记忆体区段名称, linker script 会安排实际的记忆体位址给各个区段.
  • .text 为唯读区段, 包含 Const string,及Arm 指令程序(程序码),安置於ROM
  • .data 为可读写区段, 放置初值不为 0 的变数 (安置於 RAM中)
    • RAM的内容会在断电、或是系统重置後消失,Reset的程序需从ROM取得data初值(Copy from ROM to RAM)
  • .bss 为可读写区段, 放置初值为 0 的变数. Reset的程序.bss 区段会被清为 0
  • stack 为堆叠区 一般是呼叫函数时的作业区 (返回位址暂存, 传递参数, 区域变数和返回值之储存区), heap 为堆积区 是呼叫 malloc() 时取得记忆区块的来源.
  • symtal 一个符号表,它存放在程序中定义和引用函数和全域变数的讯息
  • .rel.text 当Linker 把目标文件和其他文件组合时,需要修改那些 text 的位置(Relocation),可执行文件中并不需要重新为讯息,因此通常会省略
  • rel.date 被程序块引用或定义的所有全域变数的 Relocation 讯息
  • .debug 一个除错符号表 只有以 -g 选项调用编译器驱动程序时,才会有这个 section
  • .strtab 字串表
  • .dynamic 动态连结讯息

    其他Section(还有很多未被列出)

可执行目标文件与可重定位目标文件的有甚麽差别 ?

  • 多了 .init section 与 .fini section其中 .init 节中定义了一个 _init 函数,用於可执行目标文件执行初始化工作。.fini 包含程序终止要执行的指令
  • 少了 .rel.text 和 .rel.data 节等重定位讯息

‎整个档有两个重要的段‎

‎唯读程序码段:(ELF header + .init .fini 节 + .text 节 + .rodata 节 )‎
‎可读写数据段:(.data 节 + .bss 节),由於在执行档时这两个段必须分配空间所以又可以叫做‎‎可装入段‎

参考资料

程序设计师的自我修养


<<:  DAY17 MongoDB Replication 观念

>>:  【PHP Telegram Bot】Day08 - 官方范例程序

Day 2 [Python ML] 基础资料处理

前言 在这系列文章中,我会使用Azure来运行所有的程序,如何使用Azure的文章在这里 这边则是使...

Day-22 更加灵活的神经网路,我们可以做哪些变化

今天我们来还债 XDD,还之前跳过的很多解释,还有如何更加灵活的调整神经网路 那就让我们一步一步来...

Day 30 KubeEdge的使用心得与总结

KubeEdge 使用心得 KubeEdge的使用导向应是以"云边协同"、&qu...

那些被忽略但很好用的 Web API / 前言

Web API -- Application Programming Interface for ...

[Day 17]独自一人的全端攻略(後端篇)

挑战目标: MockNative Camp 今天来自定义Spring ExceptionHandle...