Rev 2927 | Rev 3009 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2927 | Rev 3001 | ||
---|---|---|---|
Line 55... | Line 55... | ||
55 | "unsupported image type", |
55 | "unsupported image type", |
56 | "irrecoverable error" |
56 | "irrecoverable error" |
57 | }; |
57 | }; |
58 | 58 | ||
59 | static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, |
59 | static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, |
60 | as_t *as); |
60 | as_t *as, int flags); |
61 | static int section_header(elf_section_header_t *entry, elf_header_t *elf, |
61 | static int section_header(elf_section_header_t *entry, elf_header_t *elf, |
62 | as_t *as); |
62 | as_t *as); |
63 | static int load_segment(elf_segment_header_t *entry, elf_header_t *elf, |
63 | static int load_segment(elf_segment_header_t *entry, elf_header_t *elf, |
64 | as_t *as); |
64 | as_t *as); |
65 | 65 | ||
66 | /** ELF loader |
66 | /** ELF loader |
67 | * |
67 | * |
68 | * @param header Pointer to ELF header in memory |
68 | * @param header Pointer to ELF header in memory |
69 | * @param as Created and properly mapped address space |
69 | * @param as Created and properly mapped address space |
- | 70 | * @param flags A combination of ELD_F_* |
|
70 | * @return EE_OK on success |
71 | * @return EE_OK on success |
71 | */ |
72 | */ |
72 | unsigned int elf_load(elf_header_t *header, as_t * as) |
73 | unsigned int elf_load(elf_header_t *header, as_t * as, int flags) |
73 | { |
74 | { |
74 | int i, rc; |
75 | int i, rc; |
75 | 76 | ||
76 | /* Identify ELF */ |
77 | /* Identify ELF */ |
77 | if (header->e_ident[EI_MAG0] != ELFMAG0 || |
78 | if (header->e_ident[EI_MAG0] != ELFMAG0 || |
Line 104... | Line 105... | ||
104 | for (i = 0; i < header->e_phnum; i++) { |
105 | for (i = 0; i < header->e_phnum; i++) { |
105 | elf_segment_header_t *seghdr; |
106 | elf_segment_header_t *seghdr; |
106 | 107 | ||
107 | seghdr = &((elf_segment_header_t *)(((uint8_t *) header) + |
108 | seghdr = &((elf_segment_header_t *)(((uint8_t *) header) + |
108 | header->e_phoff))[i]; |
109 | header->e_phoff))[i]; |
109 | rc = segment_header(seghdr, header, as); |
110 | rc = segment_header(seghdr, header, as, flags); |
110 | if (rc != EE_OK) |
111 | if (rc != EE_OK) |
111 | return rc; |
112 | return rc; |
112 | } |
113 | } |
113 | 114 | ||
114 | /* Inspect all section headers and proccess them. */ |
115 | /* Inspect all section headers and proccess them. */ |
Line 145... | Line 146... | ||
145 | * @param as Address space into wich the ELF is being loaded. |
146 | * @param as Address space into wich the ELF is being loaded. |
146 | * |
147 | * |
147 | * @return EE_OK on success, error code otherwise. |
148 | * @return EE_OK on success, error code otherwise. |
148 | */ |
149 | */ |
149 | static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, |
150 | static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, |
150 | as_t *as) |
151 | as_t *as, int flags) |
151 | { |
152 | { |
- | 153 | char *interp; |
|
- | 154 | ||
152 | switch (entry->p_type) { |
155 | switch (entry->p_type) { |
153 | case PT_NULL: |
156 | case PT_NULL: |
154 | case PT_PHDR: |
157 | case PT_PHDR: |
155 | break; |
158 | break; |
156 | case PT_LOAD: |
159 | case PT_LOAD: |
157 | return load_segment(entry, elf, as); |
160 | return load_segment(entry, elf, as); |
158 | break; |
161 | break; |
159 | case PT_DYNAMIC: |
162 | case PT_DYNAMIC: |
160 | case PT_INTERP: |
163 | case PT_INTERP: |
- | 164 | interp = (char *)elf + entry->p_offset; |
|
- | 165 | if (memcmp(interp, ELF_INTERP_ZSTR, ELF_INTERP_ZLEN) != 0) { |
|
- | 166 | return EE_UNSUPPORTED; |
|
- | 167 | } |
|
- | 168 | if ((flags & ELD_F_LOADER) == 0) { |
|
- | 169 | return EE_LOADER; |
|
- | 170 | } |
|
- | 171 | break; |
|
161 | case PT_SHLIB: |
172 | case PT_SHLIB: |
162 | case PT_NOTE: |
173 | case PT_NOTE: |
163 | case PT_LOPROC: |
174 | case PT_LOPROC: |
164 | case PT_HIPROC: |
175 | case PT_HIPROC: |
165 | default: |
176 | default: |