Rev 3687 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3687 | Rev 3688 | ||
---|---|---|---|
Line 33... | Line 33... | ||
33 | /** |
33 | /** |
34 | * @file |
34 | * @file |
35 | */ |
35 | */ |
36 | 36 | ||
37 | #include <stdio.h> |
37 | #include <stdio.h> |
- | 38 | #include <stdlib.h> |
|
38 | 39 | ||
39 | #include <arch.h> |
- | |
40 | #include <elf_dyn.h> |
40 | #include <elf_dyn.h> |
41 | #include <symbol.h> |
41 | #include <symbol.h> |
42 | #include <rtld.h> |
42 | #include <rtld.h> |
43 | 43 | ||
- | 44 | #include <rtld_arch.h> |
|
- | 45 | ||
44 | void module_process_pre_arch(module_t *m) |
46 | void module_process_pre_arch(module_t *m) |
45 | { |
47 | { |
46 | /* Unused */ |
48 | /* Unused */ |
47 | } |
49 | } |
48 | 50 | ||
Line 62... | Line 64... | ||
62 | uintptr_t sym_addr; |
64 | uintptr_t sym_addr; |
63 | 65 | ||
64 | elf_symbol_t *sym_table; |
66 | elf_symbol_t *sym_table; |
65 | elf_symbol_t *sym; |
67 | elf_symbol_t *sym; |
66 | uint32_t *r_ptr; |
68 | uint32_t *r_ptr; |
- | 69 | uint32_t sym_size; |
|
67 | char *str_tab; |
70 | char *str_tab; |
68 | 71 | ||
69 | elf_symbol_t *sym_def; |
72 | elf_symbol_t *sym_def; |
70 | module_t *dest; |
73 | module_t *dest; |
71 | 74 | ||
Line 109... | Line 112... | ||
109 | } |
112 | } |
110 | 113 | ||
111 | switch (rel_type) { |
114 | switch (rel_type) { |
112 | case R_386_GLOB_DAT: |
115 | case R_386_GLOB_DAT: |
113 | case R_386_JUMP_SLOT: |
116 | case R_386_JUMP_SLOT: |
114 | // DPRINTF("fixup R_386_GLOB_DAT/JUMP_SLOT (b+v)\n"); |
117 | DPRINTF("fixup R_386_GLOB_DAT/JUMP_SLOT (b+v)\n"); |
115 | *r_ptr = sym_addr; |
118 | *r_ptr = sym_addr; |
116 | break; |
119 | break; |
117 | 120 | ||
118 | case R_386_32: |
121 | case R_386_32: |
119 | // DPRINTF("fixup R_386_32 (b+v+a)\n"); |
122 | DPRINTF("fixup R_386_32 (b+v+a)\n"); |
120 | *r_ptr += sym_addr; |
123 | *r_ptr += sym_addr; |
121 | break; |
124 | break; |
122 | 125 | ||
123 | case R_386_PC32: |
126 | case R_386_PC32: |
124 | // DPRINTF("fixup R_386_PC32 (b+v+a)\n"); |
127 | DPRINTF("fixup R_386_PC32 (b+v+a)\n"); |
125 | *r_ptr += sym_addr - (uint32_t) r_ptr; |
128 | *r_ptr += sym_addr - (uint32_t) r_ptr; |
126 | break; |
129 | break; |
- | 130 | ||
- | 131 | case R_386_COPY: |
|
- | 132 | /* |
|
- | 133 | * Copy symbol data from shared object to specified |
|
- | 134 | * location. |
|
- | 135 | */ |
|
- | 136 | DPRINTF("fixup R_386_COPY (s)\n"); |
|
- | 137 | sym_size = sym->st_size; |
|
- | 138 | if (sym_size != sym_def->st_size) { |
|
- | 139 | printf("Warning: Mismatched symbol sizes.\n"); |
|
- | 140 | /* Take the lower value. */ |
|
- | 141 | if (sym_size > sym_def->st_size) |
|
- | 142 | sym_size = sym_def->st_size; |
|
- | 143 | } |
|
- | 144 | memcpy(r_ptr, (const void *)sym_addr, sym_size); |
|
- | 145 | break; |
|
127 | 146 | ||
128 | case R_386_RELATIVE: |
147 | case R_386_RELATIVE: |
129 | // DPRINTF("fixup R_386_RELATIVE (b+a)\n"); |
148 | DPRINTF("fixup R_386_RELATIVE (b+a)\n"); |
130 | *r_ptr += m->bias; |
149 | *r_ptr += m->bias; |
131 | break; |
150 | break; |
132 | 151 | ||
- | 152 | case R_386_TLS_DTPMOD32: |
|
- | 153 | /* |
|
- | 154 | * We can ignore this as long as the only module |
|
- | 155 | * with TLS variables is libc.so. |
|
133 | default: |
156 | */ |
134 | printf("Unknown relocation type %d\n", rel_type); |
157 | DPRINTF("Ignoring R_386_TLS_DTPMOD32\n"); |
135 | break; |
158 | break; |
- | 159 | ||
- | 160 | default: |
|
- | 161 | printf("Error: Unknown relocation type %d\n", |
|
- | 162 | rel_type); |
|
- | 163 | exit(1); |
|
136 | } |
164 | } |
137 | 165 | ||
138 | } |
166 | } |
139 | 167 | ||
140 | } |
168 | } |