typedef struct { Elf32_Word sh_name; /* Section name (string tbl index) */ Elf32_Word sh_type; /* Section type */ Elf32_Word sh_flags; /* Section flags */ Elf32_Addr sh_addr; /* Section virtual addr at execution */ Elf32_Off sh_offset; /* Section file offset */ Elf32_Word sh_size; /* Section size in bytes */ Elf32_Word sh_link; /* Link to another section */ Elf32_Word sh_info; /* Additional section information */ Elf32_Word sh_addralign; /* Section alignment */ Elf32_Word sh_entsize; /* Entry size if section holds table */ } Elf32_Shdr;
Section type
描述
SHT_NULL
This value marks the section header as inactive. It does not have an associated section. Other members of the section header have undefined values.
SHT_PROGBITS
This section holds information defined by the program, whose format and meaning are determined solely by the program.
SHT_SYMTAB
This section holds a symbol table. Typically, SHT_SYMTAB provides symbols for link editing, though it may also be used for dynamic linking. As a complete symbol table, it may contain many symbols unnecessary for dynamic linking. An object file can also contain a SHT_DYNSYM section.
SHT_STRTAB
This section holds a string table. An object file may have multiple string table sections.
SHT_RELA
This section holds relocation entries with explicit addends, such as type Elf32_Rela for the 32-bit class of object files. An object may have multiple relocation sections.
SHT_HASH
This section holds a symbol hash table. An object participating in dynamic linking must contain a symbol hash table. An object file may have only one hash table.
SHT_DYNAMIC
This section holds information for dynamic linking. An object file may have only one dynamic section.
SHT_NOTE
This section holds notes (ElfN_Nhdr).
SHT_NOBITS
A section of this type occupies no space in the file but otherwise resembles SHT_PROGBITS. Although this section contains no bytes, the sh_offset member contains the conceptual file offset.
SHT_REL
This section holds relocation offsets without explicit addends, such as type Elf32_Rel for the 32-bit class of object files. An object file may have multiple relocation sections.
SHT_SHLIB
This section is reserved but has unspecified semantics.
SHT_DYNSYM
This section holds a minimal set of dynamic linking symbols. An object file can also contain a SHT_SYMTAB section.
SHT_LOPROC, SHT_HIPROC
Values in the inclusive range [SHT_LOPROC, SHT_HIPROC] are reserved for processor-specific semantics.
SHT_LOUSER
This value specifies the lower bound of the range of indices reserved for application programs.
SHT_HIUSER
This value specifies the upper bound of the range of indices reserved for application programs. Section types between SHT_LOUSER and SHT_HIUSER may be used by the application, without conflicting with current or future system-defined section types.
ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }
1.3 图形化表示
1.4 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
publicinterfaceCar{ voiddrive(); }
publicclassBMWCarimplementsCar{
private String name; publicBMWCar(){ name = "宝马"; } @Override publicvoiddrive(){ System.out.println("BMW car drive." + name); } }
CONSTANT_Fieldref_info { u1 tag; u2 class_index;//索引值 u2 name_and_type_index; }
字段的符号引用
10
CONSTANT_Methodref_info
CONSTANT_Methodref_info { u1 tag; u2 class_index;;//索引值 u2 name_and_type_index; }
类中方法的符号引用
11
CONSTANT_InterfaceMethodref
CONSTANT_InterfaceMethodref_info { u1 tag; u2 class_index;;//索引值 u2 name_and_type_index; }
接口中方法的符号引用
12
CONSTANT_NameAndType_info
CONSTANT_NameAndType_info { u1 tag; u2 name_index; u2 descriptor_index; }
接口中方法的符号引用
三、字段的结构
每一个字段用一个 field_info的结构体表示
1 2 3 4 5 6 7
field_info { u2 access_flags; u2 name_index;//指向常量池的index,表示字段名 u2 descriptor_index;//指向常量池的inde,字段的描述符 u2 attributes_count; attribute_info attributes[attributes_count]; }
四、方法的结构
1 2 3 4 5 6 7
method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count];//Code字节码信息 }
五、属性的结构
1 2 3 4 5
attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length]; }