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++) { |