操做系统:ubuntu 13.04

工具:gcc, objdump, readelf

参考:《程序员自我修养》

代码编译后的机器指令常常被放在代码段里,代码段名为".text";已初始化的全局变量和已初始化的局部静态变量常常放在数据段里,数据段名为".data";未初始化的全局变量和未初始化局部静态变量通常放在“.bss”段里,.bss在文件中不占据空间。字符串常量通常放在“.rodata”段里。

经过代码编译后查看文件内部结构来论证一下上面观点,代码以下:

代码:程序员

点击(此处)折叠或打开ubuntu

int printf(const char* format, ...);

int global_init_var = 84; //已初始化的全局变量

int global_uninit_var;    //未初始化的全局变量

char *str1 = "hello world!"; //字符串常量

void func1(int i)

{

printf("%d\n", i);

}

int main(void)

{

static int static_var = 85; //已初始化的静态局部变量

static int static_var2;     //未初始化的静态局部变量

char *str2 = "22222";       //字符串常量

int a = 1;

int b;

func1(static_var+static_var2+a+b);

return a;

}

上面代码保存为1.c,编译生成目标文件1.o:c#

点击(此处)折叠或打开sass

gcc -c 1.c

使用objdump来查看目标文件的结构和内容,命令以下:

工具

点击(此处)折叠或打开ui

objdump -s -d 1.o

目标文件结构和内容以下(只保留.bss段、.text段、.data段、.rodata段):操作系统

点击(此处)折叠或打开.net

1.o: file format elf32-i386

Contents of section .text:

0000 5589e583 ec188b45 08894424 04c70424 U......E..D$...$

0010 0d000000 e8fcffff ffc9c355 89e583e4 ...........U....

0020 f083ec20 c7442414 11000000 c7442418 ... .D$......D$.

0030 01000000 8b150800 0000a100 00000001 ................

0040 c28b4424 1801c28b 44241c01 d0890424 ..D$....D$.....$

0050 e8fcffff ff8b4424 18c9c3            ......D$...

Contents of section .data:

0000 54000000 00000000 55000000          T.......U...

Contents of section .rodata:

0000 68656c6c 6f20776f 726c6421 0025640a hello world!.%d.

0010 00323232 323200                     .22222.

Disassembly of section .text:

00000000 :

0:    55                     push %ebp

1:    89 e5                  mov %esp,%ebp

3:    83 ec 18               sub $0x18,%esp

6:    8b 45 08               mov 0x8(%ebp),%eax

9:    89 44 24 04            mov %eax,0x4(%esp)

d:    c7 04 24 0d 00 00 00   movl $0xd,(%esp)

14:    e8 fc ff ff ff         call 15

19:    c9                     leave

1a:    c3                     ret

0000001b :

1b:    55                       push %ebp

1c:    89 e5                    mov %esp,%ebp

1e:    83 e4 f0                 and $0xfffffff0,%esp

21:    83 ec 20                 sub $0x20,%esp

24:    c7 44 24 14 11 00 00     movl $0x11,0x14(%esp)

2b:    00

2c:    c7 44 24 18 01 00 00     movl $0x1,0x18(%esp)

33:    00

34:    8b 15 08 00 00 00        mov 0x8,%edx

3a:    a1 00 00 00 00           mov 0x0,%eax

3f:    01 c2                    add %eax,%edx

41:    8b 44 24 18              mov 0x18(%esp),%eax

45:    01 c2                    add %eax,%edx

47:    8b 44 24 1c              mov 0x1c(%esp),%eax

4b:    01 d0                    add %edx,%eax

4d:    89 04 24                 mov %eax,(%esp)

50:    e8 fc ff ff ff           call 51

55:    8b 44 24 18              mov 0x18(%esp),%eax

59:    c9                       leave

5a:    c3                       ret

咱们先来看一下.data段里数据:unix

点击(此处)折叠或打开

Contents of section .data:

0000 54000000 00000000 55000000 T.......U...

由于已初始化的全局变量和已初始化的局部静态变量常常放在.data段里,由于偶的CPUX86是小端,低字节放低位,54000000转化十进制为84,55000000转化为十进制为85,恰好对应代码中的global_init_var = 84和static_var = 85。

而后咱们来看一下.rodata段的数据:

点击(此处)折叠或打开

Contents of section .rodata:

0000 68656c6c 6f20776f 726c6421 0025640a hello world!.%d.

0010 00323232 323200                     .22222.

.rodata里面你能够看到有个数据,分别为“hello world!”、“%d\n”、"22222",这三个数据分别对应了代码中的三个字符串常量。因此字符串常量通常放在“.rodata”段里。

