linux elf格式文件的节名输出

//main.h
typedef    unsigned long    Elf32_Addr;
typedef unsigned short Elf32_Half;
typedef unsigned long Elf32_Off;
typedef unsigned long Elf32_Word;

#define EI_NIDENT       16

typedef struct {
unsigned char       e_ident[EI_NIDENT];
Elf32_Half          e_type;
Elf32_Half          e_machine;
Elf32_Word          e_version;
Elf32_Addr          e_entry;
Elf32_Off           e_phoff;
Elf32_Off           e_shoff; //section header table's file offset
Elf32_Word          e_flags;
Elf32_Half          e_ehsize;
Elf32_Half          e_phentsize;
Elf32_Half          e_phnum;
Elf32_Half          e_shentsize;
Elf32_Half          e_shnum;
Elf32_Half          e_shstrndx;
} Elf32_Ehdr;

#define SHT_NULL               0
#define SHT_PROGBITS           1
#define SHT_SYMTAB             2
#define SHT_STRTAB                     3
#define SHT_RELA                         4
#define SHT_HASH                    5
#define SHT_DYNAMIC            6
#define SHT_NOTE                         7
#define SHT_NOBITS                     8
#define SHT_REL                         9
#define SHT_SHLIB             10
#define SHT_DYNSYM            11
#define SHT_LOPROC    0x70000000
#define SHT_HIPROC    0x7fffffff
#define SHT_LOUSER    0x80000000
#define SHT_HIUSER    0xffffffff

typedef struct {
Elf32_Word    sh_name;
Elf32_Word    sh_type;
Elf32_Word    sh_flags;
Elf32_Addr    sh_addr;
Elf32_Off        sh_offset;
Elf32_Word    sh_size;
Elf32_Word    sh_link;
Elf32_Word    sh_info;
Elf32_Word    sh_addralign;
Elf32_Word    sh_entsize;
} Elf32_Shdr;

//main.c
#include "stdio.h"
#include "main.h"

int main(int argc, char* argv[])
{
if (argc == 1)
return 0;
FILE *fp = fopen(argv[1], "rb+");
if (fp == NULL)
{
printf("can not open filen");
return 0;
}
fseek(fp, 0, SEEK_END);
int filesize = ftell(fp);
if (filesize <= sizeof(Elf32_Ehdr))
{
printf("file too smalln");
if (fp!=NULL)
fclose(fp);
return 0;
}
fseek(fp, 0, SEEK_SET);
Elf32_Ehdr ehdr;
fread(&ehdr, sizeof(Elf32_Ehdr), 1, fp);
printf("shdr offset:0x%x size:0x%xn", ehdr.e_shoff, ehdr.e_shnum*sizeof(Elf32_Shdr));
fseek(fp, ehdr.e_shoff, SEEK_SET);

printf("section amount:%dn", ehdr.e_shnum);
Elf32_Shdr shdr[ehdr.e_shnum];
int i;
int ssti;
for (i=0; i<ehdr.e_shnum;i++)
{
fread(&shdr[i], sizeof(Elf32_Shdr), 1, fp);
if (shdr[i].sh_type == SHT_STRTAB && i == ehdr.e_shstrndx)
{
ssti = i;
printf("section string table index:%d offset:0x%xn", i, shdr[i].sh_offset);
}
}
fseek(fp, shdr[ssti].sh_offset, SEEK_SET);
char strtable[shdr[ssti].sh_size];
fread(&strtable[0], shdr[ssti].sh_size, 1, fp);
printf("%s    %15s     %s         %sn","index","section name", "offset", "size");
for (i=0; i<ehdr.e_shnum;i++)
{
if (strcmp(".text", &strtable[shdr[i].sh_name])==0)
{
//.text section
}
printf("%.2d %20s        0x%.8x    0x%.8xn", i,
&strtable[shdr[i].sh_name],shdr[i].sh_offset, shdr[i].sh_size);
}
if (fp!=NULL)
fclose(fp);
return 0;
}


转篇关于C++的

1.经典C++流:类是核心,例程多用C   Runtime的,很少用模版,一般是正统教育的结果。

2.古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧。

3.MFC流:秉承MFC的风格,主要使用MFC/ATL对象和Win32   API,不喜欢STL,用很多的宏把IDE的语法提示模块折磨到崩溃。

4.Portable流:以C   Runtime和STL为主要工具,使用类和模版,不跨平台毋宁死。

5.Functional流:以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++。

6.Win32流:多使用全局函数,偏爱Win32   API,但不排斥C   Runtime,通常喜欢轻量级的程序,所以身材也比较苗条。

7.Java流:全面使用Java的风格,不能容许任何全局成员,但允许使用STL的集合类,写很多叫Factory的类。

8.COM流:喜欢AddRef()和Release(),大量使用接口,隐藏一切可以隐藏的东西,诵经的时候要把上帝替换成COM。

9.戒律流:追求完美的C++程序,计较每一个const和throw(),极力避免不安全的cast,随身一定要带一本ISO   C++手册。

10.混沌流:其程序无常形,无恒道,变幻莫测,吾不知其名。