代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]

函数代码://demo.c

#include<stdio.h>
#include<stdlib.h>

int global1 = 0, global2 = 0, global3 = 0;

void function(void)
{
        int local4 = 0, local5 = 0, local6 = 0;
        static int static4 = 0, static5 = 0, static6 = 0;
        int *p2 = (int*)malloc(sizeof(int));

        printf("子函数 局部变量 : \n");
        printf("local4 : %p \n", &local4);
        printf("local5 : %p \n", &local5);
        printf("local6 : %p \n", &local6);

        printf("子函数 指针变量 : \n");
        printf("p2 : %p \n", p2);

        printf("全局变量 : \n");
        printf("global1 : %p \n", &global1);
        printf("global2 : %p \n", &global2);
        printf("global3 : %p \n", &global3);

        printf("子函数 静态变量 : \n");
        printf("static4 : %p \n", &static4);
        printf("static5 : %p \n", &static5);
        printf("static6 : %p \n", &static6);

        printf("子函数地址 : \n");
        printf("function : %p \n", function);
}

int demo_main(int argc, char **argv)
{
        int local1 = 0, local2 = 0, local3 = 0;
        static int static1 = 0, static2 = 0, static3 = 0;
        int *p1 = (int*)malloc(sizeof(int));
        const int const1 = 0;
        char *char_p = "char";

        printf("主函数 局部变量 : \n");
        printf("local1 : %p \n", &local1);
        printf("local2 : %p \n", &local2);
        printf("local3 : %p \n", &local3);
        printf("const1 : %p \n", &const1);

        printf("主函数 指针变量 : \n");
        printf("p1 : %p \n", p1);

        printf("全局变量 : \n");
        printf("global1 : %p \n", &global1);
        printf("global2 : %p \n", &global2);
        printf("global3 : %p \n", &global3);

        printf("主函数 静态变量 : \n");
        printf("static1 : %p \n", &static1);
        printf("static2 : %p \n", &static2);
        printf("static3 : %p \n", &static3);

        printf("字符串常量 : \n");
        printf("char_p : %p \n", char_p);

        printf("主函数地址 : \n");
        printf("main : %p \n", demo_main);

        printf("= = = = = = = = = = = = = = = \n");

        function();

        return 0;
}

函数打印情况,并结合sct文件、init.s分析:

;;init.s
;The location of stacks
UserStack    EQU    (_STACK_BASEADDRESS-0x3800)    ;0x33ff4800 ~ 0x33ff5800
SVCStack    EQU    (_STACK_BASEADDRESS-0x2800)    ;0x33ff5800 ~
UndefStack    EQU    (_STACK_BASEADDRESS-0x2400)    ;0x33ff5c00 ~
AbortStack    EQU    (_STACK_BASEADDRESS-0x2000)    ;0x33ff6000 ~
IRQStack    EQU    (_STACK_BASEADDRESS-0x1000)    ;0x33ff7000 ~
FIQStack    EQU    (_STACK_BASEADDRESS-0x0)    ;0x33ff8000 ~
主函数 局部变量 :         //运行时,UserStack栈中,map文件里面没有
local1 : 33ff56e4
local2 : 33ff56e0
local3 : 33ff56dc
const1 : 33ff56d8
主函数 malloc指针变量 :   //运行时,堆中,map文件里面没有
p1 : 37000020        //_init_alloc(0x37000000,0x38000000-8); 
全局变量 :                 //Data     demo.o(.data)      [rw]
global1 : 322000a8
global2 : 322000ac
global3 : 322000b0
主函数 静态变量 :         //Data     demo.o(.data)      [rw]
static1 : 322000c0
static2 : 322000c4
static3 : 322000c8
字符串常量 :             //Code demo.o(.text)   [ro]
char_p : 32013b28
主函数地址 :             //ARM Code  demo.o(.text)  [ro]
demo_main : 32013a10
= = = = = = = = = = = = = = =
子函数 局部变量 :         //运行时,map文件里面没有
local4 : 33ff56c8
local5 : 33ff56c4
local6 : 33ff56c0
子函数 指针变量 :         //运行时,map文件里面没有
p2 : 37000030
全局变量 :                 //Data     demo.o(.data)      [rw]
global1 : 322000a8
global2 : 322000ac
global3 : 322000b0
子函数 静态变量 :         //Data     demo.o(.data)      [rw]
static4 : 322000b4
static5 : 322000b8
static6 : 322000bc
子函数地址 :             //ARM Code  demo.o(.text)  [ro]
function : 3201381c 

sct 、 map文件分析:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_ROM1 0x32000000 0x00200000  {    ; load region size_region
  ER_ROM1 0x32000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }

  ;const data[ro] and code
  ;Symbol Name                      Ov Type     Size        Object(Section)
  ;RESET                            Section     532         init.o(RESET)
  ;IsrIRQ                           ARM Code    0           init.o(RESET)
  ;static U16 ReadStatus            ARM Code                nand.o(.text)
  ;static void WriteRawRCBySPI1     ARM Code                nand.o(.text)
  ;static const U8 exchang_right    Data                    des.o(.constdata)
  ;__ENTRY                          ARM Code    0           init.o(RESET)
  ;void DelayMs                     ARM Code    40          common.o(.text)

  RW_RAM1 0x32200000 0x04000000  {  ; RW data   0x3220002c
   .ANY (+RW +ZI)//可更改的变量
  }

  ;rw data + bss
  ;static char IcCardSnrFound[7]    Data                    execmd.o(.data)
  ;static U8 s_Buf[64][2048]        Data                    nfblack.o(.bss)
  ;int grDebugCom                   Data                    common.o(.data)
  ;u8 downloadbuf[192*2048]         Data                    fireupdate.o(.bss)
  ;struct USB_DEVICE_DESCRIPTOR descDev     Data            usbsetup.o(.bss)

  RW_IRAM1 0x40000000 0x00001000  {
   .ANY (+RW +ZI)
  }
}
 bss段,代码段及数据段的区别[1]:
