/* * Swap VMA and LMA in ELF header. * * by Jakub Jermar * * GPL'ed, copyleft */ /* * HP's IA-64 simulator Ski seems to confuse VMA and LMA in the ELF header. * Instead of using LMA, Ski loads sections at their VMA addresses. * This short program provides a workaround for this bug by simply * swapping VMA and LMA in the ELF header of the executable. * * Note that after applying this workaround, you will be able to load * ELF objects with different VMA and LMA in Ski, but the executable * will become wronged for other potential uses. */ #include #include #include #include #include #include #include void syntax(char *prg) { printf("%s ELF-file\n", prg); exit(1); } void error(char *msg) { printf("Error: %s\n", msg); exit(2); } #define ELF_VMA (0x50/sizeof(unsigned long long)) #define ELF_LMA (0x58/sizeof(unsigned long long)) #define ELF_ENTRY (0x18/sizeof(unsigned long long)) #define LENGTH 0x98 int main(int argc, char *argv[]) { int fd; unsigned long long vma, lma,entry; unsigned long long *elf; if (argc != 2) syntax(argv[0]); fd = open(argv[1], O_RDWR); if (fd == -1) error("open failed"); elf = mmap(NULL, LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if ((void *) elf == (void *) -1) error("map failed"); lma = elf[ELF_LMA]; elf[ELF_VMA] = lma; entry = lma; elf[ELF_ENTRY] = entry; if (munmap(elf, LENGTH) == -1) error("munmap failed"); if (close(fd) == -1) error("close failed"); return 0; }