Subversion Repositories HelenOS

Rev

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
    }