sample变量段分析
1.各段地址区间
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 000080f4 0000f4 000014 00 A 0 0 1
[ 2] .hash HASH 00008108 000108 0000cc 04 A 3 0 4
[ 3] .dynsym DYNSYM 000081d4 0001d4 000200 10 A 4 1 4
[ 4] .dynstr STRTAB 000083d4 0003d4 00012f 00 A 0 0 1
[ 5] .rel.plt REL 00008504 000504 0000a8 08 A 3 7 4
[ 6] .init PROGBITS 000085ac 0005ac 000010 00 AX 0 0 4
[ 7] .plt PROGBITS 000085bc 0005bc 000110 04 AX 0 0 4
[ 8] .text PROGBITS 000086cc 0006cc 000448 00 AX 0 0 4
[ 9] .fini PROGBITS 00008b14 000b14 000010 00 AX 0 0 4
[10] .rodata PROGBITS 00008b24 000b24 0000a8 01 AMS 0 0 4
[11] .eh_frame PROGBITS 00008bcc 000bcc 000004 00 A 0 0 4
[12] .init_array INIT_ARRAY 00011000 001000 000004 00 WA 0 0 4
[13] .fini_array FINI_ARRAY 00011004 001004 000004 00 WA 0 0 4
[14] .jcr PROGBITS 00011008 001008 000004 00 WA 0 0 4
[15] .dynamic DYNAMIC 0001100c 00100c 0000c0 08 WA 4 0 4
[16] .got PROGBITS 000110cc 0010cc 000060 04 WA 0 0 4
[17] .data PROGBITS 0001112c 00112c 000408 00 WA 0 0 4
[18] .bss NOBITS 00011534 001534 000424 00 WA 0 0 4
[19] .comment PROGBITS 00000000 001534 00004d 01 MS 0 0 1
[20] .ARM.attributes ARM_ATTRIBUTES 00000000 001581 00002b 00 0 0 1
[21] .debug_aranges PROGBITS 00000000 0015ac 000020 00 0 0 1
[22] .debug_info PROGBITS 00000000 0015cc 000e13 00 0 0 1
[23] .debug_abbrev PROGBITS 00000000 0023df 0002ef 00 0 0 1
[24] .debug_line PROGBITS 00000000 0026ce 0002de 00 0 0 1
[25] .debug_frame PROGBITS 00000000 0029ac 000078 00 0 0 4
[26] .debug_str PROGBITS 00000000 002a24 0005f1 01 MS 0 0 1
[27] .debug_loc PROGBITS 00000000 003015 000221 00 0 0 1
[28] .shstrtab STRTAB 00000000 003236 00010d 00 0 0 1
[29] .symtab SYMTAB 00000000 00381c 000830 10 30 87 4
[30] .strtab STRTAB 00000000 00404c 0003e1 00 0 0 1
2.变量详细位置
2.1 全局变量
char buffer_g_u[BUF_SIZE];
91: 00011554 256 OBJECT GLOBAL DEFAULT 18 buffer_g_u----------------bss段
char buffer_g_i[BUF_SIZE] = "0123456789";
102: 00011134 256 OBJECT GLOBAL DEFAULT 17 buffer_g_i----------------data段
char buffer_g_u_unuse[BUF_SIZE];
100: 00011854 256 OBJECT GLOBAL DEFAULT 18 buffer_g_u_unuse----------bss段
char buffer_g_i_unuse[BUF_SIZE] = "0123456789";
108: 00011434 256 OBJECT GLOBAL DEFAULT 17 buffer_g_i_unuse----------data段
static char buffer_g_s_u[BUF_SIZE];
70: 00011654 256 OBJECT LOCAL DEFAULT 18 buffer_g_s_u--------------bss段
static char buffer_g_s_i[BUF_SIZE] = "0123456789";
65: 00011234 256 OBJECT LOCAL DEFAULT 17 buffer_g_s_i--------------data段
static char buffer_g_s_u_unuse[BUF_SIZE];------------------------------------被优化
static char buffer_g_s_i_unuse[BUF_SIZE] = "0123456789";---------------------被优化
2.2静态变量
char buffer_l_u[BUF_SIZE];---------------------------------------------------被优化
char buffer_l_i[BUF_SIZE] = "0123456789";------------------------------------被优化
char buffer_l_u_unuse[BUF_SIZE];---------------------------------------------被优化
char buffer_l_i_unuse[BUF_SIZE] = "0123456789";------------------------------被优化
static char buffer_l_s_u[BUF_SIZE];
71: 00011754 256 OBJECT LOCAL DEFAULT 18 buffer_l_s_u.5127---------bss段
static char buffer_l_s_i[BUF_SIZE] = "0123456789";
66: 00011334 256 OBJECT LOCAL DEFAULT 17 buffer_l_s_i.5128---------data段
static char buffer_l_s_u_unuse[BUF_SIZE];------------------------------------被优化
static char buffer_l_s_i_unuse[BUF_SIZE] = "0123456789";---------------------被优化
#define _POSIX_C_SOURCE 199309 #include <signal.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <linux/capability.h> #include <errno.h> #define TIMER_SIG SIGRTMAX /* Our timer notification signal */ char * t = time(NULL); s = strftime(buf_local, BUF_SIZE, (format != NULL) ? format : "%c", tm); return (s == 0) ? NULL : buf_local; static void tidptr = si->si_value.sival_ptr; /* UNSAFE: This handler uses non-async-signal-safe functions // printf("[%s] ALARM count=%d\n", currTime("%T"), alarm_timer_count); /* t = time(NULL); s = strftime(buf, sizeof(buf), "%T", tm); char buffer_l_u[BUF_SIZE]; char buffer_local_main[BUF_SIZE]; char *buffer_alloc, *buffer_alloc_unuse; buffer_g_u[0] = 1; buffer_l_u[0] = 1; buffer_alloc = malloc(BUF_SIZE); free(buffer_alloc); printf("capheader: %x %d\n", cap_header.version, cap_header.pid); ts.it_value.tv_sec = 20; printf("[%s] Start timer\n", currTime("%T")); sa.sa_flags = SA_SIGINFO; sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_value.sival_ptr = &tidlist[1]; // sleep(250); for (;;) /* Wait for incoming timer signals */ |
变量类型 是否占用空间
全局变量 不论是否使用,都占用空间。
因为全局变量作用域跨文件,所以即使此文件没有使用,也不能被优化。
全局静态变量 如果没被使用,会被编译器优化。
全局静态变量的作用域为文件,编译器可以判定在此文件是否使用。没有使用,则别处也不会使用。没有存在意义。
如果被使用,则占用空间。
局部变量 局部变量不占用空间。
局部变量只在函数内使用,分配在栈中。
局部静态变量 如果没被使用,会被编译器优化。
局部静态的作用域是函数,虽然存在静态存储区,但是如果函数内没有使用。在别处再不会被使用,所以可以优化掉。
如果被使用,则占用空间。
存在静态存储区。
malloc/free 堆中分配和释放,所以是动态的。