接下来就是代码段.text:

点击(此处)折叠或打开

Contents of section .text:

0000 5589e583 ec188b45 08894424 04c70424 U......E..D$...$

0010 0d000000 e8fcffff ffc9c355 89e583e4 ...........U....

0020 f083ec20 c7442414 11000000 c7442418 ... .D$......D$.

0030 01000000 8b150800 0000a100 00000001 ................

0040 c28b4424 1801c28b 44241c01 d0890424 ..D$....D$.....$

0050 e8fcffff ff8b4424 18c9c3            ......D$...

看到.text段中的两个以"55 89 e5 83 ec ec 18 8b 45"和"89 e5 83 e4 f0 83 ec 20"开头的数据。分别对应汇编代码编译之后的机器指令(十六进制数据相同),见以下:

点击(此处)折叠或打开

Disassembly of section .text:

00000000 :

0:    55                       push %ebp

1:    89 e5                    mov %esp,%ebp

3:    83 ec 18                 sub $0x18,%esp

6:    8b 45 08                 mov 0x8(%ebp),%eax

9:    89 44 24 04              mov %eax,0x4(%esp)

d:    c7 04 24 0d 00 00 00     movl $0xd,(%esp)

14:    e8 fc ff ff ff           call 15

19:    c9                       leave

1a:    c3                       ret

0000001b :

1b:    55                       push %ebp

1c:    89 e5                    mov %esp,%ebp

1e:    83 e4 f0                 and $0xfffffff0,%esp

21:    83 ec 20                 sub $0x20,%esp

24:    c7 44 24 14 11 00 00     movl $0x11,0x14(%esp)

2b:    00

2c:    c7 44 24 18 01 00 00     movl $0x1,0x18(%esp)

33:    00

34:    8b 15 08 00 00 00        mov 0x8,%edx

3a:    a1 00 00 00 00           mov 0x0,%eax

3f:    01 c2                    add %eax,%edx

41:    8b 44 24 18              mov 0x18(%esp),%eax

45:    01 c2                    add %eax,%edx

47:    8b 44 24 1c              mov 0x1c(%esp),%eax

4b:    01 d0                    add %edx,%eax

4d:    89 04 24                 mov %eax,(%esp)

50:    e8 fc ff ff ff           call 51

55:    8b 44 24 18              mov 0x18(%esp),%eax

59:    c9                       leave

5a:    c3                       ret

因此说代码编译后的机器指令常常被放在代码段里。

再看一下.bss段,输入命令:

点击(此处)折叠或打开

objdump -x -s -d 1.o

查看:

点击(此处)折叠或打开

Sections:

Idx Name Size VMA LMA File off Algn

2 .bss 00000004 00000000 00000000 0000009c 2**2

ALLOC

看到.bss的大小为4,《程序员自我修养》上说只有static_var2存放到.bss段,而global_uninit_var只是一个未定义的“COMMON符号“没有放在任何段里,这是跟不一样的语言与不一样的编译器实现有关。看完书后在来补充吧。

最后,说bbs段在文件中不不占用空间,请参考下面代码:

1.

点击(此处)折叠或打开

#include

int main(void)

{

return 0;

}

编译查看大小:

点击(此处)折叠或打开

root@women:/usr/local/src# gcc -c 1.c

root@women:/usr/local/src# size 1.o

text       data        bss        dec        hex    filename

66          0          0         66         42    2.o

root@women:/usr/local/src# ls -l 1.o

-rw-r--r-- 1 root root 852 8月 27 11:03 2.o

2.比上面代码多了16字节的”int a[10] = {0};“

点击(此处)折叠或打开

#include

int a[10] = {0};

int main(void)

{

return 0;

}

再来编译查看大小:

点击(此处)折叠或打开

root@women:/usr/local/src# gcc -c 2.c

root@women:/usr/local/src# ll 2.o

-rw-r--r-- 1 root root 868 8月 27 11:13 2.o

root@women:/usr/local/src# size 2.o

text     data     bss     dec     hex    filename

66     0     40     106     6a    2.o

两段代码便之后,BSS段大小发生了变化多了40个字节,可是实际文件大小只相差16个字节,恰好就是加入代码的”int a[10] = {0};“这十六个字节。因此说bbs段在文件中不不占用空间。

