C语言编译中的“段”

原创 2007年09月28日 16:06:00

对于目标文件而言,“段”是二进制文件中简单的区域,里面保存了和某种特定类型(如符号表条目)相关的所有信息。section 是 ELF 文件中的最小组织单位。一个段一般包含几个section。

不要把UNIX中段的概念跟Intel X86架构中段的概念混淆。

在UNIX中,段表示一个二进制文件相关的内容块。 
在Intel x86的内存模型中,段表示一种设计的结果。在这种设计中(基于兼容性原因),地址空间并非一个整体,而是分成一些64K大小的区域,称之为段。

当在一个可执行文件中运行 size 命令时,它会告诉你这个文件中的三个段(文本段,数据段和bss段)的大小:

% size a.out

text   data    bss   dec    hex   filename
1548  4236  4    1133    46d     a.out

nm和dump命令可以检查可执行文件的内容!

BSS段只保存没有值得变量。(BSS:Block Started by Symbol 由符号开始的块)


举例:

$ cat helloworld.c

#include <stdio.h>
int main(void)
{
     printf("hello world!/n");
    return 0;
}

$ ls -l a.out

4692

$ ls -l helloworld.c

77

$ size a.out

text   data    bss   dec     hex     filename
843    260    4       1107     453    a.out

增加一个全局的int array[1000]; 数组声明。重新编译得:

$ ls -l a.out
4714

$ size a.out
text   data    bss     dec    hex    filename
843   260     4032    5135   140f  a.out

对数组进行初始化: int array[1000] = {0, 10, 20, 0};

得:

$ ls -l a.out
8734

$  size a.out
text   data    bss     dec    hex    filename
843  4280    4      5127   1407   a.out

分析上面的“编程结果”,使自己确信:

(1)数据段保存在目标文件中;

(2)SS段不保存在目标文件中(除了记录BSS段在运行时所需要的大小)。

(3)文本段是最容易受优化措施影响的段。

(4) a.out 文件的大小受调试状态下编译的影响,但段不受影响。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux下GCC编译环境中二叉树遍历、C语言实现以及调试过程中段错误

最近一直在学习数据结构准备面试,昨天晚上看到了二叉树,在网上查了一些资料以后照猫画虎的写了一个二叉树遍历的程序,主要是为了消化递归构建二叉树和遍历的过程,调试过程中也发现了不少问题。 二叉树概念属性...

C语言编译步骤

C语言从代码变成可执行程序的步骤: 预处理 -----> 编译 -----> 汇编 -----> 链接 ⒈预处理:去掉注释,加载头文件,代替宏定义,条件编译 需要文件:.c文件 ...

C语言编译全过程

C语言编译全过程     编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件...

Linux下C语言编译基础及makefile的编写

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/13724/showart_80664.html 这篇文章介绍在LINUX下进行C语言编...

C语言基础(一)编译、数据类型、注释、代码块

1、写代码注意事项:      (1)不要忘记导入头文件 #include      (2)main函数有且只有一个      (3)写完一行代...

C语言多文件编译时,编译器不检测其声明的变量类型与定义时的类型是否匹配

比如我在文件1里定义int c = 0x31323334; 在文件2里声明extern char c;   编译器并不会报错的。 //File: 1.c char a[100] ...
  • e3399
  • e3399
  • 2012-04-21 16:42
  • 1068

黑马程序员——C语言——宏定义、条件编译、文件包含等

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 一、预处理指令 1、所有的预处理指令都是以#开头 2、预处理指令分为三种 1)、宏定义 2)、条件编译...

C语言编译原理分析

C语言编译过程详解 C语言的编译链接过程是要把我们编写的一个C程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程...

KEIL编译器C语言编译选项优化等级说明

这边文章主要是针对SYD8801蓝牙芯片,也是在这个芯片上出现了问题: 主函数如下: int main() {          uint8_tkey_num=0;     &#...

使用MINGW搭载c语言编译环境

当我们不想使用vs这么大的软件时,可以自己搭载一个MINGW的c语言编译环境,这样我们使用cmd就可以直接编译用笔记本写的代码了。 First:我们需要一个MINGW,当然可以去官网下载 http...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)