首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C中计算一个模块的文本、rodata、data和bss大小?

在C语言中,可以通过使用编译器提供的工具来计算一个模块的文本、rodata、data和bss大小。以下是一种常见的方法:

  1. 使用编译器生成目标文件:首先,将源代码编译为目标文件。可以使用GCC编译器,并使用以下命令将源代码编译为目标文件:
  2. 使用编译器生成目标文件:首先,将源代码编译为目标文件。可以使用GCC编译器,并使用以下命令将源代码编译为目标文件:
  3. 使用size命令计算大小:接下来,使用size命令来计算目标文件中各个部分的大小。size命令可以显示目标文件中各个节(section)的大小。可以使用以下命令来计算目标文件的大小:
  4. 使用size命令计算大小:接下来,使用size命令来计算目标文件中各个部分的大小。size命令可以显示目标文件中各个节(section)的大小。可以使用以下命令来计算目标文件的大小:
  5. 这将输出目标文件中各个节的大小,包括文本(text)、只读数据(rodata)、已初始化数据(data)和未初始化数据(bss)。
  6. 例如,输出可能如下所示:
  7. 例如,输出可能如下所示:
  8. 在这个例子中,文本段大小为1000字节,已初始化数据段大小为400字节,未初始化数据段大小为20字节。
  9. 解释各个部分的含义:根据输出结果,可以解释各个部分的含义:
    • 文本(text):包含可执行代码的部分,即程序的指令。
    • 只读数据(rodata):包含只读的全局变量和常量。
    • 已初始化数据(data):包含已经初始化的全局变量和静态变量。
    • 未初始化数据(bss):包含未初始化的全局变量和静态变量。

通过计算模块的文本、rodata、data和bss大小,可以更好地了解模块的内存占用情况,优化代码和资源的使用。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云计算产品:https://cloud.tencent.com/product
  • 腾讯云云原生产品:https://cloud.tencent.com/solution/cloud-native
  • 腾讯云数据库产品:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器产品:https://cloud.tencent.com/product/cvm
  • 腾讯云安全产品:https://cloud.tencent.com/solution/security
  • 腾讯云人工智能产品:https://cloud.tencent.com/product/ai
  • 腾讯云物联网产品:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发产品:https://cloud.tencent.com/product/mad
  • 腾讯云存储产品:https://cloud.tencent.com/product/cos
  • 腾讯云区块链产品:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙产品:https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

变量究竟存储在什么地方?

pintfswitch语句中字符串常量值 .data 已初始化全局变量 .bss 未初始化全局变量 .symtab 符号表,存放在程序中被定义引用函数全局变量信息 .rel.text...当链接器吧这个目标文件其他文件结合时,.text节信息需修改 .rel.data模块定义引用任何全局变量信息 .debug 一个调试符号表。....line 原始C程序行号.text节机器指令之间映射 .strtab 一个字符串表,其内容包含.systab.debug节符号表 对于static类型变量,gcc编译器在.data...由该文件定义并能被其他模块引用全局符号。即非静态C函数非静态全局变量,程序a,z,swap。 2. 由其他模块定义并被该文件引用全局符号。用extern关键字所定义变量函数。...只被该文件定义引用本地符号。用static关键字定义函数变量。程序bc。 该程序所对应符号表如图所示: ?

1.7K10

C程序内存布局

作为计算机专业来说,程序入门基本都是从C语言开始,了解C程序内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍作用 。...C程序内存布局包含五个段,分别是STACK(栈段),HEAP(堆段),BSS(以符号开头块),DS(数据段)TEXT(文本段)。 每个段都有自己读取,写入可执行权限。...由内存管理函数(malloc、calloc、free等)管理堆区域,这些函数可以在内部使用brksbrk系统调用来调整其大小。 堆区域由进程所有共享库动态加载模块共享。...该段是一个只读段,用于防止程序被意外修改。 该段是可共享,因此对于文本编辑器等频繁执行程序,内存只需要一个副本。...数据块只读部分,通常除了const变量常量字符串外,程序文本部分(通常是.rodata段)也存在于数据块只读部分,因为通常无法通过程序进行修改。

3K61

9_重定位