linux查看程序bss段,LINUX下目标文件的BSS段、数据段、代码段相关推荐

  1. linux查看程序的快捷键,linux操作系统的快捷键及命令讲解

    GNU是为Linux提供免费软件支持的工具;红帽与乌邦图都是Linux的一个版本. Linux登入时登入名为root的是最高级别 Linux系统中的文件夹: /:根目标 bin:二进制可执行文件 li ...

  2. Linux和Windows的遍历目录下所有文件的方法对比

    首先两者读取所有文件的方法都是采用迭代的方式,首先用函数A的返回值判断目录下是否有文件,然后返回值合法则在循环中用函数B直到函数B的返回值不合法为止.最后用函数C释放资源. 1.打开目录 #inclu ...

  3. linux按照更改时间查看文件,Linux查看特定时间段内修改过的文件

    Linux查看特定时间段内修改过的文件 一.Linux系统日志的一些信息,日志配置文件syslog.conf 系统日志一般都存在/var/log下 常用的系统日志如下: 核心启动日志:/var/log ...

  4. linux下目标文件的类型6,Linux下文件类型

    Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为 ...

  5. linux查看远程服务器端口,linux下查看本机和远程服务器的端口是否连通的方法...

    linux下查看本机和远程服务器的端口是否连通的方法 如下所示: 1.ssh -v -p [端口号] [用户名]@[IP地址] 2.curl [IP地址]:[端口号] 以上这篇linux下查看本机和远 ...

  6. Linux 应用程序 嵌汇编,Linux下C语言嵌汇编

    Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1.前缀: Intel汇编寄存器和立即数无需前缀.后者寄存器前缀为%,立即数前缀为$. ...

  7. Windows 和 Linux 应用程序从上到下调用层次比较

    刚毕业的时候,做了将近一年的Window下的程序开发,主要用MFC,那是也不明白程序在操作系统角度从上到下的整个调用层次.遇到调用库函数,不明白,就查MSDN,每个月1500行代码左右,那时以为这就是 ...

  8. linux查看msf安装目录,Ubuntu下安装Metasploit和Linux命令大全

    ①下载Metasploit下的Linux安装包,拷贝至Ubunto的/opt目录. ②在Terminal下运行命令"chmod +x /opt/framework-linux-4.0.0.r ...

  9. linux 目标文件(*.o) bss,data,text,rodata,堆,栈

    学习于:http://blog.csdn.net/sunny04/article/details/40627311 linux目标文件 一个简单的程序被编译成目标文件后的结构如下: 注:初始化为0在此 ...

  10. linux目标文件,Linux下目标文件分析

    作者:冯老师, 1. 程序源码如下: 2.命令 gcc –E simple_section.c –o simple_section.i gcc –S simple_section.i –o simpl ...

最新文章

  1. 微信公众号网页获取用户信息
  2. 利用axios解决跨域的问题
  3. 卷积神经网络的一些细节
  4. matlab Retinex图像增强算法
  5. 架构设计:Vue+nginx+jwt+zuul+eureka+ribbon+hystrix+rabbitmq+mysql集群+redis集群+elsticsearch集群
  6. app.config 配置的一种用法
  7. nodejs TCP server和TCP client如何建立连接
  8. 气泡为何是球形?这是一个数学问题!
  9. 合作开发过程产生的专利_被起诉专利侵权怎么办?专利律师给你出招!
  10. 文末送书|增强现实:原理与实践
  11. 如何将 Redis 的内存优化?
  12. redis 慢消费_Redis精进:List的使用和应用场景
  13. 基于树莓派的人脸识别门禁系统
  14. C语言十折交叉验证,十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集...
  15. 20天学习Spark(0)之最简单版Spark入门
  16. AutoCAD二次开发——引线标注
  17. 商用密码产品认证-电子签章系统
  18. 【好工具】强烈安利的文献管理软件 Mendeley
  19. 服务器刷新率和显示器刷新率,什么是屏幕刷新率
  20. vue视频播放插件vue-video-player

热门文章

  1. DIN数据电缆行业现状调研及趋势分析报告
  2. c语言total用法,C语言 这个表达式怎么理解 新手请大神详述total += isalnum(ch[i])!=0;...
  3. Unity 自定义standard shader
  4. 台式计算机开机风扇不转,台式机开机风扇转一下停一下
  5. Centos7下安装Relion
  6. DNA甲基化芯片探针的P值如何计算
  7. java与模式孙悟空_设计模式之原型模式 - chenxkang的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. java蓝桥杯数字黑洞_蓝桥杯题目练习之数字黑洞
  9. UC Android官方下载,手机uc浏览器下载并安装-uc浏览器app最新版本v13.3.9.1119 安卓官方版 - 极光下载站...
  10. 动词ing形式的5种用法_动词ing形式的用法及变化规则