Subversion Repositories HelenOS

Rev

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 */