9.4 C函数重定位data清除bss段 ​ 到目前为止我们已经通过汇编实现了重定位data清除bss段。为了让汇编程序更加简洁,这一节我们将通过C语言实现重定位data清除bss段。...@A 9.4.3 总结:如何在C函数中使用链接脚本变量 ​ 结合上面的例子,我们来总结一下如何在C函数中使用链接脚本定义变量 ​ 1....例如S3C2440 上电后,因为硬件限制,.bin文件前4k程序需要将整个程序重定位到大小能够执行整个程序SDRAM上。 ​...第9行第10行blx命令跳转到地址是一个相对地址(pc + offset),而不是绝对地址(0x9005c8)。在反汇编文件这样写,只是起到方便查看作用,并不是真的跳转。 ​...计算可得offset = 0x9005c8 + 8 – 0x900004 = 0x5cc,所以反汇编文件第二条指令(存放在0x80100004)实际上是跳转到地址0x801005c8执行copy_data

93210

扒一扒ELF文件

链接举例   在介绍ELF文件之前,我们先看下,一个.c程序是如何变成可执行目标文件。下面举个例子。   该程序由main.csum.c两个模块组成。...sum.c接收数组和数组长度两个参数,最后将数组求和结果返回。main.c调用sum函数,并传递一个两元素int数组array,将计算结果保存在val。...data.bss节会被装入读写数据段。 段头表能够描述可执行文件节与虚拟空间中存储段之间映射关系。一个表项32B,说明虚拟地址空间中一个连续片段或一个特殊节。...由此看出.bss节在文件不占用磁盘空间,但在存储器需要给它分配相应大小空间。 5.总结   1.链接处理涉及到三种目标文件格式:可重定位目标文件、可执行目标文件共享目标文件。...3.bss段在可执行目标文件不会有它空间,只有当可执行目标文件装载运行时,才会被分配内存(并且位于data段内存块之后),并且初始化为0。 本文参考《深入理解计算机系统》

68120

从零手写操作系统之RVOS内存管理模块简单实现-02

