Changeset View
Changeset View
Standalone View
Standalone View
stand/common/reloc_elf.c
Show First 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | if ((char *)where < (char *)data || (char *)where >= (char *)data + len) | ||||
return (0); | return (0); | ||||
if (reltype == ELF_RELOC_REL) | if (reltype == ELF_RELOC_REL) | ||||
addend = *where; | addend = *where; | ||||
/* XXX, definitions not available on i386. */ | /* XXX, definitions not available on i386. */ | ||||
#define R_X86_64_64 1 | #define R_X86_64_64 1 | ||||
#define R_X86_64_RELATIVE 8 | #define R_X86_64_RELATIVE 8 | ||||
#define R_X86_64_IRELATIVE 37 | |||||
switch (rtype) { | switch (rtype) { | ||||
case R_X86_64_64: /* S + A */ | case R_X86_64_64: /* S + A */ | ||||
addr = symaddr(ef, symidx); | addr = symaddr(ef, symidx); | ||||
if (addr == 0) | if (addr == 0) | ||||
return (ESRCH); | return (ESRCH); | ||||
val = addr + addend; | val = addr + addend; | ||||
*where = val; | *where = val; | ||||
break; | break; | ||||
case R_X86_64_RELATIVE: | case R_X86_64_RELATIVE: | ||||
addr = (Elf_Addr)addend + relbase; | addr = (Elf_Addr)addend + relbase; | ||||
val = addr; | val = addr; | ||||
*where = val; | *where = val; | ||||
break; | break; | ||||
case R_X86_64_IRELATIVE: | |||||
/* leave it to kernel */ | |||||
break; | |||||
default: | default: | ||||
printf("\nunhandled relocation type %u\n", (u_int)rtype); | printf("\nunhandled relocation type %u\n", (u_int)rtype); | ||||
return (EFTYPE); | return (EFTYPE); | ||||
} | } | ||||
return (0); | return (0); | ||||
#elif defined(__i386__) && __ELF_WORD_SIZE == 32 | #elif defined(__i386__) && __ELF_WORD_SIZE == 32 | ||||
Elf_Addr addend, addr, *where, val; | Elf_Addr addend, addr, *where, val; | ||||
Show All 28 Lines | #elif defined(__i386__) && __ELF_WORD_SIZE == 32 | ||||
if (reltype == ELF_RELOC_REL) | if (reltype == ELF_RELOC_REL) | ||||
addend = *where; | addend = *where; | ||||
/* XXX, definitions not available on amd64. */ | /* XXX, definitions not available on amd64. */ | ||||
#define R_386_32 1 /* Add symbol value. */ | #define R_386_32 1 /* Add symbol value. */ | ||||
#define R_386_GLOB_DAT 6 /* Set GOT entry to data address. */ | #define R_386_GLOB_DAT 6 /* Set GOT entry to data address. */ | ||||
#define R_386_RELATIVE 8 /* Add load address of shared object. */ | #define R_386_RELATIVE 8 /* Add load address of shared object. */ | ||||
#define R_386_IRELATIVE 42 | |||||
switch (rtype) { | switch (rtype) { | ||||
case R_386_RELATIVE: | case R_386_RELATIVE: | ||||
addr = addend + relbase; | addr = addend + relbase; | ||||
*where = addr; | *where = addr; | ||||
break; | break; | ||||
case R_386_32: /* S + A */ | case R_386_32: /* S + A */ | ||||
addr = symaddr(ef, symidx); | addr = symaddr(ef, symidx); | ||||
if (addr == 0) | if (addr == 0) | ||||
return (ESRCH); | return (ESRCH); | ||||
val = addr + addend; | val = addr + addend; | ||||
*where = val; | *where = val; | ||||
break; | |||||
case R_386_IRELATIVE: | |||||
/* leave it to kernel */ | |||||
break; | break; | ||||
default: | default: | ||||
printf("\nunhandled relocation type %u\n", (u_int)rtype); | printf("\nunhandled relocation type %u\n", (u_int)rtype); | ||||
return (EFTYPE); | return (EFTYPE); | ||||
} | } | ||||
return (0); | return (0); | ||||
#elif defined(__powerpc__) | #elif defined(__powerpc__) | ||||
Show All 28 Lines |