version 1.1.1.1, 2008/06/03 10:38:51 |
version 1.1.1.1.2.1, 2008/08/13 17:12:43 |
|
|
if (vm_map(task, (void *)phdr->p_vaddr, size, &mapped) != 0) |
if (vm_map(task, (void *)phdr->p_vaddr, size, &mapped) != 0) |
return ENOEXEC; |
return ENOEXEC; |
if (phdr->p_filesz > 0) { |
if (phdr->p_filesz > 0) { |
if (lseek(fd, phdr->p_offset, SEEK_SET) == -(off_t)1) |
if (lseek(fd, (off_t)phdr->p_offset, SEEK_SET) |
|
== -(off_t)1) |
goto err; |
goto err; |
if (read(fd, mapped, phdr->p_filesz) < 0) |
if (read(fd, mapped, phdr->p_filesz) < 0) |
goto err; |
goto err; |
|
|
+ sym->st_value; |
+ sym->st_value; |
if (relocate_rela(rela, sym_val, target_sect) != 0) |
if (relocate_rela(rela, sym_val, target_sect) != 0) |
return -1; |
return -1; |
} else if (ELF32_ST_BIND(sym->st_info) == STB_WEAK) |
} else if (ELF32_ST_BIND(sym->st_info) == STB_WEAK) { |
dprintf("undefined weak symbol for rela[%d]\n", i); |
DPRINTF(("undefined weak symbol for rela[%d]\n", i)); |
|
} |
rela++; |
rela++; |
} |
} |
return 0; |
return 0; |
|
|
+ sym->st_value; |
+ sym->st_value; |
if (relocate_rel(rel, sym_val, target_sect) != 0) |
if (relocate_rel(rel, sym_val, target_sect) != 0) |
return -1; |
return -1; |
} else if (ELF32_ST_BIND(sym->st_info) == STB_WEAK) |
} else if (ELF32_ST_BIND(sym->st_info) == STB_WEAK) { |
dprintf("undefined weak symbol for rel[%d]\n", i); |
DPRINTF(("undefined weak symbol for rel[%d]\n", i)); |
|
} |
rel++; |
rel++; |
} |
} |
return 0; |
return 0; |
|
|
char *target_sect; |
char *target_sect; |
int nr_reloc, err; |
int nr_reloc, err; |
|
|
dprintf("relocate_sec\n"); |
DPRINTF(("relocate_sec\n")); |
if (shdr->sh_entsize == 0) |
if (shdr->sh_entsize == 0) |
return 0; |
return 0; |
if ((target_sect = sect_addr[shdr->sh_info]) == 0) |
if ((target_sect = sect_addr[shdr->sh_info]) == 0) |
|
|
shdr = (Elf32_Shdr *)buf; |
shdr = (Elf32_Shdr *)buf; |
for (i = 0; i < ehdr->e_shnum; i++, shdr++) { |
for (i = 0; i < ehdr->e_shnum; i++, shdr++) { |
/* |
/* |
*dprintf("section: type=%x addr=%x size=%d offset=%x flags=%x\n", |
*DPRINTF(("section: type=%x addr=%x size=%d offset=%x flags=%x\n", |
* shdr->sh_type, shdr->sh_addr, shdr->sh_size, |
* shdr->sh_type, shdr->sh_addr, shdr->sh_size, |
* shdr->sh_offset, shdr->sh_flags); |
* shdr->sh_offset, shdr->sh_flags)); |
*/ |
*/ |
sect_addr[i] = 0; |
sect_addr[i] = 0; |
if (shdr->sh_type == SHT_PROGBITS) { |
if (shdr->sh_type == SHT_PROGBITS) { |
|
|
if (shdr->sh_type == SHT_REL || shdr->sh_type == SHT_RELA) { |
if (shdr->sh_type == SHT_REL || shdr->sh_type == SHT_RELA) { |
if (relocate_section(shdr, sect_addr[i]) != 0) { |
if (relocate_section(shdr, sect_addr[i]) != 0) { |
err = EIO; |
err = EIO; |
sys_log("exec: relocation failed\n"); |
DPRINTF(("exec: relocation failed\n")); |
goto out2; |
goto out2; |
} |
} |
} |
} |