diff options
-rw-r--r-- | ltrace-elf.c | 18 | ||||
-rw-r--r-- | ltrace-elf.h | 7 |
2 files changed, 25 insertions, 0 deletions
diff --git a/ltrace-elf.c b/ltrace-elf.c index d9dac5e..b2e6e07 100644 --- a/ltrace-elf.c +++ b/ltrace-elf.c @@ -244,6 +244,24 @@ DEF_READER(elf_read_u64, 64) #undef DEF_READER +#define DEF_READER(NAME, SIZE) \ + int \ + NAME(Elf_Data *data, GElf_Xword *offset, uint##SIZE##_t *retp) \ + { \ + int rc = elf_read_u##SIZE(data, *offset, retp); \ + if (rc < 0) \ + return rc; \ + *offset += SIZE / 8; \ + return 0; \ + } + +DEF_READER(elf_read_next_u8, 8) +DEF_READER(elf_read_next_u16, 16) +DEF_READER(elf_read_next_u32, 32) +DEF_READER(elf_read_next_u64, 64) + +#undef DEF_READER + int open_elf(struct ltelf *lte, const char *filename) { diff --git a/ltrace-elf.h b/ltrace-elf.h index a50ad8a..a520e63 100644 --- a/ltrace-elf.h +++ b/ltrace-elf.h @@ -116,6 +116,13 @@ int elf_read_u16(Elf_Data *data, GElf_Xword offset, uint16_t *retp); int elf_read_u32(Elf_Data *data, GElf_Xword offset, uint32_t *retp); int elf_read_u64(Elf_Data *data, GElf_Xword offset, uint64_t *retp); +/* These are same as above, but update *OFFSET with the width + * of read datum. */ +int elf_read_next_u8(Elf_Data *data, GElf_Xword *offset, uint8_t *retp); +int elf_read_next_u16(Elf_Data *data, GElf_Xword *offset, uint16_t *retp); +int elf_read_next_u32(Elf_Data *data, GElf_Xword *offset, uint32_t *retp); +int elf_read_next_u64(Elf_Data *data, GElf_Xword *offset, uint64_t *retp); + #if __WORDSIZE == 32 #define PRI_ELF_ADDR PRIx32 #define GELF_ADDR_CAST(x) (void *)(uint32_t)(x) |