Rev 2965 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2965 | Rev 2966 | ||
---|---|---|---|
Line 104... | Line 104... | ||
104 | while (dynamic[i].d_tag != 0) { |
104 | while (dynamic[i].d_tag != 0) { |
105 | dptr = (void *)(dynamic[i].d_un.d_val + bias); |
105 | dptr = (void *)(dynamic[i].d_un.d_val + bias); |
106 | dval = dynamic[i].d_un.d_val; |
106 | dval = dynamic[i].d_un.d_val; |
107 | 107 | ||
108 | switch (dynamic[i].d_tag) { |
108 | switch (dynamic[i].d_tag) { |
109 | case 2/* DT_PLTRELSZ */: jmp_rel_entries = dval/8; break; |
109 | case DT_PLTRELSZ: jmp_rel_entries = dval/8; break; |
110 | case 23/* DT_JMPREL */: jmp_rel_table = dptr; break; |
110 | case DT_JMPREL: jmp_rel_table = dptr; break; |
111 | case 3 /* DT_PLTGOT */: |
111 | case DT_PLTGOT: |
112 | /* GOT address */ |
112 | /* GOT address */ |
113 | got = dptr; break; |
113 | got = dptr; break; |
114 | case 6 /* DT_SYMTAB */ : sym_table = dptr; break; |
114 | case DT_SYMTAB: sym_table = dptr; break; |
115 | case 17 /* DT_REL */ : rel_table = dptr; break; |
115 | case DT_REL: rel_table = dptr; break; |
116 | case 18 /* DT_RELSZ */ : rel_entries = dval / 8; break; |
116 | case DT_RELSZ: rel_entries = dval / 8; break; |
117 | default: break; |
117 | default: break; |
118 | } |
118 | } |
119 | 119 | ||
120 | ++i; |
120 | ++i; |
121 | } |
121 | } |
Line 137... | Line 137... | ||
137 | 137 | ||
138 | kputint(rel_type); |
138 | kputint(rel_type); |
139 | kputint(r_offset); |
139 | kputint(r_offset); |
140 | 140 | ||
141 | switch (rel_type) { |
141 | switch (rel_type) { |
142 | case 6: /* R_386_GLOB_DAT */ |
142 | case R_386_GLOB_DAT: |
143 | case 7: /* R_386_JUMP_SLOT */ |
143 | case R_386_JUMP_SLOT: |
144 | kputint(16); |
144 | kputint(16); |
145 | sym_idx = ELF32_R_SYM(r_info); |
145 | sym_idx = ELF32_R_SYM(r_info); |
146 | 146 | ||
147 | sym_addr = sym_table[sym_idx].st_value + bias; |
147 | sym_addr = sym_table[sym_idx].st_value + bias; |
148 | kputint(sym_idx); |
148 | kputint(sym_idx); |
149 | kputint(sym_addr); |
149 | kputint(sym_addr); |
150 | 150 | ||
151 | *(unsigned *)(r_offset+bias) = sym_addr; |
151 | *(unsigned *)(r_offset+bias) = sym_addr; |
152 | break; |
152 | break; |
153 | 153 | ||
154 | case 1: /* R_386_32 */ |
154 | case R_386_32: |
155 | kputint(16); |
155 | kputint(16); |
156 | sym_idx = ELF32_R_SYM(r_info); |
156 | sym_idx = ELF32_R_SYM(r_info); |
157 | 157 | ||
158 | sym_addr = sym_table[sym_idx].st_value + bias; |
158 | sym_addr = sym_table[sym_idx].st_value + bias; |
159 | kputint(sym_idx); |
159 | kputint(sym_idx); |
160 | kputint(sym_addr); |
160 | kputint(sym_addr); |
161 | 161 | ||
162 | *(unsigned *)(r_offset+bias) += sym_addr; |
162 | *(unsigned *)(r_offset+bias) += sym_addr; |
163 | break; |
163 | break; |
164 | 164 | ||
165 | case 8: /* R_386_RELATIVE */ |
165 | case R_386_RELATIVE: |
166 | kputint(16); |
166 | kputint(16); |
167 | *(unsigned *)(r_offset+bias) += bias; |
167 | *(unsigned *)(r_offset+bias) += bias; |
168 | break; |
168 | break; |
169 | } |
169 | } |
170 | } |
170 | } |
Line 180... | Line 180... | ||
180 | 180 | ||
181 | kputint(rel_type); |
181 | kputint(rel_type); |
182 | kputint(r_offset); |
182 | kputint(r_offset); |
183 | 183 | ||
184 | switch (rel_type) { |
184 | switch (rel_type) { |
185 | case 6: /* R_386_GLOB_DAT */ |
185 | case R_386_GLOB_DAT: |
186 | case 7: /* R_386_JUMP_SLOT */ |
186 | case R_386_JUMP_SLOT: |
187 | kputint(16); |
187 | kputint(16); |
188 | sym_idx = ELF32_R_SYM(r_info); |
188 | sym_idx = ELF32_R_SYM(r_info); |
189 | 189 | ||
190 | sym_addr = sym_table[sym_idx].st_value + bias; |
190 | sym_addr = sym_table[sym_idx].st_value + bias; |
191 | kputint(sym_idx); |
191 | kputint(sym_idx); |
192 | kputint(sym_addr); |
192 | kputint(sym_addr); |
193 | 193 | ||
194 | *(unsigned *)(r_offset+bias) = sym_addr; |
194 | *(unsigned *)(r_offset+bias) = sym_addr; |
195 | break; |
195 | break; |
196 | 196 | ||
197 | case 1: /* R_386_32 */ |
197 | case R_386_32: |
198 | kputint(16); |
198 | kputint(16); |
199 | sym_idx = ELF32_R_SYM(r_info); |
199 | sym_idx = ELF32_R_SYM(r_info); |
200 | 200 | ||
201 | sym_addr = sym_table[sym_idx].st_value + bias; |
201 | sym_addr = sym_table[sym_idx].st_value + bias; |
202 | kputint(sym_idx); |
202 | kputint(sym_idx); |
203 | kputint(sym_addr); |
203 | kputint(sym_addr); |
204 | 204 | ||
205 | *(unsigned *)(r_offset+bias) += sym_addr; |
205 | *(unsigned *)(r_offset+bias) += sym_addr; |
206 | break; |
206 | break; |
207 | 207 | ||
208 | case 8: /* R_386_RELATIVE */ |
208 | case R_386_RELATIVE: |
209 | kputint(16); |
209 | kputint(16); |
210 | *(unsigned *)(r_offset+bias) += bias; |
210 | *(unsigned *)(r_offset+bias) += bias; |
211 | break; |
211 | break; |
212 | } |
212 | } |
213 | } |
213 | } |