bss和data的区别:
    全局的未初始化变量存在于.bss段中,具体体现为一个占位符;
    全局的已初始化变量存于.data段中;

    .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);
    而.data却需要占用,其内容由程序初始化。

    若这样定义一个全局变量:int g_bVal[9] ;
    则它在.bss段,这里占用占位符的空间。

    若这样定义一个全局变量:int g_aVal[9] ={1,2,3,4,5,6,7,8,9};
    则它在.data段,程序占用数组全部大小的空间。

bss和data的联系:
    都在rw区域;
    bss段在运行起来成为进程之后,占的空间大小和data就相同了。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读
(某些架构也允许代码段为可写,即允许修改程序)。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
代码段是存放了程序代码的数据,假如机器 中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。
 

参考:

1、  bss段,代码段及数据段的区别

http://blog.163.com/starjj_embeded/blog/static/2045000512012213113440344/

时间: 2024-07-28 19:45:52

代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]的相关文章

C++中函数变量布局小结

把布局作为一种信仰(Layout as Religion).                                                                                                                    --Steve McConnell(<代码大全>一书作者)        在 C 语言的早期版本中,由于规定变量的赋值必须在所有变量的声明之前,因此经常能看到如下形式的代码:           void

用闭包解决 js 循环中函数变量暂存问题

需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>testFor</title> </head> <body> &l

IDEA中的替换功能(替换代码中的变量名很好用哦)

刚刚上班不久,这两天正在研究公司项目里面的代码,今天用阿里的插件扫描了一下代码,发现代码中有很多变量的命名,没有遵循驼峰式的命名规则.一开始我一个一个的修改这些变量名,后来无意中用了一下Ctrl+F(搜索功能),后来又无意用了一下替换功能,真的是好用的不行.废话不多,上图. 选中该变量按Ctrl+F,然后点击图中的②按钮,就能选中代码中所有出现的这个变量,然后就可以进行更改了.只需要更改一个,其余的变量就都更改了. 原文地址:https://www.cnblogs.com/zhaoqipengb

代码中创建新终端 以及的把新终端的输出打印到文件,用于调式。

转自:http://blog.chinaunix.net/uid-20682147-id-4981769.html cat term.c #include<stdio.h> #include<stdbool.h> #include<stdlib.h> #include<string.h> #include<sys/prctl.h> #include<unistd.h> #include<utmp.h> #include&l

[转] bss段、data段、text段

1.前言 本文主要分编译时和运行时分别对 对data段 bss段 text段 堆 栈作一简要说明 2. 程序编译时概念说明 2.1 bss段 bss段(bss segment)通常是指用来存放程序中未初始化(或初始化为0)的全局变量的一块内存区域. bss是英文Block Started by Symbol的简称. bss段属于静态内存分配. 2.2 data: 数据段(data segment)通常是指用来存放程序中已初始化(非零)的非const的全局变量的一块内存区域. 数据段属于静态内存分

如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名言”,恐怕是程序员最怕见也最常见的东西了. 在一个大型软件的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程序崩溃并不可怕,反而是测试的成功.作为开发的我们更需要关心的是程序中的哪个函数或哪一行导致了系统崩溃,这样才能有针对性的进行改正. 本文描述了自己总结的几种定位崩溃的办法.

关于C++中的Const常量

一. 为什么需要常量 (1)如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦: 1. 程序的可读性(可理解性)变差.程序员自己会忘记那些数字或字符串是什么意 思,用户则更加不知它们从何处来.表示什么. 2. 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误. 3. 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错. (2)尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串. 例如: #define MAX 100 /* C 语言的宏常量 */ co

[翻译]:怎样从C/C++代码中对C#进行回调

声明:网络上类似的中文博客大有存在,本人知识水平有限,业余爱好,也是为了备份收藏How to make a callback to C# from C/C++ code 本着共享知识的初衷,翻译一份给大家参考,为了便于阅读不至于拗口,没有按照原文直译,不到之处或者翻译有误,还望勿喷,敬请指评. 几乎每个人都知道怎样调用一个非托管DLL中的函数,然而有时候我们希望能从C/C++代码中调用C#代码.想象一个场景,其中有一个名为Engine.dll的本机C语言编写DLL的C#应用程序.在DLL中有一个

Python:函数变量的使用

1.上层函数不能直接使用其嵌套函数的变量: def func1(x, y): z = x + y def func2(): m = 3 z += m return z print(func1(1, 2)) # 报错:name 'm' is not defined 2.上层函数中的变量可以在其嵌套函数内直接使用: def func1(x, y): z = x + y def func2(): m = 3 + z return m return func2() print(func1(1, 2))