diff options
author | norly <ny-git@enpas.org> | 2013-06-01 17:42:36 +0100 |
---|---|---|
committer | norly <ny-git@enpas.org> | 2013-06-03 02:08:46 +0100 |
commit | d217921268e5b2d9e38023c25e55dc315b8e3263 (patch) | |
tree | 801a0e9248d071a8f7f98e1bef4d8c87692b059a /include | |
parent | 030aeb591f867263f734ca2e232c45dc98f3ec50 (diff) |
Basic 32-bit SYMTAB and REL (not RELA) support
Diffstat (limited to 'include')
-rw-r--r-- | include/libelfu/debug.h | 2 | ||||
-rw-r--r-- | include/libelfu/modelops.h | 14 | ||||
-rw-r--r-- | include/libelfu/types.h | 49 |
3 files changed, 60 insertions, 5 deletions
diff --git a/include/libelfu/debug.h b/include/libelfu/debug.h index 6b817b3..b9f9161 100644 --- a/include/libelfu/debug.h +++ b/include/libelfu/debug.h @@ -4,6 +4,8 @@ #include <stdio.h> +#define ELFU_DEBUG(...) do { fprintf(stdout, __VA_ARGS__); } while(0) + #define ELFU_INFO(...) do { fprintf(stdout, __VA_ARGS__); } while(0) #define ELFU_WARN(...) do { fprintf(stderr, __VA_ARGS__); } while(0) diff --git a/include/libelfu/modelops.h b/include/libelfu/modelops.h index b56f133..3daef52 100644 --- a/include/libelfu/modelops.h +++ b/include/libelfu/modelops.h @@ -11,11 +11,12 @@ size_t elfu_mPhdrCount(ElfuElf *me); void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp); -typedef int (SectionHandlerFunc)(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2); -int elfu_mScnForall(ElfuElf *me, SectionHandlerFunc f, void *aux1, void *aux2); -size_t elfu_mScnCount(ElfuElf *me); -size_t elfu_mScnIndex(ElfuElf *me, ElfuScn *ms); -char* elfu_mScnName(ElfuElf *me, ElfuScn *ms); +typedef void* (SectionHandlerFunc)(ElfuElf *me, ElfuScn *ms, void *aux1, void *aux2); + void* elfu_mScnForall(ElfuElf *me, SectionHandlerFunc f, void *aux1, void *aux2); + size_t elfu_mScnCount(ElfuElf *me); + size_t elfu_mScnIndex(ElfuElf *me, ElfuScn *ms); + ElfuScn* elfu_mScnByOldscn(ElfuElf *me, ElfuScn *oldscn); + char* elfu_mScnName(ElfuElf *me, ElfuScn *ms); ElfuScn** elfu_mScnSortedByOffset(ElfuElf *me, size_t *count); @@ -25,6 +26,9 @@ GElf_Addr elfu_mLayoutGetSpaceInPhdr(ElfuElf *me, GElf_Word size, int elfu_mLayoutAuto(ElfuElf *me); +void elfu_mRelocate32(ElfuElf *metarget, ElfuScn *mstarget, ElfuScn *msrt); + + int elfu_mCheck(ElfuElf *me); ElfuScn* elfu_mCloneScn(ElfuScn *ms); diff --git a/include/libelfu/types.h b/include/libelfu/types.h index 177bbaf..2a0fcf3 100644 --- a/include/libelfu/types.h +++ b/include/libelfu/types.h @@ -17,6 +17,9 @@ typedef struct ElfuScn { struct ElfuScn *oldptr; + struct ElfuSymtab *symtab; + struct ElfuReltab *reltab; + CIRCLEQ_ENTRY(ElfuScn) elemChildScn; CIRCLEQ_ENTRY(ElfuScn) elem; } ElfuScn; @@ -44,4 +47,50 @@ typedef struct { } ElfuElf; + + + +typedef struct ElfuSym { + char *name; + + GElf_Addr value; + GElf_Word size; + + unsigned char bind; + unsigned char type; + unsigned char other; + + ElfuScn *scnptr; + + CIRCLEQ_ENTRY(ElfuSym) elem; +} ElfuSym; + + +typedef struct ElfuSymtab { + CIRCLEQ_HEAD(Syms, ElfuSym) syms; +} ElfuSymtab; + + + +typedef struct ElfuRel { + char *name; + + GElf_Addr offset; + GElf_Word info; + + GElf_Word sym; + unsigned char type; + + int addendUsed; + GElf_Sword addend; + + CIRCLEQ_ENTRY(ElfuRel) elem; +} ElfuRel; + + +typedef struct ElfuReltab { + CIRCLEQ_HEAD(Rels, ElfuRel) rels; +} ElfuReltab; + + #endif |