00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00025 #ifndef _MELF_H
00026 #define _MELF_H
00027
00028 #ifdef MELF_COMP
00029 #include "stdelf.h"
00030 #else
00031 #include <stdelf.h>
00032 #endif
00033
00034 #define IS_OVERFLOW(melf, base, addr) ((melf)->imageSize < ((unsigned long)(addr) - (unsigned long)(base)))
00035
00041 typedef struct _elf_spec_header {
00042
00046 unsigned long index;
00050 unsigned long identifier;
00051
00055 union
00056 {
00057
00061 Elf32_Shdr section;
00065 Elf32_Phdr program;
00066
00067 } spec;
00068
00072 void *content;
00076 unsigned long contentLength;
00077
00081 struct _elf_spec_header *prev;
00085 struct _elf_spec_header *next;
00086
00087 } ELF_SPEC_HEADER;
00088
00094 typedef struct _elf_spec_header_list {
00095
00099 ELF_SPEC_HEADER *head;
00103 ELF_SPEC_HEADER *tail;
00104
00108 unsigned long seq;
00112 unsigned long length;
00113
00114 } ELF_SPEC_HEADER_LIST;
00115
00121 typedef struct _melf {
00122
00126 char image[1024];
00130 unsigned long imageSize;
00131
00135 Elf32_Ehdr header;
00136
00140 ELF_SPEC_HEADER_LIST sections;
00141
00145 ELF_SPEC_HEADER_LIST programs;
00146
00147 } MELF;
00148
00154 MELF *melf_new();
00161 MELF *melf_open(const char *image);
00167 void melf_destroy(MELF *melf);
00168
00176 unsigned long melf_save(MELF *melf, const char *path);
00177
00182
00183
00210 void melf_elfSetType(MELF *melf, Elf32_Half type);
00217 Elf32_Half melf_elfGetType(MELF *melf);
00218
00225 void melf_elfSetMachine(MELF *melf, Elf32_Half machine);
00232 Elf32_Half melf_elfGetMachine(MELF *melf);
00233
00240 void melf_elfSetVersion(MELF *melf, Elf32_Word version);
00247 Elf32_Word melf_elfGetVersion(MELF *melf);
00248
00255 void melf_elfSetEntry(MELF *melf, Elf32_Addr entry);
00262 Elf32_Addr melf_elfGetEntry(MELF *melf);
00263
00270 void melf_elfSetProgramHeaderOffset(MELF *melf, Elf32_Off offset);
00277 Elf32_Off melf_elfGetProgramHeaderOffset(MELF *melf);
00278
00285 void melf_elfSetSectionHeaderOffset(MELF *melf, Elf32_Off offset);
00292 Elf32_Off melf_elfGetSectionHeaderOffset(MELF *melf);
00293
00300 void melf_elfSetProgramHeaderCount(MELF *melf, Elf32_Half count);
00307 Elf32_Half melf_elfGetProgramHeaderCount(MELF *melf);
00308
00315 void melf_elfSetSectionHeaderCount(MELF *melf, Elf32_Half count);
00322 Elf32_Half melf_elfGetSectionHeaderCount(MELF *melf);
00323
00330 void melf_elfSetStringTableIndex(MELF *melf, Elf32_Half index);
00337 Elf32_Half melf_elfGetStringTableIndex(MELF *melf);
00338
00343
00344
00358 ELF_SPEC_HEADER *melf_sectionAdd(MELF *melf);
00365 ELF_SPEC_HEADER *melf_sectionGetEnum(MELF *melf);
00373 ELF_SPEC_HEADER *melf_sectionEnumNext(MELF *melf, ELF_SPEC_HEADER *en);
00381 ELF_SPEC_HEADER *melf_sectionEnumPrev(MELF *melf, ELF_SPEC_HEADER *en);
00382
00390 ELF_SPEC_HEADER *melf_sectionFindType(MELF *melf, unsigned long type);
00398 ELF_SPEC_HEADER *melf_sectionFindIndex(MELF *melf, unsigned long index);
00406 ELF_SPEC_HEADER *melf_sectionFindName(MELF *melf, const char *name);
00407
00416 void melf_sectionSetContent(MELF *melf, ELF_SPEC_HEADER *section, void *content, unsigned long contentLength);
00424 void *melf_sectionGetContent(MELF *melf, ELF_SPEC_HEADER *section);
00425
00434 void melf_sectionSetName(MELF *melf, ELF_SPEC_HEADER *section, const char *name);
00442 const char *melf_sectionGetName(MELF *melf, ELF_SPEC_HEADER *section);
00443
00478 void melf_sectionSetType(MELF *melf, ELF_SPEC_HEADER *section, unsigned long type);
00486 unsigned long melf_sectionGetType(MELF *melf, ELF_SPEC_HEADER *section);
00487
00495 void melf_sectionSetAddress(MELF *melf, ELF_SPEC_HEADER *section, Elf32_Addr addr);
00503 Elf32_Addr melf_sectionGetAddress(MELF *melf, ELF_SPEC_HEADER *section);
00504
00531 void melf_sectionSetFlags(MELF *melf, ELF_SPEC_HEADER *section, Elf32_Word flags);
00538 Elf32_Word melf_sectionGetFlags(MELF *melf, ELF_SPEC_HEADER *section);
00539
00547 void melf_sectionSetEntrySize(MELF *melf, ELF_SPEC_HEADER *section, Elf32_Word entsize);
00555 Elf32_Word melf_sectionGetEntrySize(MELF *melf, ELF_SPEC_HEADER *section);
00556
00564 unsigned long melf_sectionGetIndex(MELF *melf, ELF_SPEC_HEADER *section);
00565
00574 void melf_sectionSetStringTableHeader(MELF *melf, ELF_SPEC_HEADER *section, ELF_SPEC_HEADER *stringTable);
00582 ELF_SPEC_HEADER *melf_sectionGetStringTableHeader(MELF *melf, ELF_SPEC_HEADER *section);
00583
00591 unsigned long melf_sectionRemove(MELF *melf, unsigned long id);
00592
00610 ELF_SPEC_HEADER *melf_programAdd(MELF *melf);
00617 ELF_SPEC_HEADER *melf_programGetEnum(MELF *melf);
00625 ELF_SPEC_HEADER *melf_programEnumNext(MELF *melf, ELF_SPEC_HEADER *en);
00633 ELF_SPEC_HEADER *melf_programEnumPrev(MELF *melf, ELF_SPEC_HEADER *en);
00634
00657 void melf_programSetType(MELF *melf, ELF_SPEC_HEADER *program, Elf32_Word type);
00665 Elf32_Word melf_programGetType(MELF *melf, ELF_SPEC_HEADER *program);
00666
00674 void melf_programSetVirtualAddress(MELF *melf, ELF_SPEC_HEADER *program, Elf32_Addr addr);
00682 Elf32_Addr melf_programGetVirtualAddress(MELF *melf, ELF_SPEC_HEADER *program);
00683
00691 void melf_programSetPhysicalAddress(MELF *melf, ELF_SPEC_HEADER *program, Elf32_Addr addr);
00699 Elf32_Addr melf_programGetPhysicalAddress(MELF *melf, ELF_SPEC_HEADER *program);
00700
00708 void melf_programSetVirtualSize(MELF *melf, ELF_SPEC_HEADER *program, Elf32_Word size);
00716 Elf32_Word melf_programGetVirtualSize(MELF *melf, ELF_SPEC_HEADER *program);
00717
00725 void melf_programSetPhysicalSize(MELF *melf, ELF_SPEC_HEADER *program, Elf32_Word size);
00733 Elf32_Word melf_programGetPhysicalSize(MELF *melf, ELF_SPEC_HEADER *program);
00734
00751 void melf_programSetFlags(MELF *melf, ELF_SPEC_HEADER *program, Elf32_Word flags);
00759 Elf32_Word melf_programGetFlags(MELF *melf, ELF_SPEC_HEADER *program);
00760
00768 unsigned long melf_programRemove(MELF *melf, unsigned long id);
00769
00789 ELF_SPEC_HEADER *melf_stringTableCreate(MELF *melf, const char *name);
00790
00800 unsigned long melf_stringTableSetString(MELF *melf, ELF_SPEC_HEADER *stringTable, const char *name);
00809 const char *melf_stringTableGetString(MELF *melf, ELF_SPEC_HEADER *stringTable, unsigned long index);
00810
00828 ELF_SPEC_HEADER *melf_dynamicCreate(MELF *melf);
00829
00892 Elf32_Dyn *melf_dynamicAddTag(MELF *melf, ELF_SPEC_HEADER *dynamic, Elf32_Sword tag, Elf32_Word val);
00901 unsigned long melf_dynamicRemoveTag(MELF *melf, ELF_SPEC_HEADER *dynamic, Elf32_Sword tag);
00910 unsigned long melf_dynamicRemoveIndex(MELF *melf, ELF_SPEC_HEADER *dynamic, unsigned long index);
00919 Elf32_Dyn *melf_dynamicGetTag(MELF *melf, ELF_SPEC_HEADER *dynamic, Elf32_Sword tag);
00928 Elf32_Dyn *melf_dynamicGetIndex(MELF *melf, ELF_SPEC_HEADER *dynamic, unsigned long index);
00938 unsigned long melf_dynamicSetTag(MELF *melf, ELF_SPEC_HEADER *dynamic, Elf32_Sword tag, Elf32_Word val);
00948 unsigned long melf_dynamicSetIndex(MELF *melf, ELF_SPEC_HEADER *dynamic, unsigned long index, Elf32_Word val);
00949
00969 ELF_SPEC_HEADER *melf_noteCreate(MELF *melf, const char *name, unsigned long createProgramHeader);
00970
01017 Elf32_Nhdr *melf_noteAdd(MELF *melf, ELF_SPEC_HEADER *note, Elf32_Word type, const char *name, unsigned char *desc, unsigned long descLength);
01026 Elf32_Nhdr *melf_noteEnum(MELF *melf, ELF_SPEC_HEADER *note, unsigned long index);
01035 unsigned long melf_noteRemove(MELF *melf, ELF_SPEC_HEADER *note, Elf32_Nhdr *item);
01036
01045 unsigned long melf_noteGetType(MELF *melf, ELF_SPEC_HEADER *note, Elf32_Nhdr *item);
01053 const char *melf_noteGetName(MELF *melf, ELF_SPEC_HEADER *note, Elf32_Nhdr *item);
01061 unsigned char *melf_noteGetDesc(MELF *melf, ELF_SPEC_HEADER *note, Elf32_Nhdr *item);
01062
01081 ELF_SPEC_HEADER *melf_symbolTableCreate(MELF *melf, const char *name);
01082
01090 Elf32_Sym *melf_symbolTableAddSymbol(MELF *melf, ELF_SPEC_HEADER *symTable, const char *name);
01099 Elf32_Sym *melf_symbolTableEnum(MELF *melf, ELF_SPEC_HEADER *symTable, unsigned long index);
01108 unsigned long melf_symbolTableRemoveSymbol(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *symbol);
01109
01129 void melf_symbolSetName(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym, const char *name);
01137 const char *melf_symbolGetName(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym);
01138
01147 void melf_symbolSetValue(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym, Elf32_Addr value);
01156 Elf32_Addr melf_symbolGetValue(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym);
01157
01166 void melf_symbolSetSize(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym, Elf32_Word size);
01175 Elf32_Word melf_symbolGetSize(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym);
01176
01194 void melf_symbolSetBinding(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym, unsigned char binding);
01203 unsigned char melf_symbolGetBinding(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym);
01204
01228 void melf_symbolSetType(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym, unsigned char type);
01237 unsigned char melf_symbolGetType(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym);
01238
01247 void melf_symbolSetSectionIndex(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym, Elf32_Half shndx);
01256 Elf32_Half melf_symbolGetSectionIndex(MELF *melf, ELF_SPEC_HEADER *symTable, Elf32_Sym *sym);
01257
01262 #ifdef MELF_COMP
01263 #include "melf_internal.h"
01264 #endif
01265
01266 #endif