diff options
author | Lucas De Marchi <lucas.demarchi@profusion.mobi> | 2011-12-20 11:41:19 -0200 |
---|---|---|
committer | Lucas De Marchi <lucas.demarchi@profusion.mobi> | 2011-12-20 11:41:19 -0200 |
commit | 51c409b449a82283515e7c3fa5a4a0e2f23807fe (patch) | |
tree | 332f818b00bf68f74b3cb5361095000c2beba829 /libkmod/libkmod-elf.c | |
parent | 58b7191c945918f85d5f41ea591111f741ad3a75 (diff) | |
download | kmod-51c409b449a82283515e7c3fa5a4a0e2f23807fe.tar.gz |
Cache the offset of crc
This way we don't need to check every time in loop. Indeed compiler
could already optimize out that checks, but this ways is cleaner and
shorter.
Diffstat (limited to 'libkmod/libkmod-elf.c')
-rw-r--r-- | libkmod/libkmod-elf.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/libkmod/libkmod-elf.c b/libkmod/libkmod-elf.c index f8a4317..70bbb2c 100644 --- a/libkmod/libkmod-elf.c +++ b/libkmod/libkmod-elf.c @@ -456,7 +456,7 @@ int kmod_elf_get_strings(const struct kmod_elf *elf, const char *section, char * /* array will be allocated with strings in a single malloc, just free *array */ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion **array) { - uint64_t size, slen, off; + size_t off, offcrc, size, slen; struct kmod_modversion *a; const void *buf; char *itr; @@ -474,6 +474,11 @@ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion assert(sizeof(struct kmod_modversion64) == sizeof(struct kmod_modversion32)); + if (elf->class == KMOD_ELF_32) + offcrc = sizeof(uint32_t); + else + offcrc = sizeof(uint64_t); + *array = NULL; err = kmod_elf_get_section(elf, "__versions", &buf, &size); @@ -490,17 +495,13 @@ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion off = (const uint8_t *)buf - elf->memory; slen = 0; + for (i = 0; i < count; i++, off += MODVERSION_SEC_SIZE) { - const char *symbol; - if (elf->class & KMOD_ELF_32) { - struct kmod_modversion32 *mv; - symbol = elf_get_mem(elf, off + sizeof(mv->crc)); - } else { - struct kmod_modversion64 *mv; - symbol = elf_get_mem(elf, off + sizeof(mv->crc)); - } + const char *symbol = elf_get_mem(elf, off + offcrc); + if (symbol[0] == '.') symbol++; + slen += strlen(symbol) + 1; } @@ -510,19 +511,12 @@ int kmod_elf_get_modversions(const struct kmod_elf *elf, struct kmod_modversion itr = (char *)(a + count); off = (const uint8_t *)buf - elf->memory; + for (i = 0; i < count; i++, off += MODVERSION_SEC_SIZE) { - uint64_t crc; - const char *symbol; + uint64_t crc = elf_get_uint(elf, off, offcrc); + const char *symbol = elf_get_mem(elf, off + offcrc); size_t symbollen; - if (elf->class & KMOD_ELF_32) { - struct kmod_modversion32 *mv; - crc = elf_get_uint(elf, off, sizeof(mv->crc)); - symbol = elf_get_mem(elf, off + sizeof(mv->crc)); - } else { - struct kmod_modversion64 *mv; - crc = elf_get_uint(elf, off, sizeof(mv->crc)); - symbol = elf_get_mem(elf, off + sizeof(mv->crc)); - } + if (symbol[0] == '.') symbol++; |