71,19 → 71,6 |
static int section_header(elf_ld_t *elf, elf_section_header_t *entry); |
static int load_segment(elf_ld_t *elf, elf_segment_header_t *entry); |
|
/** Read until the buffer is read in its entirety. */ |
static int my_read(int fd, char *buf, size_t len) |
{ |
int cnt = 0; |
do { |
buf += cnt; |
len -= cnt; |
cnt = read(fd, buf, len); |
} while ((cnt > 0) && ((len - cnt) > 0)); |
|
return cnt; |
} |
|
/** Load ELF binary from a file. |
* |
* Load an ELF binary from the specified file. If the file is |
169,7 → 156,7 |
elf_header_t *header = &header_buf; |
int i, rc; |
|
rc = my_read(elf->fd, header, sizeof(elf_header_t)); |
rc = read(elf->fd, header, sizeof(elf_header_t)); |
if (rc < 0) { |
printf("read error\n"); |
return EE_INVALID; |
236,12 → 223,8 |
lseek(elf->fd, header->e_phoff |
+ i * sizeof(elf_segment_header_t), SEEK_SET); |
|
rc = my_read(elf->fd, &segment_hdr, |
sizeof(elf_segment_header_t)); |
if (rc < 0) { |
printf("read error\n"); |
return EE_INVALID; |
} |
rc = read(elf->fd, &segment_hdr, sizeof(elf_segment_header_t)); |
if (rc < 0) { printf("read error\n"); return EE_INVALID; } |
|
rc = segment_header(elf, &segment_hdr); |
if (rc != EE_OK) |
258,12 → 241,8 |
lseek(elf->fd, header->e_shoff |
+ i * sizeof(elf_section_header_t), SEEK_SET); |
|
rc = my_read(elf->fd, §ion_hdr, |
sizeof(elf_section_header_t)); |
if (rc < 0) { |
printf("read error\n"); |
return EE_INVALID; |
} |
rc = read(elf->fd, §ion_hdr, sizeof(elf_section_header_t)); |
if (rc < 0) { printf("read error\n"); return EE_INVALID; } |
|
rc = section_header(elf, §ion_hdr); |
if (rc != EE_OK) |
347,10 → 326,9 |
if (entry->p_align > 1) { |
if ((entry->p_offset % entry->p_align) != |
(entry->p_vaddr % entry->p_align)) { |
printf("align check 1 failed offset%%align=%d, " |
"vaddr%%align=%d\n", |
entry->p_offset % entry->p_align, |
entry->p_vaddr % entry->p_align |
printf("align check 1 failed offset%%align=%d, vaddr%%align=%d\n", |
entry->p_offset % entry->p_align, |
entry->p_vaddr % entry->p_align |
); |
return EE_INVALID; |
} |
376,8 → 354,8 |
* For the course of loading, the area needs to be readable |
* and writeable. |
*/ |
a = as_area_create((uint8_t *)base + bias, mem_sz, |
AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); |
a = as_area_create((uint8_t *)base + bias, |
mem_sz, AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE); |
if (a == (void *)(-1)) { |
printf("memory mapping failed\n"); |
return EE_MEMORY; |
391,10 → 369,7 |
*/ |
// printf("seek to %d\n", entry->p_offset); |
rc = lseek(elf->fd, entry->p_offset, SEEK_SET); |
if (rc < 0) { |
printf("seek error\n"); |
return EE_INVALID; |
} |
if (rc < 0) { printf("seek error\n"); return EE_INVALID; } |
|
// printf("read 0x%x bytes to address 0x%x\n", entry->p_filesz, entry->p_vaddr+bias); |
/* rc = read(fd, (void *)(entry->p_vaddr + bias), entry->p_filesz); |
413,13 → 388,10 |
if (now > left) now = left; |
|
// printf("read %d...", now); |
rc = my_read(elf->fd, dp, now); |
rc = read(elf->fd, dp, now); |
// printf("->%d\n", rc); |
|
if (rc < 0) { |
printf("read error\n"); |
return EE_INVALID; |
} |
if (rc < 0) { printf("read error\n"); return EE_INVALID; } |
|
left -= now; |
dp += now; |