《程》第三章第三节
.data保存了已经初始化的全局经停变量和局部静态变量
.rodata存放制度数据,比如只读变量(如const修饰的变量)和字符串常量
有时候编译器会把字符串常量放到.data段
.bss段存放未初始化的全局变量和局部静态变量。有的编译器会将全局的未初始化变量放在目标文件.bss段,有的不存放,知识预留一个未定义的全局变量符号,等到最终链接乘可执行文件的时候再在.bss段分配空间
对于下面的代码,x1放在.bss中,x2放在.data中,因为x1=0可以认为是未初始化的,被优化放在.bss段中以节省空间
1 2
| static int x1=0; static int x2=1;
|
由“.”作为前缀的段名表示这个名字是由系统保留的。程序可以用一些非系统保留的名字作为段名,但是不能以“.“作为前缀
一个ELF文件可以拥有几个相同段名的段
打印文本文件最后n行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| #include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define max 81 #define def 10 struct Tail{ char data[max]; struct Tail *link; }; main(int argc,char *argv[]){ char curline[max],*file; int n= def,i; struct Tail *list,*ptr,*qtr; FILE *fp; if(argc==3&&argv[1][0]=='-'){ n=atoi(argv[1]+1); file=argv[2]; }
else if(argc==2) file=argv[1]; else{ fprintf(stderr,"Usage:tail[-n]filename\n"); exit(1); } if ((fp=fopen(file,"r"))==NULL){ fprintf(stderr,"Cannot open file:%s!",file); exit(-1); }
list=qtr=(struct Tail*)malloc(sizeof(struct Tail)); qtr->data[0]='\0'; for(i=1;i<n;i++){ ptr=(struct Tail*)malloc(sizeof(struct Tail)); ptr->data[0]='\0'; qtr->link=ptr; qtr=ptr; } ptr->link=list; ptr=list; while(fgets(curline,max,fp)!=NULL){ strcpy(ptr->data,curline); ptr=ptr->link; } for(i=0;i<n;i++){ if(ptr->data[0]=='\0') printf("%s",ptr->data); ptr=ptr->link; } fclose(fp); return 0; }
|
一段汇编代码