C语言——程序运行时数据结构

2023-11-06

运行时的数据结构


  • 目标文件和可执行文件有几种不同格式,在大多数Svr4实现中采用一种叫做ELF(原意位”可扩展链接器格式“、现在代表
    ”可执行文件和链接格式“)。其他系统中可执行文件格式是COFF(普通目标文件格式)。
  • 所有不同格式具有一个共同概念”段(segments)“。就目标文件而言它们是二进制文件中简单的区域,里面保存了某种特
    定类型(如符号表条目)相关信息。术语section是ELF文件中最小组织单位,一个段包含几个section

此处的段和x86架构里的段不同:

在UNIX中,段表示一个二进制文件相关的内容块;
在x86架构中,地址空间并非一个整体,而是分成一些64K大小的区域,称为段

  • 当一个可执行文件中运行size命令时,会告诉你这个文件中的三个段(文本段text、数据段data、bss段)的大小。检查
    可执行文件的另一个方法是使用nm或dump工具(详见segments_information):
    BBS(Block Started Symbol由符号开始的块)段只保存没有值的变量,所以它并不需保存这些变量的映像。运行时所需
    的BSS段的大小记录在目标文件中,但BSS段(不像其他段)并不占据目标文件的任何空间。

  • 数据段(data):存放初始化后的全局变量和静态变量(局部变量并不进入.out文件,它们在运行时创建)。

    文本段(text):存放可执行文件的指令(一般使用mmap()系统调用)。

.out

                                             进程的地址空间
                                             最高内存地址
                                       ________________________
                                      |         堆栈段          |  栈:局部变量、临时数据、传递到函数的参数等
                                      |           |            |  堆:malloc().
        a.out                         |           |            |  过程活动记录
 ______________________               |          |/           |
|    a.out神奇数字      |              .          空洞           .
|______________________|              .                        .
|    a.out其他内容      |              .                        .
|                      |              |________________________|
|______________________|              |          BBS           |  未初始化的数据
|    BSS段所需的大小     |--------------|________________________|
|______________________|              |          data          |   
|    data数据段:        |              |                        |  经过初始化的数据
|    经过初始化的全局变量 |--------------|                        |
|    还还有静态变        |              |                        |
|                      |              |                        |  
|______________________|              |________________________|
|    text文本段:        |--------------|       text             |  指令 
|    可执行文件指令      |              |                        |
|                      |              |________________________|
|______________________|              |_______未映射区域_________|  捕捉使用空指针和小整型值的指针引用内存情况                     

函数调用:过程活动记录

 活动记录:
 ______________________
|       局部变量        | 
|______________________|
|        参数           |
|----------------------|
|       静态链接        | (用于上层引用,C中不使用)
|______________________|
|   指向先前结构的指针    | 
|----------------------|
|       返回地址        | (前一个活动记录的地址)
|______________________|

static关键字

  • 对堆栈怎样实现函数调用的描述页同样解释了为何不能从函数中返回一个指向该函数局部自动变量的指针。

    char * favorite_fruit ()
    {
    char deciduous[] = "apple";
    return deciduous;
    }

    当进入该函数时,自动变量deciduous在堆栈中分配。函数结束后,变量不复存在,它所占用的堆栈空间被回收,且随时可能被覆盖。
    这样指针就失去了有效性(引用不存在的东西)被称为”悬垂指针“————它们并不引用有用的东西,而是悬在地址空间。如果想返回一个
    指向在函数内部定义的变量的指针时,要把那个变量声明为static。这样就能保证该变量被保存在数据段而不是堆栈中,该变量的
    生命周期和该程序一样长,定义该变量的函数退出时,该变量的值依然保持。函数下次进入时该值依然有效。

setjmp和longjmp等C语言小工具(备注)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言——程序运行时数据结构 的相关文章