从零手写操作系统之RVOS内存管理模块简单实现-02 本系列参考: 学习开发一个RISC-V上操作系统 - 汪辰 - 2021春 整理而来,主要作为xv6操作系统学习一个前置基础。...*(.text) } .data : { *(.data) } .bss : { *(.bss) } /* 定义一个名为 _custom_symbol...你可以直接在汇编文件定义符号,并将其与链接器脚本符号绑定,而不依赖于C语言语法限制。这使得你可以更精确地控制符号位置、大小属性。 细粒度控制:汇编语言提供了更细粒度控制能力。...你可以直接使用汇编指令来定义变量、设置符号初始值,以及指定变量大小对齐方式。这使得你可以更好地适应特定需求,嵌入式系统内存布局对齐要求。...: 0x%x -> 0x%x\n", RODATA_START, RODATA_END); printf("DATA: 0x%x -> 0x%x\n", DATA_START, DATA_END)

17540

第013课 S3c2440代码重定位详解

.text 代码段 .data 数据段 rodata 只读数据段(const全局变量) bss段 (初始值为0,无初始值全局变量) commen 注释 其中bsscommen 注释不保存在bin...;//等于当前位置 *(.data) //等于数据段大小 data_end = ....段C函数实现 在前面,我们使用汇编程序来实现了重定位bss段,本节我们将使用C语言,实现重定位清除bss段。...解释一下原因: C函数,定义一个全局变量int g_i;,程序必然有4字节空间留出来给这个变量g_i。...结论: C程序不保存lds文件变量,lds再大也不影响; 借助symbol table保存lds变量,使用时加上”&”得到它值,链接脚本变量要在C程序声明为外部变量,任何类型都可以;

1.5K20

linux进程内存布局

一个程序本质上都是由 BSS 段、data段、text段三个组成。...这样概念在当前计算机程序设计是很重要一个基本概念,而且在嵌入式系统设计也非常重要,牵涉到嵌入式系统运行时内存大小分配,存储单元占用空间大小问题。...bss段包含程序未初始化全局变量static变量。data段包含三个部分:heap(堆)、stack(栈)和静态数据区。...BSS 段属于静态内存分配,即程序一开始就将其清零了。 比如,在C语言之类程序编译完成之后,已初始化全局变量保存在.data,未初始化全局变量保存在.bss。...图引自《C专家编程》 BSS段只保存没有值变量,所以事实上它并不需要保存这些变量映像。运行时所需要BSS大小记录在目标文件,但BSS段并不占据目标文件任何空间。 ?

3K41

C++学习总结2——C++内存模型

,虽然写得很不合理… 先给出C++内存一个模型图: ?...对于一个C++程序,内存区域分六个部分:依次是rodata区,text区,data区,bss区,heap区stack区。...其中rodatatext区在加载时会合并到一个,该段称为常量区,该区域内容只允许读,不允许修改; databss区在加载时合并到一个,该段被称为全局区,其中内容,对程序来说,是可读可写...每个区详细说明如下。 rodata rodata是read only data缩写,只读区域,像上面程序pi常量字符串”count % 10=””i=”都保存在该区域。...因为databss区中保存都是全局变量和静态局部变量(跟全局变量性质一致),所以在程序启动时,这两个区域又被放到一个叫做全局区箱子,这个箱子内容是可读可写

51710

apollo系列之apollo2 mcu开发(基础篇)之1.3-解析编译生成IARmap文件

查看全部教程开发请点击:apollo系列汇总 查看本文全部文章请点击:apollo系列之apollo2 mcu开发(基础篇)之1.3-解析编译生成IARmap文件 ===============...Section(段) Kind(种类) Address(地址) Size(大小) Object(编译后对象) 2..rodata:常量 3.text:代码段 4..bss:...BSS段(bss segment)通常是指用来存放程序未初始化或者初始值为0全局变量一块内存区域。...BSS是英文Block Started by Symbol简称。BSS段属于静态内存分配。...main,全局函数入口,地址0x504e1,存储在flash 2.Code Gb,代码段,全局函数 3.Code LC,局部函数 4.Data Lc,局部变量 5.Data Gb,全局变量

54910

嵌入式软件开发必知必会

BSS是英文Block Started by Symbol简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序已初始化全局变量一块内存区域。...全局未初始化变量存在于.bss,具体体现为一个占位符;全局已初始化变量存于.data;而函数内自动变量都在栈上分配空间。....bss段(未手动初始化数据)并不给该段数据分配空间,只是记录数据所需空间大小data(已手动初始化数据)段则为数据分配空间,数据保存在目标文件。数据段包含经过初始化全局变量以及它们值。...BSS大小从可执行文件得到,然后链接器得到这个大小内存块,紧跟在数据段后面。当这个内存区进入程序地址空间后全部清零。包含数据段BSS整个区段此时通常称为数据区。...1010 B:1011 C:1100 D:1101 E:1110 F:1111 以上计算,我们可以使用Window自带计算机来进行验证,如何使用?

90840

makefile使用.lds链接脚本以及 常用命令 解析

1.分析一个简单.lds链接脚本   例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS { 2...这里就需要将多个目标文件.text、.data.bss等段链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些段 .text: 代码段,存放程序执行代码一块内存 .data: 读/写数据段...,存放已初始全局变量或静态变量一块内存 .rodata: 只读数据段,存放只读数据段,比如全局const变量#define定义变量 .bss: 存放未初始化全局变量或静态变量,这里变量存放只是用来预留位置...+.text section),将所有的.rodata只读数据段合并成一个.rodata只读数据段 . = ALIGN(4); .data : { *(.data) }...如果把hello模块移动到内核源代码。例如放到/usr/src/linux/driver/, KERNELRELEASE就有定义了。

1.9K20

认识目标文件结构

; (3).data,初始化数据段存放已初始化全局变量与局部静态变量; (4).bss,未初始化数据段存放未初始化全局变量与局部静态变量; (5).rodata,只读数据段存放程序只读变量,...:(GNU)4.2.0” .plt.got 动态链接跳转表全局入口表 .init .fini 程序初始化终结代码段 .rodata1 Read Only Data,只读数据段,存放字符串常量...6.未初始化数据段(.bss) .bss段存放是未初始化全局变量与局部静态变量, test.c 未初始化全局变量 int gUninitVar 与局部静态变量 static int staVar1...从命令 readelf -S test.o 输出结果可以看到,.bss大小是4个字节,这与 gUninitVar staVar18字节大小不符。...(2)链接时,读取了所有目标文件,确定了任意一个弱符号大小。这时才在最终输出文件.BSS为其分配空间。 (3)总体看来,未初始化全局变量最终还是被放在.BSS段。

1.1K30

STM32高级开发——链接器与启动文件

至于其中各个.c文件产生功能在单片机储存排列顺序地址位置,在最后我们链接器工作产生.map文件是有显示,如下面从样例工程.map文件复制片段: .isr_vector 0x08000000...工具链链接器用法 在实际,链接器执行程序实际上是arm-none-eabi-ld这个文件,但是我再实际编写过程在遇到.c.cpp文件混合工程,ld会在链接过程中报错。...其中ld文件中一些变量堆栈大小等我们会在讲解启动文件过程来解析,因为启动文件ld文件东西息息相关。...在样例工程,我放置一个从CooCox开源集成开发环境拷贝修改启动文件,在USER目录下CoIDE_startup.c,这里我就不放文件内容了,我们只去其中一部分来讲。...总结 说了这么多,这也是我们在这个系列中比较难以理解部分,因为涉及到了GNU C特性计算机编译链接最基础部分,还有Cortex-M3内核工作方式,但是请大家仔细去理解学习,如果看了这篇文章还不懂那就多查查相关资料

79030

C程序是如何跑起来01 —— 可执行文件构成

一个可执行文件由一系列 section 构成,section 称为段,包括:代码段 text、只读数据段 rodata、数据段 databss 段等。...每个 section 用一个section header描述,包括段名、段类型、段起始地址、段偏移、段大小等。...在程序编译时候,对 C 语言代码定义函数、变量、未初始化全局变量进行编译分类,放置在不同: 普通代码翻译成二进制放到代码段(text) 常量放在只读数据段(rodata 初始化全局变量和静态局部变量放在数据段...(data BSS 段比较特殊,未初始化全局变量和静态变量都会放置到 bss,但因为这些变量值都是 0,没有必要再开辟空间存储,所以在可执行文件 bss 段是不占用空间。...但是 BSS大小、起始地址、各个变量地址信息都会分别保存在 section header table 符号表 symtab ,当程序运行时候,加载器会根据这些信息在内存紧挨着数据段之后空间

65831

用GCC开发STM32入门二

上图中,正文对应是可执行代码.text常量表格数据等.rodata,.data对应初始化了全局变量,编译后将位于可执行文件,由启动代码负责加载 到数据区(在单片机这部分数据会存于flash...,需要有启动代码把这部分内容拷贝到sram),.bss段是没有初始值全局变量,由启动代码把这 部分内容全初始化为0;为了保证C程序执行,还需要设置好程序运行时堆栈区。...一般来说,目标文件包含 .text段: 可执行代码 .rodata段: 只读数据,对应程序常量 .data段: 初始化全局变量 .bss段: 未初始化全局变量 连接器所作工作简单讲就是...flash,.data,.bss堆栈就应该定位至从0x2000 0000开始sram。...开始地址以及大小

1.8K20

makefile使用.lds链接脚本以及 @,^, $,< 解析

先来分析一个简单.lds链接脚本 ---- 例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS {...表示所有的.o文件,依赖于对应.c文件 %.o:%.S                  表示所有的.o文件,依赖于对应.S文件 ---- 当有多个.o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件顺序...这里就需要将多个目标文件.text、.data.bss等段链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些段 .text:代码段,存放程序执行代码一块内存 .data:读/写数据段,存放已初始全局变量或静态变量一块内存....rodata:只读数据段,存放只读数据段,比如全局const变量#define定义变量 .bss:存放未初始化全局变量或静态变量,这里变量存放只是用来预留位置,并不占用空间 常用命令: ENTRY....text section),将所有的.rodata只读数据段合并成一个.rodata只读数据段      . = ALIGN(4);    .data : { *(.data) }

73820

makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析

先来分析一个简单.lds链接脚本 例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS { 2 firtst...表示所有的.o文件,依赖于对应.c文件 %.o:%.S                  表示所有的.o文件,依赖于对应.S文件 当有多个.o文件时,这时候.lds链接脚本 又该如何安排它们在可执行文件顺序...这里就需要将多个目标文件.text、.data.bss等段链接在一起而链接脚本文件是告诉链接器从什么地址开始放置这些段 .text:代码段,存放程序执行代码一块内存 .data:读/写数据段,存放已初始全局变量或静态变量一块内存....rodata:只读数据段,存放只读数据段,比如全局const变量#define定义变量 .bss:存放未初始化全局变量或静态变量,这里变量存放只是用来预留位置,并不占用空间 常用命令: ENTRY...section),将所有的.rodata只读数据段合并成一个.rodata只读数据段 . = ALIGN(4); .data : { *(.data) } //指定读写数据段

1.9K100
领券