Subversion Repositories HelenOS

Rev

Rev 1796 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Swap VMA and LMA in ELF header.
  3.  *
  4.  *  by Jakub Jermar <jermar@itbs.cz>
  5.  *
  6.  *  GPL'ed, copyleft
  7.  */
  8.  
  9. /*
  10.  * HP's IA-64 simulator Ski seems to confuse VMA and LMA in the ELF header.
  11.  * Instead of using LMA, Ski loads sections at their VMA addresses.
  12.  * This short program provides a workaround for this bug by simply
  13.  * swapping VMA and LMA in the ELF header of the executable.
  14.  *
  15.  * Note that after applying this workaround, you will be able to load
  16.  * ELF objects with different VMA and LMA in Ski, but the executable
  17.  * will become wronged for other potential uses.
  18.  */
  19.  
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24. #include <sys/mman.h>
  25. #include <unistd.h>
  26. #include <fcntl.h>
  27.  
  28. void syntax(char *prg)
  29. {
  30.     printf("%s ELF-file\n", prg);
  31.     exit(1);
  32. }
  33.  
  34. void error(char *msg)
  35. {
  36.     printf("Error: %s\n", msg);
  37.     exit(2);
  38. }
  39.  
  40. #define ELF_VMA (0x50/sizeof(unsigned long long))
  41. #define ELF_LMA (0x58/sizeof(unsigned long long))
  42. #define ELF_ENTRY (0x18/sizeof(unsigned long long))
  43.  
  44. #define LENGTH  0x98
  45.  
  46. int main(int argc, char *argv[])
  47. {
  48.     int fd;
  49.     unsigned long long vma, lma,entry;
  50.     unsigned long long *elf;
  51.  
  52.     if (argc != 2)
  53.         syntax(argv[0]);
  54.    
  55.     fd = open(argv[1], O_RDWR);
  56.     if (fd == -1)
  57.         error("open failed");
  58.  
  59.     elf = mmap(NULL, LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  60.     if ((void *) elf  == (void *) -1)
  61.         error("map failed");
  62.        
  63.     lma = elf[ELF_LMA];
  64.     elf[ELF_VMA] = lma;
  65.     entry = lma;
  66.     elf[ELF_ENTRY] = entry;
  67.    
  68.     if (munmap(elf, LENGTH) == -1)
  69.         error("munmap failed");
  70.    
  71.     if (close(fd) == -1)
  72.         error("close failed");
  73.        
  74.     return 0;
  75. }
  76.