随机推荐

  • python root:code for hash md5 was not found.错误

    可能还会伴随一大堆其他错误 ERROR root code for hash md5 was not found Traceback most recent call last File usr local Cellar python 2
  • qt 怎么检测鼠标在不在某个控件上

    方式一 推荐 感觉这种事件过滤器的方法捕捉比较敏感 记得安装事件过滤器 this gt installEventFilter this protected bool eventFilter QObject obj QEvent event
  • k8s 配置 glusterFS 动态供给

    部署环境 Host IP k8s 版本 glusterFS版本 heketi版本 heketi client 版本 k8s master1 192 168 10 1 1 20 0 9 5 1 el7 heketi 8 0 0 1 heket
  • 短 URL 服务的设计与实现

    转载 https mp weixin qq com s DJM7KFFfgZ2AgfrrYHXSzQ 短url的好处有 短 短信和许多平台 微博 有字数限制 太长的链接加进去都没有办法写正文了 好看 比起一大堆不知所以的参数 短链接更加简洁
  • 如何查看端口是被哪个程序占用的

    一 开始 gt 运行 gt cmd 或者是window R组合键 调出命令窗口 二 输入命令 netstat ano 列出所有端口的情况 在列表中我们观察被占用的端口 比如是8080 首先找到它 三 查看被占用端口对应的PID 输入命令 n
  • C语言中输入输出重定,freopen()妙用。

    使用的理由 范围 如果输入数据很庞大 需要一次又一次的重新输入和调试时可采用本函数 freopen 函数 1 格式 FILE freopen const char filename const char mode FILE stream 2
  • window如何实时刷新日志文件

    1 安装windows git 下载地址 Git Downloading Package git scm com 2 打开git bash 输入tail exe f 日志文件路径
  • 19-Openwrt双固件升级

    在上一章节 Openwrt sysupgrade系统升级 中 我们描述了sysupgrade升级系统的过程 这种升级过程会直接firmware分区进行写入 无法保证系统的安全性 只要在写入过程突然断电就会出现系统写入失败 升级失败无法启动系
  • xml文件c语言读取函数,IDL读取XML文件

    使用IDL读取RADARSAT 2的数据 需要用到lutSigma xml文件中的定标常数来计算相关参量 本文需要提取lutSigma xml中的offset和gains参数 使用IDL来读取xml文件 并且提取特定的节点下的参数 经过实验
  • fifo复位问题

    一次笔者在调试K7和5EV模块通信时候遇到fifo状态异常问题 K7现象 full和empty均拉高 5EV现象 empty拉高 full拉低 但是写信号已经产生 问题原因 fifo的复位来的太早 而随路时钟来的太晚导致 因为fifo的写时
  • Host is not allowed to connect to this MySQL server解决方法

    先说说这个错误 其实就是我们的MySQL不允许远程登录 所以远程登录失败了 解决方法如下 在装有MySQL的机器上登录MySQL mysql u root p密码 执行use mysql 执行update user set host whe
  • 服务器内存型号2400,S26361-F3934-E511 8GB 1Rx4 PC4-2400 RX2540M2服务器内存

    S26361 F3934 E511 8GB 1Rx4 DDR4 PC4 2400 ECC Primergy CX2550M2 TX2560M2 RX2510M2 RX2530M2 RX2540M2 RX2560M2富士通服务器内存A3C40
  • nginx配置访问springboot服务

    一 idea中可通过 clean package打包命令 打好包 比如 端口为8080 服务访问地址为 前端打包文件为dist 访端口为8000 则可以这样配置nginx server listen 8000 location root h
  • OpenSSL在QT中的使用

    现在需要把OpenSSL集成到QT里面 本来是想直接把Cygwin的动态库和头文件直接拿来用的 没想到链接的时候报了一票错误 那好吧 重新自己build一个 这样来的也干净些 到官网上下载源码 根据里面的INSTALL W32一步步来 首先
  • 分类(6):不平衡和多分类问题

    原版 http www jianshu com p 15185f0ecb57 一 不平衡问题 1 不平衡数据 例如 一个产品生产的不合格产品数量会远低于合格产品数量 信用卡欺诈的检测中 合法交易远远多于欺诈交易 这时候 准确率的度量会出现一
  • windows安装pnpm后报错:pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    使用 npm 方式 安装pnpm 命令如下 npm install g pnpm 安装完以后 执行pnpm v 查看版本号 pnpm v 执行完 发现报错 pnpm 无法将 pnpm 项识别为 cmdlet 函数 脚本文件或可运行程序的名称
  • 服务器被攻击了怎么办

    今天德迅云安全的我给大家讲讲服务器被攻击的那些事 首页给大家讲讲我一客户的亲身经历 我有个客户开设了电商平台 最近几年电商平台俨然已经成了老百姓的生活依赖 淘宝 京东 所以我这客户的小平台发展得也还不错 直到之前那段时间日子他遇上了大麻烦
  • 61 openEuler 22.03-LTS 搭建MySQL数据库服务器-管理数据库用户

    文章目录 61 openEuler 22 03 LTS 搭建MySQL数据库服务器 管理数据库用户 61 1 创建用户 示例 61 2 查看用户 示例 61 3 修改用户 61 3 1 修改用户名 61 3 2 修改用户示例 61 3 3
  • Java虚拟机的类加载机制

    Java虚拟机的类加载机制 Java虚拟机在程序执行过程中会动态加载类 所谓类的加载指的是将一个Class文件描述的Class对象加载到JVM中 形成一个Class对象的过程 这里 Class对象 更通用的指的是一个二进制字节流 并不一定以
  • C语言——程序运行时数据结构

    运行时的数据结构 段 目标文件和可执行文件有几种不同格式 在大多数Svr4实现中采用一种叫做ELF 原意位 可扩展链接器格式 现在代表 可执行文件和链接格式 其他系统中可执行文件格式是COFF 普通目标文件格式 所有不同格式具有一个共同概念