Subversion Repositories HelenOS

Rev

Rev 2971 | Rev 2977 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2971 Rev 2972
Line 47... Line 47...
47
 
47
 
48
#include "elf.h"
48
#include "elf.h"
49
#include "pcb.h"
49
#include "pcb.h"
50
#include "elf_load.h"
50
#include "elf_load.h"
51
 
51
 
52
#define RTLD_BIAS 0x80000
-
 
53
//#define RTLD_BIAS 0
-
 
54
 
-
 
55
static char *error_codes[] = {
52
static char *error_codes[] = {
56
    "no error",
53
    "no error",
57
    "invalid image",
54
    "invalid image",
58
    "address space error",
55
    "address space error",
59
    "incompatible image",
56
    "incompatible image",
60
    "unsupported image type",
57
    "unsupported image type",
61
    "irrecoverable error"
58
    "irrecoverable error"
62
};
59
};
63
 
60
 
64
static unsigned int elf_load(elf_ld_t *elf);
61
static unsigned int elf_load(elf_ld_t *elf, size_t so_bias);
65
static int segment_header(elf_ld_t *elf, elf_segment_header_t *entry);
62
static int segment_header(elf_ld_t *elf, elf_segment_header_t *entry);
66
static int section_header(elf_ld_t *elf, elf_section_header_t *entry);
63
static int section_header(elf_ld_t *elf, elf_section_header_t *entry);
67
static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry);
64
static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry);
68
 
65
 
69
int elf_load_file(char *file_name, elf_info_t *info)
66
int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info)
70
{
67
{
71
    elf_ld_t elf;
68
    elf_ld_t elf;
72
 
69
 
73
    int fd;
70
    int fd;
74
    int rc;
71
    int rc;
Line 82... Line 79...
82
    }
79
    }
83
 
80
 
84
    elf.fd = fd;
81
    elf.fd = fd;
85
    elf.info = info;
82
    elf.info = info;
86
 
83
 
87
    rc = elf_load(&elf);
84
    rc = elf_load(&elf, so_bias);
88
    printf("elf_load() -> %d\n", rc);
85
    printf("elf_load() -> %d\n", rc);
89
 
86
 
90
    close(fd);
87
    close(fd);
91
 
88
 
92
    return rc;
89
    return rc;
Line 122... Line 119...
122
/** ELF loader
119
/** ELF loader
123
 *
120
 *
124
 * @param header Pointer to ELF header in memory
121
 * @param header Pointer to ELF header in memory
125
 * @return EE_OK on success
122
 * @return EE_OK on success
126
 */
123
 */
127
static unsigned int elf_load(elf_ld_t *elf)
124
static unsigned int elf_load(elf_ld_t *elf, size_t so_bias)
128
{
125
{
129
    elf_header_t header_buf;
126
    elf_header_t header_buf;
130
    elf_header_t *header = &header_buf;
127
    elf_header_t *header = &header_buf;
131
    int i, rc;
128
    int i, rc;
132
 
129
 
Line 168... Line 165...
168
    if (header->e_type != ET_EXEC && header->e_type != ET_DYN) {
165
    if (header->e_type != ET_EXEC && header->e_type != ET_DYN) {
169
        printf("Object type %d is not supported\n", header->e_type);
166
        printf("Object type %d is not supported\n", header->e_type);
170
        return EE_UNSUPPORTED;
167
        return EE_UNSUPPORTED;
171
    }
168
    }
172
 
169
 
173
    /* The run-time dynamic linker is loaded with a bias */
170
    /* Shared objects can be loaded with a bias */
174
    printf("Object type: %d\n", header->e_type);
171
    printf("Object type: %d\n", header->e_type);
175
    if (header->e_type == ET_DYN)
172
    if (header->e_type == ET_DYN)
176
        elf->bias = RTLD_BIAS;
173
        elf->bias = so_bias;
177
    else
174
    else
178
        elf->bias = 0;
175
        elf->bias = 0;
179
 
176
 
180
    printf("Bias set to 0x%d\n", elf->bias);
177
    printf("Bias set to 0x%x\n", elf->bias);
181
 
178
 
182
    printf("parse segments\n");
179
    printf("parse segments\n");
183
 
180
 
184
    /* Walk through all segment headers and process them. */
181
    /* Walk through all segment headers and process them. */
185
    for (i = 0; i < header->e_phnum; i++) {
182
    for (i = 0; i < header->e_phnum; i++) {