size nm 命令解析a.out

下面这段摘自以下:

作者:Mr_Bluyee
链接:https://www.jianshu.com/p/6593a8b7446f
 

a.out是“assembler output”(汇编程序输出)的缩写形式。这里有一个问题:它不是汇编程序输出,而是链接器输出。“汇编程序输出”这个名字的产生纯属历史原因。在早期的语言中并不存在链接器,程序是这样创建的:先把所有源文件连接在一起,然后进行汇编,汇编产生的汇编程序输出保存在a.out中。即使最后有了链接器之后,最后一个环节的输出文件依然沿用了这个命名习惯。

一、预备知识—程序的内存分配 
一个由c/C++编译的程序占用的内存分为以下几个部分 
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放(就会造成内存泄漏的问题),程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(data), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS,Block Started by Symbol)。 - 程序结束后有系统释放(在整个程序的执行过程中都是有效的) 
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 (文字常量区内的数据可以修改吗?)
5、程序代码区(code)—存放函数体的二进制代码。 

直接上代码,大神写的:

  8 #include <stdlib.h>
  9 #include <stdio.h>
 10 #include <string.h>
 11 int a = 0;   // 全局初始化区
 12 char *p1;  //全局未初始化区
 13 void main()
 14 {
 15     int b;                      //栈
 16     char s[] = "abc";    //栈     //abc是在栈里面,而下面123456/0却在在常量区内,要注意这两种情况的区别
 17     char *p2;               // 栈
 18     char *p3 = "123456"; //123456/0在常量区,p3在栈上。
 19     static int c =0;  //全局(静态)初始化区
 20     p1 = (char *)malloc(10);
 21     p2 = (char *)malloc(20);   //分配得来得10和20字节的区域就在堆区。
 22     strcpy(p1, "123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方
 23 }   
Latitude-3340:~/share/$ gcc test_size.c

生成a.out,并使用size命令查看具体的代码情况

   text	   data	    bss	    dec	    hex	filename
   1400	    568	     24	   1992	    7c8	a.out

执行nm -Sln a.out

                 w __gmon_start__
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
                 U __libc_start_main@@GLIBC_2.2.5
                 U malloc@@GLIBC_2.2.5
                 U __stack_chk_fail@@GLIBC_2.4
0000000000400440 T _init
00000000004004b0 T _start
00000000004004e0 t deregister_tm_clones
0000000000400510 t register_tm_clones
0000000000400550 t __do_global_dtors_aux
0000000000400570 t frame_dummy
000000000040059d 0000000000000072 T main
0000000000400610 0000000000000065 T __libc_csu_init
0000000000400680 0000000000000002 T __libc_csu_fini
0000000000400684 T _fini
0000000000400690 0000000000000004 R _IO_stdin_used
00000000004007c0 r __FRAME_END__
0000000000600e10 t __frame_dummy_init_array_entry
0000000000600e10 t __init_array_start
0000000000600e18 t __do_global_dtors_aux_fini_array_entry
0000000000600e18 t __init_array_end
0000000000600e20 d __JCR_END__
0000000000600e20 d __JCR_LIST__
0000000000600e28 d _DYNAMIC
0000000000601000 d _GLOBAL_OFFSET_TABLE_
0000000000601038 D __data_start
0000000000601038 W data_start
0000000000601040 D __dso_handle
0000000000601048 B __bss_start
0000000000601048 0000000000000001 b completed.6982
0000000000601048 D _edata
0000000000601048 D __TMC_END__
000000000060104c 0000000000000004 B a
0000000000601050 0000000000000004 b c.2861
0000000000601058 0000000000000008 B p1
0000000000601060 B _end

可以看到三个位于全局静态区的变量:

000000000060104c 0000000000000004 B a     //B表示全局变量BSS
0000000000601050 0000000000000004 b c.2861 //b表示局部全局变量BSS
0000000000601058 0000000000000008 B p1

具体可查看man size 和man nm命令 详细的命令解释

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值