diff options
Diffstat (limited to 'com32/lib/sys/module/elfutils.c')
-rw-r--r-- | com32/lib/sys/module/elfutils.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/com32/lib/sys/module/elfutils.c b/com32/lib/sys/module/elfutils.c new file mode 100644 index 00000000..ce781a08 --- /dev/null +++ b/com32/lib/sys/module/elfutils.c @@ -0,0 +1,89 @@ +#include <stdlib.h> +#include <errno.h> + +#include <sys/elfutils.h> + +unsigned long elf_hash(const unsigned char *name) { + unsigned long h = 0; + unsigned long g; + + while (*name) { + h = (h << 4) + *name++; + if ((g = h & 0xF0000000)) + h ^= g >> 24; + + h &= ~g; + } + + return h; +} + +unsigned long elf_gnu_hash(const unsigned char *name) { + unsigned long h = 5381; + unsigned char c; + + for (c = *name; c != '\0'; c = *++name) { + h = h * 33 + c; + } + + return h & 0xFFFFFFFF; +} + +#ifdef ELF_NO_POSIX_MEMALIGN + +struct memalign_info { + void *start_addr; + char data[0]; +}; + +int elf_malloc(void **memptr, size_t alignment, size_t size) { + void *start_addr = NULL; + struct memalign_info *info; + + if ((alignment & (alignment - 1)) != 0) + return EINVAL; + if (alignment % sizeof(void*) != 0) + alignment = sizeof(void*); + + start_addr = malloc(size + (alignment > sizeof(struct memalign_info) ? + alignment : sizeof(struct memalign_info))); + + if (start_addr == NULL) + return ENOMEM; + + + info = (struct memalign_info*)(start_addr - + ((unsigned long)start_addr % alignment) + + alignment - sizeof(struct memalign_info)); + + info->start_addr = start_addr; + + *memptr = info->data; + + return 0; +} + +void elf_free(void *memptr) { + struct memalign_info *info = (struct memalign_info*)(memptr - + sizeof(struct memalign_info)); + + free(info->start_addr); +} + +#else + +int elf_malloc(void **memptr, size_t alignment, size_t size) { + if ((alignment & (alignment - 1)) != 0) + return EINVAL; + + if (alignment % sizeof(void*) != 0) + alignment = sizeof(void*); + + return posix_memalign(memptr, alignment, size); +} + +void elf_free(void *memptr) { + free(memptr); +} + +#endif //ELF_NO_POSIX_MEMALIGN |