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 文件的大小受调试状态下编译的影响,但段不受影响。

[C语言内存分配] text段,data段,bss段

一个程序一般分为3段:text段,data段,bss段 text段:就是放程序代码的,编译时确定,只读, data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写 就是通常所说的静...
  • zhangyanquen
  • zhangyanquen
  • 2012年07月04日 17:46
  • 1865

C语言中的各个段

一.前言: C语言程序经过编译连接后形成编译、连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成,如下图所示: ...
  • callWuSheng
  • callWuSheng
  • 2013年12月01日 15:55
  • 1005

C语言--局部/全局字符串存放在哪个段

最近遇到一个问题,相似的代码如下: #include   char* get_str(void) {     char *p = "hello word";     return p; ...
  • u013561409
  • u013561409
  • 2014年02月25日 11:06
  • 1073

C语言文件的编译与执行的四个阶段并分别描述

C语言文件的编译与执行的四个阶段并分别描述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文...
  • yimingsilence
  • yimingsilence
  • 2016年10月12日 21:38
  • 1830

c语言中编译链接的整个过程

C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作...
  • yangjinkui
  • yangjinkui
  • 2016年10月19日 13:33
  • 1731

C语言 关键字、标识符、注释

一、关键字 1.什么是关键字 关键字就是C语言提供的有特殊含义的符号,有些地方也叫做“保留字”。   2.一共有哪些关键字 C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义。...
  • VNanyesheshou
  • VNanyesheshou
  • 2016年01月10日 21:22
  • 1666

C语言学习篇-1Hello, World!(编写、编译、链接、运行)

说明:初识第一个程序。开发工具的选择 写代码的工具:记事本、ULtraEdit、Vim、Xcode等。 选择Xcode的原因:苹果公司官方提供的开发利器、简化开发的工程、有高亮显示功能。 代码编写 程...
  • fd070910
  • fd070910
  • 2016年05月30日 22:01
  • 1812

用VS编译C语言

这里犯得错误是使用c++的预编译头去编译c语言。 如果解决C1853这个错误呢? 其实就是对每一个.c文件加上 #include "stdafx.h" 然后把.c文件改为.cp...
  • dodott
  • dodott
  • 2016年08月04日 11:45
  • 1088

C语言再学习 -- GCC编译过程

参看:GCC编译过程分解 一、GCC简介: gcc的原名叫做GNU C语言 编译器(GNU C Compile),只能编译C语言程序,后来很快就做了扩展,支持了更多的编程语言,比如C+ Object...
  • qq_29350001
  • qq_29350001
  • 2016年11月25日 21:04
  • 3219

C语言编译的各个阶段

C编译器通过下面的这几个阶段处理C源文件。不同的编译器实际的实现过程可能有所不同,但是主要行为都是一致的。 阶段11)源文件(往往是一个由像UTF-8这样的多字节编码的文本文件)的字节都要做映射,通过...
  • xtydtc
  • xtydtc
  • 2016年12月11日 10:40
  • 555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言编译中的“段”
举报原因:
原因补充:

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