Subversion Repositories HelenOS-historic

Rev

Rev 869 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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