arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc
arm-none-linux-gnueabi-gcc -v
gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202)
重點:
代碼中的內存分配, 地址從低到高: 代碼段(RO, 保存函數代碼) --> 只讀數據段(RO, 保存常量) --> 數據段(RW, 已初始化并且初始值不為0的全局變量和靜態變量) -->bss段(RW,? 未初始化或者初始化為0的全局變量和靜態變量).
程序運行起來之后, 堆區和棧區的變量地址是動態分配的.
可以看出arm-none-linux-gnueabi-gcc編譯和gcc編譯結果是類似的.
#include
#include
int global_ni; // .bss
int global_iz = ; // .bss
int global_inz = ; // .data
const int global_const0 = ;
const int global_const1 = ;
void function(void)
{
int local_fni;
int local_finz = ;
int local_fiz = ;
static int static_fni;
static int static_finz = ;
static int static_fiz = ;
int *p2 = (int*)malloc(sizeof(int));
printf("子函數 局部變量 : \n");
printf(" local_fni: %p \n", &local_fni);
printf(" local_finz: %p \n", &local_finz);
printf(" local_fiz: %p \n", &local_fiz);
printf("子函數 靜態變量 : \n");
printf(" static_fni: %p \n", &static_fni);
printf(" static_finz: %p \n", &static_finz);
printf(" static_fiz: %p \n", &static_fiz);
printf("子函數 指針變量 : \n");
printf(" p2 : %p \n", p2);
printf("子函數地址 : \n");
printf(" function : %p \n", function);
}
int main(int argc, char **argv)
{
int local_mni;
int local_minz = ;
int local_miz = ;
static int static_mni;
static int static_minz = ;
static int static_miz = ;
int *p1 = (int*)malloc(sizeof(int));
const int local_const0 = ;
const int local_const1 = ;
char* str_ptr = "char";
printf("主函數 局部變量 : \n");
printf(" local_mni : %p \n", &local_mni);
printf(" local_minz : %p \n", &local_minz);
printf(" local_miz : %p \n", &local_miz);
printf("const 變量: \n");
printf(" local_const0 : %p \n", &local_const0);
printf(" local_const1 : %p \n", &local_const1);
printf(" global_const0 : %p \n", &global_const0);
printf(" global_const1 : %p \n", &global_const1);
printf("主函數 malloc指針變量 : \n");
printf(" p1 : %p \n", p1);
printf("全局變量 : \n");
printf(" global_ni : %p \n", &global_ni);
printf(" global_inz : %p \n", &global_inz);
printf(" global_iz : %p \n", &global_iz);
printf("主函數 靜態變量 : \n");
printf(" static_mni: %p \n", &static_mni);
printf(" static_minz: %p \n", &static_minz);
printf(" static_miz: %p \n", &static_miz);
printf("字符串常量 : \n");
printf(" str_ptr : %p \n", str_ptr);
printf("主函數地址 : \n");
printf(" main : %p \n", main);
printf("= = = = = = = = = = = = = = = \n");
function();
return ;
}
/*
= = = = = = = = = = = = = = =
測試:
arm-none-linux-gnueabi-gcc -o test main.c
arm-none-linux-gnueabi-objdump -Dhs test > test.dis
分析:
Disassembly of section .text: 000083e0
{
子函數地址 :
function :
主函數地址 :
main :
}
Disassembly of section .rodata: 000088c0
{
const 變量: 全局
global_const0
global_const1
字符串常量 : str_ptr
}
//.data中是初始化為非0的全局變量和靜態變量
Disassembly of section .data: 00010d5c
{
global_inz
static_minz
static_finz
}
//.bss中是初始化為0以及沒有初始化的全局變量和靜態變量
Disassembly of section .bss: 00010d70
{
global_iz
static_mni
static_miz
static_fni
static_fiz
global_ni
}
堆空間: //動態的
{
主函數 malloc指針變量 :
p1 :
子函數 malloc指針變量 :
p2 :
}
棧空間: //動態的
{
子函數 局部變量 :
local_fiz :
local_finz:
local_fni :
const 變量: 局部
local_const1 :
local_const0 :
主函數 局部變量 :
local_miz :
local_minz:
local_mni :
}
*/
反匯編文件test.dis節選
test: file format elf32-littlearm
Sections:
Idx Name Size VMA LMA File off Algn
.interp **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.note.ABI-tag **
CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_CONTENTS
.hash 0000003c **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.dynsym 000000a0 000081a4 000081a4 000001a4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.dynstr 000000a7 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.version 000082ec 000082ec 000002ec **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.version_r **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rel.dyn **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rel.plt **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.init 0000000c **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.plt 0000005c **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.text 000004d8 000083e0 000083e0 000003e0 **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.fini 000088b8 000088b8 000008b8 **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.rodata 000088c0 000088c0 000008c0 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.ARM.extab 00008bd4 00008bd4 00000bd4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.ARM.exidx 00008bf8 00008bf8 00000bf8 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.init_array 00010c38 00010c38 00000c38 **
CONTENTS, ALLOC, LOAD, DATA
.fini_array 00010c3c 00010c3c 00000c3c **
CONTENTS, ALLOC, LOAD, DATA
.jcr 00010c40 00010c40 00000c40 **
CONTENTS, ALLOC, LOAD, DATA
.dynamic 000000f0 00010c44 00010c44 00000c44 **
CONTENTS, ALLOC, LOAD, DATA
.got 00010d34 00010d34 00000d34 **
CONTENTS, ALLOC, LOAD, DATA
.data 00010d5c 00010d5c 00000d5c **
CONTENTS, ALLOC, LOAD, DATA
.bss 0000001c 00010d70 00010d70 00000d70 **
ALLOC
.ARM.attributes 0000002b 00000d70 **
CONTENTS, READONLY
.comment 0000002b 00000d9b **
CONTENTS, READONLY
.debug_frame 00000dc8 **
CONTENTS, READONLY, DEBUGGING
gcc代碼反匯編查看內存分布[1]: gcc
# gcc -vgcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 重點: 代碼中的內存分配, 地址從低到高: 代碼段(RO, 保存函數代碼) --&g ...
Ubuntu12.4 64位 安裝 arm linux gcc 4.3.2
一.下載arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...
代碼內存泄露檢測工具(linux gcc + valrind)
參考博客: https://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html linux命令如下:valgrind --tool ...
轉載:C++類內存分布
本文轉自:http://www.cnblogs.com/jerry19880126/p/3616999.html,原文寫的非常好,從中學到了虛繼承的概念,也學會了用VS查看內存分布. 說下C++內存分 ...
C語言內存分布
C語言內存分布 典型的C語言程序內存表示分區共有5個部分: 正文段 Text segment 已初始化數據段(數據段)Initialized data segment 未初始化數據段(bss)Unin ...
使用匯編分析c代碼的內存分布
arm平臺下使用反匯編分析c內存分布: arm:使用arm-linux-objdump命令將編譯完畢之后的elf文件,進行反匯編. 之后重定向到tmp.s文件里. 第一步變量例如以下c文件. vim ...
C語言中內存分布及程序運行中(BSS段、數據段、代碼段、堆棧)
BSS段:(bss segment)通常是指用來存放程序中未初始化的全局變量的一塊內存區域.BSS是英文Block Started by Symbol的簡稱.BSS段屬于靜態內存分配. 數據段?: ...
淺析VS2010反匯編 VS 反匯編方法及常用匯編指令介紹 VS2015使用技巧 調試-反匯編 查看C語言代碼對應的匯編代碼
淺析VS2010反匯編 2015年07月25日 21:53:11 閱讀數:4374 第一篇 1. 如何進行反匯編 在調試的環境下,我們可以很方便地通過反匯編窗口查看程序生成的反匯編信息.如下圖所示. ...
[GeekBand] C++繼承關系下虛函數內存分布
本文參考文獻:GeekBand課堂內容,授課老師:侯捷 :深度探索C++對象模型(侯捷譯) :網絡資料,如:http://blog.csdn.net/sanfengshou/article/detai ...
隨機推薦
Remove WebCakeDesktop
WebCakeDesktop.Updater.exe 是廣告程序,卸載步驟參考 http://malwaretips.com/blogs/webcake-desktop-updater-exe-rem ...
javascript 通過IE ActiveX 獲得本機內網ip
WMI Scripting HTML數據庫數據用Excel導出的3種方法
將數據庫數據用Excel導出主要有3種方法:用Excel.Application接口.用OleDB.用HTML的Tabel標簽 方法1——Excel.Application接口: 首先,需要要Exce ...
圖片與字符串(base64編碼)的轉化
package com.demo; import java.util.*; import java.io.*; import sun.misc.BASE64Decoder; import sun.mi ...
thinkphp3.2.3的使用心得(零)
從模板傳參到控制器 模板中代碼:
Chained Exceptions in Java
1. Overview In this article, we’ll have a very brief look at what?Exception?is and go in depth about ...
git 創建SSH key
可以自己搭建一臺運行Git的服務器,不過現階段,為了學Git先搭個服務器絕對是小題大作.好在這個世界上有個叫GitHub的神奇的網站,從名字就可以看出,這個網站就是提供Git倉庫托管服務的,所以,只要 ...
總結
以上是生活随笔為你收集整理的arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 顺丰快递5斤一件邮费多少钱
- 下一篇: linux dma拷贝数据到用户态,图解