elf64_machdep.c (39072) | elf64_machdep.c (40435) |
---|---|
1/*- 2 * Copyright 1996-1998 John D. Polstra. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * | 1/*- 2 * Copyright 1996-1998 John D. Polstra. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 8 unchanged lines hidden (view full) --- 17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * |
25 * $Id$ | 25 * $Id: elf_machdep.c,v 1.1 1998/09/11 08:47:02 dfr Exp $ |
26 */ 27 28#include <sys/param.h> 29#include <sys/kernel.h> 30#include <sys/systm.h> 31#include <sys/malloc.h> 32#include <sys/proc.h> 33#include <sys/namei.h> 34#include <sys/fcntl.h> 35#include <sys/vnode.h> 36#include <sys/linker.h> 37#include <machine/elf.h> 38 39/* Process one elf relocation with addend. */ 40int | 26 */ 27 28#include <sys/param.h> 29#include <sys/kernel.h> 30#include <sys/systm.h> 31#include <sys/malloc.h> 32#include <sys/proc.h> 33#include <sys/namei.h> 34#include <sys/fcntl.h> 35#include <sys/vnode.h> 36#include <sys/linker.h> 37#include <machine/elf.h> 38 39/* Process one elf relocation with addend. */ 40int |
41elf_reloc(linker_file_t lf, const Elf_Rela *rela, const char *sym) | 41elf_reloc(linker_file_t lf, const void *data, int type, const char *sym) |
42{ 43 Elf_Addr relocbase = (Elf_Addr) lf->address; | 42{ 43 Elf_Addr relocbase = (Elf_Addr) lf->address; |
44 Elf_Addr *where = (Elf_Addr *) (relocbase + rela->r_offset); | 44 Elf_Addr *where; 45 Elf_Addr addr, tmp_value; 46 Elf_Addr addend; 47 Elf_Word rtype; 48 const Elf_Rel *rel; 49 const Elf_Rela *rela; |
45 | 50 |
46 switch (ELF_R_TYPE(rela->r_info)) { | 51 switch (type) { 52 case ELF_RELOC_REL: 53 rel = (Elf_Rel *)data; 54 where = (Elf_Addr *) (relocbase + rel->r_offset); 55 addend = *where; 56 rtype = ELF_R_TYPE(rel->r_info); 57 break; 58 case ELF_RELOC_RELA: 59 rela = (Elf_Rela *)data; 60 where = (Elf_Addr *) (relocbase + rela->r_offset); 61 addend = rela->r_addend; 62 rtype = ELF_R_TYPE(rela->r_info); 63 break; 64 default: 65 panic("elf_reloc: unknown relocation mode %d\n", type); 66 } |
47 | 67 |
48 case R_ALPHA_REFQUAD: { 49 Elf_Addr addr; 50 Elf_Addr tmp_value; | 68 switch (rtype) { |
51 | 69 |
70 case R_ALPHA_REFQUAD: |
|
52 addr = (Elf_Addr) 53 linker_file_lookup_symbol(lf, sym, 1); 54 if (addr == NULL) 55 return -1; | 71 addr = (Elf_Addr) 72 linker_file_lookup_symbol(lf, sym, 1); 73 if (addr == NULL) 74 return -1; |
75 addr += addend; 76 if (*where != addr) 77 *where = addr; 78 break; |
|
56 | 79 |
57 tmp_value = addr + *where + rela->r_addend; 58 if (*where != tmp_value) 59 *where = tmp_value; 60 } 61 break; 62 63 case R_ALPHA_GLOB_DAT: { 64 Elf_Addr addr; 65 | 80 case R_ALPHA_GLOB_DAT: |
66 addr = (Elf_Addr) 67 linker_file_lookup_symbol(lf, sym, 1); 68 if (addr == NULL) 69 return -1; | 81 addr = (Elf_Addr) 82 linker_file_lookup_symbol(lf, sym, 1); 83 if (addr == NULL) 84 return -1; |
70 | |
71 if (*where != addr) 72 *where = addr; | 85 if (*where != addr) 86 *where = addr; |
73 } 74 break; | 87 break; |
75 | 88 |
76 case R_ALPHA_JMP_SLOT: { | 89 case R_ALPHA_JMP_SLOT: |
77 /* No point in lazy binding for kernel modules. */ | 90 /* No point in lazy binding for kernel modules. */ |
78 Elf_Addr addr; 79 | |
80 addr = (Elf_Addr) 81 linker_file_lookup_symbol(lf, sym, 1); 82 if (addr == NULL) 83 return -1; | 91 addr = (Elf_Addr) 92 linker_file_lookup_symbol(lf, sym, 1); 93 if (addr == NULL) 94 return -1; |
84 | |
85 if (*where != addr) 86 *where = addr; | 95 if (*where != addr) 96 *where = addr; |
87 } 88 break; | 97 break; |
89 | 98 |
90 case R_ALPHA_RELATIVE: { 91 *where += relocbase; 92 } 93 break; | 99 case R_ALPHA_RELATIVE: 100 addr = relocbase + addend; 101 if (*where != addr) 102 *where = addr; 103 break; |
94 | 104 |
95 case R_ALPHA_COPY: { | 105 case R_ALPHA_COPY: |
96 /* 97 * There shouldn't be copy relocations in kernel 98 * objects. 99 */ 100 printf("kldload: unexpected R_COPY relocation\n"); 101 return -1; | 106 /* 107 * There shouldn't be copy relocations in kernel 108 * objects. 109 */ 110 printf("kldload: unexpected R_COPY relocation\n"); 111 return -1; |
102 } 103 break; | |
104 105 default: 106 printf("kldload: unexpected relocation type %d\n", | 112 113 default: 114 printf("kldload: unexpected relocation type %d\n", |
107 ELF_R_TYPE(rela->r_info)); | 115 rtype); |
108 return -1; 109 } 110 return(0); 111} | 116 return -1; 117 } 118 return(0); 119} |