Deleted Added
full compact
elf32_machdep.c (39072) elf32_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}