Main Page   Modules   Data Structures   File List   Data Fields   Examples  

melf.h

00001 /*
00002  * uninformed research
00003  * -------------------
00004  *
00005  * ELF manipulation library
00006  *
00007  * skape
00008  * mmiller@hick.org
00009  * 02/01/2003
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 // Elf header functions
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 // Section functions
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 
01274 typedef enum _Elf32_ResType {
01278         ELF_RES_TYPE_UNKNOWN = 0,
01282         ELF_RES_TYPE_STRING  = 1,
01286         ELF_RES_TYPE_BINARY  = 2,
01287 } Elf32_ResType;
01288 
01294 typedef struct _Elf32_Res {
01295 
01296         // Stored on disk:
01297         struct _Elf32_Res_Header {
01298 
01302                 unsigned long length;
01306                 Elf32_ResType type;
01310                 unsigned long identifier;
01311         } header;
01312 
01316         void          *data;    
01317 
01318         // Not stored on disk, internal use only:
01322         unsigned long index;
01326         unsigned long offset;
01327 
01328 } Elf32_Res;
01329 
01336 ELF_SPEC_HEADER *melf_resOpen(MELF *melf);
01343 ELF_SPEC_HEADER *melf_resCreate(MELF *melf);
01353 unsigned char melf_resEnum(MELF *melf, ELF_SPEC_HEADER *resTable, unsigned long index, Elf32_Res *res);
01363 unsigned char melf_resGetType(MELF *melf, ELF_SPEC_HEADER *resTable, Elf32_ResType type, Elf32_Res *res);
01373 unsigned char melf_resGetId(MELF *melf, ELF_SPEC_HEADER *resTable, unsigned long id, Elf32_Res *res);
01385 unsigned char melf_resAdd(MELF *melf, ELF_SPEC_HEADER *resTable, Elf32_ResType type, unsigned long length, unsigned long id, void *data);
01398 unsigned char melf_resUpdate(MELF *melf, ELF_SPEC_HEADER *resTable, Elf32_ResType type, unsigned long length, unsigned long id, void *data);
01407 unsigned char melf_resRemove(MELF *melf, ELF_SPEC_HEADER *resTable, Elf32_Res *res);
01414 void melf_resClose(MELF *melf, ELF_SPEC_HEADER *resTable);
01415 
01420 #ifdef MELF_COMP
01421 #include "melf_internal.h"
01422 #endif
01423 
01424 #endif

Generated on Tue Jun 3 00:01:35 2003 for libmelf by doxygen1.3-rc3