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

嵌入式八股C语言---文件,可执行文件的加载与运行篇

C语言文件操作

  • fopen
  • fseek
  • fread
  • fwrite
  • fclose

可执行文件

  • 可执行文件的格式
      在裸机环境下,得到的是HEX/BIN格式的文件,而使用操作系统时,操作的往往是ELF格式的文件
      BIN/HEX文件是纯指令文件,没有其他杂七杂八的辅助信息,BIN文件最纯粹,而HEX文件会有一些附加的信息比如校验什么的;而ELF文件除了基本的代码段、数据段,还有文件头、符号表、program header table等用来辅助程序运行的信息

  • 裸机环境下程序的运行
      在ARM架构下 bin文件的头部的第一个存放的是SP指针的值 第二个存放的是RestHandler的地址 这样的话一上电SP指针和PC指针得到了相关的值就知道怎么运行了,同时在进入main函数之前会有一个__main函数,__main函数解析了bin文件中关于ZI段,数据段等信息,并对相应的SRAM内存做了操作,比如分配堆/栈,清空ZI段,加载数据段等等

  • ELF的加载与运行
       ELF通过加载器加载到内存当中
    在这里插入图片描述

    .text段:代码段
    .bss段: 未初始化的全局变量(实际上此时只记录了符号 并没有分配内存,只有使用的时候才会加载)
    .data段: 初始化的全局变量
    .rodata段: 字符串/const修饰的常量
    .elf headler:记录了一些关键信息不可缺少

  • 可执行文件加载的过程
    如何把一个可执行文件转换为进程呢
    在这里插入图片描述

  • 静态链接
      静态链接就是在程序链接的过程中 就把引用的函数和变量编入可执行文件里面了 这样做的话会大大增加可执行文件的体积,并且假设多个文件都使用了printf 每个人一个副本的话也浪费内存,关键是C语言是以文件为基本单位的,所以实际上多的不止printf而是整个的xx.c文件

    • ar命令可以用来生成静态库
    • gcc -L -l用来指定链接的库
  • 动态链接
      动态链接就是为了解决静态链接的缺点而存在的 同样的动态链接有一个动态链接器。
      动态链接器通过解析ELF,做这样几件事

    1. 对动态链接库进行重定位:调整库内代码和数据的地址以适应实际加载地址的过程
    2. 对用到动态库的符号重定位(更新GOT表):(也不知道动态库被加载到哪里了 所以动态库加载完毕后,需要重新找然后告诉程序更新了)
    3. 然后再把控制权交给程序本身
      在这里插入图片描述
    • 与地址无关的代码与GOT表
        你不能每个进程都用printf就重新加载一遍动态链接库到对应进程,这不白操作了吗 我们希望的是虽然多个进程都是用了printf 但实际上printf的代码执被加载了一次,这个事情需要动态链接库和应用程序双方的努力。

      • 动态链接库:生成与地址无关的代码(比如偏移量靠绝对的)
      • 应用程序: GOT表 把使用动态链接库的符号都取出来,到时候动态库加载了就实时更新这个表
        在这里插入图片描述
    • 延迟绑定
      没有必要一次性把所有动态库都加载到内存,用到谁就加载谁

    • 模块的加载流程

      1. 初始化 init_module–放在特殊的section段
      2. 拷贝到内核 copy_from_user
      3. 地址空间分配
      4. 符号解析
      5. 重定位
      6. 执行

相关文章:

  • MySQL——基础知识
  • 【机器学习-基础知识】统计和贝叶斯推断
  • Flutter_学习记录_device_info_plus 插件获取设备信息
  • 12 | 给应用添加优雅关停功能
  • Webpack 优化深度解析:从构建性能到输出优化的全面指南
  • Vue项目上传到GitHub,vscode拉取vue项目更新后推送到GitHub上
  • vllm.LLM 的参数
  • Linux——进程初步
  • FI模块功能范围的基本概念、用途、配置介绍
  • java登神之阶之顺序表
  • SpringAI+Ollama+DeepSeek本地大模型调用
  • yolov8在昇腾芯片上的测试
  • ESP32-S3-WROOM-1-N16R8 微控制器,搭配 SI4732-A10-GSR 的收音机(源码+PCB+3D模型)
  • libpcap捕捉过滤wifi beacon包解析国标飞行器drone id报文
  • Machine Learning: 十大基本机器学习算法
  • vue3在ts中动态添加DOM(1、使用render函数,2、使用tsx)
  • 【抽奖项目】|第二篇
  • 环境配置 | 5分钟极简Git入门:从零上手版本控制
  • vb编程有哪些相关的IDE开发工具vb.net,Basic语言?
  • JVM常用概念之常量
  • 中国社科院:网文市场超430亿元,作者破3000万人
  • 江苏省委社会工作部部长等多人拟在省志愿服务联合会任职
  • 重庆大学通报本科生发14篇SCI论文处理结果
  • 报告:4月份新增发行的1763亿元专项债中,投向房地产相关领域约717亿元
  • 深圳两家会所涉卖淫嫖娼各被罚7万元逾期未缴,警方发催告书
  • 19岁女生注射头孢离世后续:院方道歉,医生停职,监管介入