Rev 2933 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2933 | Rev 2952 | ||
---|---|---|---|
Line 32... | Line 32... | ||
32 | */ |
32 | */ |
33 | /** |
33 | /** |
34 | * @file |
34 | * @file |
35 | */ |
35 | */ |
36 | 36 | ||
- | 37 | void __main(void); |
|
- | 38 | void __io_init(void); |
|
- | 39 | void __exit(void); |
|
- | 40 | ||
37 | void _rtld_main(void); |
41 | void _rtld_main(void); |
38 | 42 | ||
39 | #define ELF32_R_SYM(i) ((i)>>8) |
43 | #define ELF32_R_SYM(i) ((i)>>8) |
40 | #define ELF32_R_TYPE(i) ((unsigned char)(i)) |
44 | #define ELF32_R_TYPE(i) ((unsigned char)(i)) |
41 | 45 | ||
Line 89... | Line 93... | ||
89 | unsigned sym_idx; |
93 | unsigned sym_idx; |
90 | unsigned sym_addr; |
94 | unsigned sym_addr; |
91 | 95 | ||
92 | elf32_sym *sym_table; |
96 | elf32_sym *sym_table; |
93 | elf32_rel *rel_table; |
97 | elf32_rel *rel_table; |
- | 98 | elf32_rel *jmp_rel_table; |
|
- | 99 | elf32_rel *jmp_rel_entries; |
|
94 | 100 | ||
95 | asm volatile ( |
101 | asm volatile ( |
96 | "movl $30, %eax;" |
102 | "movl $30, %eax;" |
97 | "int $0x30" |
103 | "int $0x30" |
98 | ); |
104 | ); |
Line 106... | Line 112... | ||
106 | );*/ |
112 | );*/ |
107 | 113 | ||
108 | 114 | ||
109 | asm volatile ( |
115 | asm volatile ( |
110 | /* Calculate the bias into %0 */ |
116 | /* Calculate the bias into %0 */ |
- | 117 | /* Generates "fake" R_386_RELATIVE run-time relocation */ |
|
111 | " call .L0;" |
118 | " call .L0;" |
112 | ".L0: pop %0;" |
119 | ".L0: pop %0;" |
113 | " subl $.L0, %0;" |
120 | " subl $.L0, %0;" |
114 | 121 | ||
115 | /* Calculate run-time address of _DYNAMIC into %1 */ |
122 | /* Calculate run-time address of _DYNAMIC into %1 */ |
- | 123 | /* Generates "fake" R_386_RELATIVE run-time relocation */ |
|
116 | " movl $_DYNAMIC, %1;" /* Again, at link time 0-based VMA gets in */ |
124 | " movl $_DYNAMIC, %1;" /* Again, at link time 0-based VMA gets in */ |
117 | " addl %0, %1;" /* Add bias to compute run-time address */ |
125 | " addl %0, %1;" /* Add bias to compute run-time address */ |
118 | 126 | ||
119 | : "=r" (bias), "=r" (dynamic) |
127 | : "=r" (bias), "=r" (dynamic) |
120 | ); |
128 | ); |
Line 125... | Line 133... | ||
125 | /* parse DYNAMIC */ |
133 | /* parse DYNAMIC */ |
126 | got = 0; |
134 | got = 0; |
127 | sym_table = 0; |
135 | sym_table = 0; |
128 | rel_table = 0; |
136 | rel_table = 0; |
129 | rel_entries = 0; |
137 | rel_entries = 0; |
- | 138 | jmp_rel_table = 0; |
|
- | 139 | jmp_rel_entries = 0; |
|
130 | 140 | ||
131 | i = 0; |
141 | i = 0; |
132 | while (dynamic[i].d_tag != 0) { |
142 | while (dynamic[i].d_tag != 0) { |
133 | dptr = (unsigned *)(dynamic[i].d_un.d_val + bias); |
143 | dptr = (unsigned *)(dynamic[i].d_un.d_val + bias); |
134 | dval = dynamic[i].d_un.d_val; |
144 | dval = dynamic[i].d_un.d_val; |
135 | 145 | ||
136 | switch (dynamic[i].d_tag) { |
146 | switch (dynamic[i].d_tag) { |
- | 147 | case 2/* DT_PLTRELSZ */: jmp_rel_entries = dval/8; break; |
|
- | 148 | case 23/* DT_JMPREL */: jmp_rel_table = dptr; break; |
|
137 | case 3 /* DT_PLTGOT */: |
149 | case 3 /* DT_PLTGOT */: |
138 | /* GOT address */ |
150 | /* GOT address */ |
139 | got = dptr; break; |
151 | got = dptr; break; |
140 | case 6 /* DT_SYMTAB */ : sym_table = dptr; break; |
152 | case 6 /* DT_SYMTAB */ : sym_table = dptr; break; |
141 | case 17 /* DT_REL */ : rel_table = dptr; break; |
153 | case 17 /* DT_REL */ : rel_table = dptr; break; |
Line 162... | Line 174... | ||
162 | rel_type = ELF32_R_TYPE(r_info); |
174 | rel_type = ELF32_R_TYPE(r_info); |
163 | 175 | ||
164 | kputint(rel_type); |
176 | kputint(rel_type); |
165 | kputint(r_offset); |
177 | kputint(r_offset); |
166 | 178 | ||
- | 179 | switch (rel_type) { |
|
- | 180 | case 6: /* R_386_GLOB_DAT */ |
|
167 | if (rel_type == 7 /* R_386_JUMP_SLOT */) { |
181 | case 7: /* R_386_JUMP_SLOT */ |
168 | kputint(16); |
182 | kputint(16); |
169 | sym_idx = ELF32_R_SYM(r_info); |
183 | sym_idx = ELF32_R_SYM(r_info); |
170 | 184 | ||
171 | sym_addr = sym_table[sym_idx].st_value + bias; |
185 | sym_addr = sym_table[sym_idx].st_value + bias; |
172 | kputint(sym_idx); |
186 | kputint(sym_idx); |
173 | kputint(sym_addr); |
187 | kputint(sym_addr); |
174 | 188 | ||
175 | *(unsigned *)(r_offset+bias) = sym_addr; |
189 | *(unsigned *)(r_offset+bias) = sym_addr; |
- | 190 | break; |
|
- | 191 | ||
- | 192 | case 1: /* R_386_32 */ |
|
- | 193 | kputint(16); |
|
- | 194 | sym_idx = ELF32_R_SYM(r_info); |
|
- | 195 | ||
- | 196 | sym_addr = sym_table[sym_idx].st_value + bias; |
|
- | 197 | kputint(sym_idx); |
|
- | 198 | kputint(sym_addr); |
|
- | 199 | ||
- | 200 | *(unsigned *)(r_offset+bias) += sym_addr; |
|
- | 201 | break; |
|
- | 202 | ||
- | 203 | case 8: /* R_386_RELATIVE */ |
|
- | 204 | kputint(16); |
|
- | 205 | *(unsigned *)(r_offset+bias) += bias; |
|
- | 206 | break; |
|
176 | } |
207 | } |
177 | } |
208 | } |
178 | 209 | ||
179 | kputint(-1); |
210 | kputint(-1); |
- | 211 | ||
- | 212 | for (i=0; i<jmp_rel_entries; i++) { |
|
- | 213 | kputint(i); |
|
- | 214 | r_offset = jmp_rel_table[i].r_offset; |
|
- | 215 | r_info = jmp_rel_table[i].r_info; |
|
- | 216 | ||
- | 217 | rel_type = ELF32_R_TYPE(r_info); |
|
- | 218 | ||
- | 219 | kputint(rel_type); |
|
- | 220 | kputint(r_offset); |
|
- | 221 | ||
- | 222 | switch (rel_type) { |
|
- | 223 | case 6: /* R_386_GLOB_DAT */ |
|
- | 224 | case 7: /* R_386_JUMP_SLOT */ |
|
- | 225 | kputint(16); |
|
- | 226 | sym_idx = ELF32_R_SYM(r_info); |
|
180 | 227 | ||
- | 228 | sym_addr = sym_table[sym_idx].st_value + bias; |
|
- | 229 | kputint(sym_idx); |
|
- | 230 | kputint(sym_addr); |
|
- | 231 | ||
- | 232 | *(unsigned *)(r_offset+bias) = sym_addr; |
|
- | 233 | break; |
|
- | 234 | ||
- | 235 | case 1: /* R_386_32 */ |
|
181 | kputint(32); |
236 | kputint(16); |
- | 237 | sym_idx = ELF32_R_SYM(r_info); |
|
- | 238 | ||
- | 239 | sym_addr = sym_table[sym_idx].st_value + bias; |
|
- | 240 | kputint(sym_idx); |
|
- | 241 | kputint(sym_addr); |
|
- | 242 | ||
- | 243 | *(unsigned *)(r_offset+bias) += sym_addr; |
|
- | 244 | break; |
|
- | 245 | ||
- | 246 | case 8: /* R_386_RELATIVE */ |
|
- | 247 | kputint(16); |
|
- | 248 | *(unsigned *)(r_offset+bias) += bias; |
|
- | 249 | break; |
|
- | 250 | } |
|
- | 251 | } |
|
182 | 252 | ||
- | 253 | kputint(-1); |
|
- | 254 | ||
- | 255 | /* Init libc and run rtld main */ |
|
- | 256 | __main(); |
|
- | 257 | ||
- | 258 | kputint(33); |
|
- | 259 | __io_init(); |
|
- | 260 | kputint(34); |
|
183 | _rtld_main(); |
261 | _rtld_main(); |
- | 262 | kputint(35); |
|
- | 263 | __exit(); |
|
- | 264 | ||
- | 265 | kputint(36); |
|
184 | 266 | ||
185 | asm ( |
267 | asm ( |
186 | "movl $250, %%eax;" |
268 | "movl $250, %%eax;" |
187 | "int $0x30" |
269 | "int $0x30" |
188 | : /* output */ |
270 | : /* output */ |