Subversion Repositories HelenOS

Rev

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
}