为什么我的 data 和 bss 段内存使用为零?
Why is my data and bss segment memory usage zero?
我有这段代码,是我使用 msp430-gcc 为 MSP430 平台编译的。
#include<stdio.h>
#include<stdint.h>
// Preprocessor definitions
#define ROR(x,r) ((x>>r) | (x << (64-r)))
#define ROL(x,r) ((x << r) | (x >> (64-r)))
#define R(x,y,k) (x = ROR(x,8), x+=y, x^=k, y = ROL(y,3), y^=x)
void encrypt(uint64_t* , uint64_t*, uint64_t*);
void main(){
uint64_t key[2] ={0x0706050403020100, 0x0f0e0d0c0b0a0908} ; // key
uint64_t plain_text[2] = {0x7469206564616d20, 0x6c61766975716520};
uint64_t cipher_text[2] = {0,0}; //initializing cipher text to 0s
uint64_t* pt = plain_text;
uint64_t* ct = cipher_text; // Cipher Text
uint64_t* k = key; // 64 b
encrypt(pt, ct, k);
}
/*
* Ecnryption Method
*/
void encrypt(uint64_t* pt, uint64_t* ct, uint64_t* k){
uint64_t i;
uint64_t B = k[1];
uint64_t A = k[0];
// Encryption rounds
for(i=0; i<32; i++){
R(ct[1], ct[0], A);
R(B,A, i);
}
}
我想要这个程序的内存段使用统计信息,我通过生成目标文件并使用 $ size
命令来做到这一点。我得到的结果如下:
text data bss dec hex filename
278 0 0 278 116 encrypt.o
我不明白为什么告诉我 RAM 使用情况的 data
段为零。我假设我的 bss
段为零,因为我没有任何未初始化的变量。
如果有人能向我解释这里发生了什么,我将不胜感激。谢谢。
data
部分包含初始化数据,即具有非零值的全局或静态变量:
int x = 5;
void f() {
static int y = 42;
}
bss
部分包含未初始化的数据,即具有默认(零)值的全局或静态变量:
int x;
void f() {
static int y;
}
您的程序不包含此类变量,因此这些部分为空。
您的所有变量都是自动,即在堆栈上。
堆栈是动态分配的,没有简单的方法可以通过查看目标文件来检测最大堆栈大小。
你声明的是局部变量。它们将存储在堆栈中。一般情况下,堆栈占用的RAM大小无法在编译时确定。但是,对于像您这样的简单应用程序,可以估计堆栈使用的上限,方法是使用 objdump
并手动计算字节数,或者使用一些现有工具进行静态分析。
要将变量存储在 .data
和 .bss
段中,请使用 static
类型限定符:
void main() {
static uint64_t key[2] ={0x0706050403020100, 0x0f0e0d0c0b0a0908};
这是一个更好的做法;在微控制器应用程序中,动态分配(例如堆栈中的分配)不是您想要做的事情。
我有这段代码,是我使用 msp430-gcc 为 MSP430 平台编译的。
#include<stdio.h>
#include<stdint.h>
// Preprocessor definitions
#define ROR(x,r) ((x>>r) | (x << (64-r)))
#define ROL(x,r) ((x << r) | (x >> (64-r)))
#define R(x,y,k) (x = ROR(x,8), x+=y, x^=k, y = ROL(y,3), y^=x)
void encrypt(uint64_t* , uint64_t*, uint64_t*);
void main(){
uint64_t key[2] ={0x0706050403020100, 0x0f0e0d0c0b0a0908} ; // key
uint64_t plain_text[2] = {0x7469206564616d20, 0x6c61766975716520};
uint64_t cipher_text[2] = {0,0}; //initializing cipher text to 0s
uint64_t* pt = plain_text;
uint64_t* ct = cipher_text; // Cipher Text
uint64_t* k = key; // 64 b
encrypt(pt, ct, k);
}
/*
* Ecnryption Method
*/
void encrypt(uint64_t* pt, uint64_t* ct, uint64_t* k){
uint64_t i;
uint64_t B = k[1];
uint64_t A = k[0];
// Encryption rounds
for(i=0; i<32; i++){
R(ct[1], ct[0], A);
R(B,A, i);
}
}
我想要这个程序的内存段使用统计信息,我通过生成目标文件并使用 $ size
命令来做到这一点。我得到的结果如下:
text data bss dec hex filename
278 0 0 278 116 encrypt.o
我不明白为什么告诉我 RAM 使用情况的 data
段为零。我假设我的 bss
段为零,因为我没有任何未初始化的变量。
如果有人能向我解释这里发生了什么,我将不胜感激。谢谢。
data
部分包含初始化数据,即具有非零值的全局或静态变量:
int x = 5;
void f() {
static int y = 42;
}
bss
部分包含未初始化的数据,即具有默认(零)值的全局或静态变量:
int x;
void f() {
static int y;
}
您的程序不包含此类变量,因此这些部分为空。
您的所有变量都是自动,即在堆栈上。 堆栈是动态分配的,没有简单的方法可以通过查看目标文件来检测最大堆栈大小。
你声明的是局部变量。它们将存储在堆栈中。一般情况下,堆栈占用的RAM大小无法在编译时确定。但是,对于像您这样的简单应用程序,可以估计堆栈使用的上限,方法是使用 objdump
并手动计算字节数,或者使用一些现有工具进行静态分析。
要将变量存储在 .data
和 .bss
段中,请使用 static
类型限定符:
void main() {
static uint64_t key[2] ={0x0706050403020100, 0x0f0e0d0c0b0a0908};
这是一个更好的做法;在微控制器应用程序中,动态分配(例如堆栈中的分配)不是您想要做的事情。