Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3680 → Rev 3681

/branches/dynload/uspace/lib/rtld/arch/ppc32/_link.ld.in
File deleted
/branches/dynload/uspace/lib/rtld/arch/ppc32/include/elf_dyn.h
40,7 → 40,11
*/
 
#define R_PPC_ADDR32 1
#define R_PPC_ADDR16_LO 4
#define R_PPC_ADDR16_HI 5
#define R_PPC_ADDR16_HA 6
#define R_PPC_REL24 10
#define R_PPC_COPY 19
#define R_PPC_JMP_SLOT 21
#define R_PPC_RELATIVE 22
 
/branches/dynload/uspace/lib/rtld/arch/ppc32/Makefile.inc
29,5 → 29,4
CFLAGS += -D__32_BITS__
 
ARCH_SOURCES := \
arch/$(ARCH)/src/reloc.c \
arch/$(ARCH)/src/start.s
arch/$(ARCH)/src/reloc.c
/branches/dynload/uspace/lib/rtld/arch/ppc32/src/start.s
File deleted
/branches/dynload/uspace/lib/rtld/arch/ppc32/src/reloc.c
144,6 → 144,7
elf_symbol_t *sym_table;
elf_symbol_t *sym;
uint32_t *r_ptr;
uint16_t *r_ptr16;
char *str_tab;
elf_symbol_t *sym_def;
154,6 → 155,8
uint32_t *_plt_ent;
uint32_t plt_n;
uint32_t pidx;
uint32_t t_addr;
uint32_t sym_size;
 
plt = m->dyn.plt_got;
plt_n = m->dyn.plt_rel_sz / sizeof(elf_rela_t);
184,6 → 187,7
 
rel_type = ELF32_R_TYPE(r_info);
r_ptr = (uint32_t *)(r_offset + m->bias);
r_ptr16 = (uint16_t *)(r_offset + m->bias);
 
if (sym->st_name != 0) {
DPRINTF("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
201,6 → 205,22
}
 
switch (rel_type) {
case R_PPC_ADDR16_LO:
DPRINTF("fixup R_PPC_ADDR16_LO (#lo(s+a))\n");
*r_ptr16 = (sym_addr + r_addend) & 0xffff;
break;
 
case R_PPC_ADDR16_HI:
DPRINTF("fixup R_PPC_ADDR16_HI (#hi(s+a))\n");
*r_ptr16 = (sym_addr + r_addend) >> 16;
break;
 
case R_PPC_ADDR16_HA:
DPRINTF("fixup R_PPC_ADDR16_HA (#ha(s+a))\n");
t_addr = sym_addr + r_addend;
*r_ptr16 = (t_addr >> 16) + ((t_addr & 0x8000) ? 1 : 0);
break;
 
case R_PPC_JMP_SLOT:
DPRINTF("fixup R_PPC_JMP_SLOT (b+v)\n");
pidx = (r_ptr - _plt_ent) / 2;
217,6 → 237,22
DPRINTF("fixup R_PPC_ADDR32 (b+v+a)\n");
*r_ptr = r_addend + sym_addr;
break;
 
case R_PPC_COPY:
/*
* Copy symbol data from shared object to specified
* location.
*/
DPRINTF("fixup R_PPC_COPY (s)\n");
sym_size = sym->st_size;
if (sym_size != sym_def->st_size) {
printf("warning: mismatched symbol sizes\n");
/* Take the lower value. */
if (sym_size > sym_def->st_size)
sym_size = sym_def->st_size;
}
memcpy(r_ptr, (const void *)sym_addr, sym_size);
break;
case R_PPC_RELATIVE:
DPRINTF("fixup R_PPC_RELATIVE (b+a)\n");
229,7 → 265,7
/*TODO*/
break;
default:
printf("unknown relocation type\n");
printf("unknown relocation type %d\n", rel_type);
break;
}
}
/branches/dynload/uspace/lib/rtld/arch/ia32/_link.ld.in
File deleted
/branches/dynload/uspace/lib/rtld/arch/ia32/Makefile.inc
29,5 → 29,4
CFLAGS += -D__32_BITS__
 
ARCH_SOURCES := \
arch/$(ARCH)/src/reloc.c \
arch/$(ARCH)/src/start.c
arch/$(ARCH)/src/reloc.c
/branches/dynload/uspace/lib/rtld/arch/ia32/src/start.c
File deleted
/branches/dynload/uspace/lib/rtld/arch/ia32/src/reloc.c
124,7 → 124,12
// DPRINTF("fixup R_386_RELATIVE (b+a)\n");
*r_ptr += m->bias;
break;
 
default:
printf("Unknown relocation type %d\n", rel_type);
break;
}
 
}
 
}