Subversion Repositories HelenOS

Rev

Rev 3403 | Rev 3562 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3403 Rev 3552
Line 97... Line 97...
97
 * @param info      Pointer to a structure for storing information
97
 * @param info      Pointer to a structure for storing information
98
 *          extracted from the binary.
98
 *          extracted from the binary.
99
 *
99
 *
100
 * @return EOK on success or negative error code.
100
 * @return EOK on success or negative error code.
101
 */
101
 */
102
int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info)
102
int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags,
-
 
103
    elf_info_t *info)
103
{
104
{
104
    elf_ld_t elf;
105
    elf_ld_t elf;
105
 
106
 
106
    int fd;
107
    int fd;
107
    int rc;
108
    int rc;
Line 114... Line 115...
114
        return -1;
115
        return -1;
115
    }
116
    }
116
 
117
 
117
    elf.fd = fd;
118
    elf.fd = fd;
118
    elf.info = info;
119
    elf.info = info;
-
 
120
    elf.flags = flags;
119
 
121
 
120
    rc = elf_load(&elf, so_bias);
122
    rc = elf_load(&elf, so_bias);
121
 
123
 
122
    close(fd);
124
    close(fd);
123
 
125
 
Line 305... Line 307...
305
        break;
307
        break;
306
    case PT_LOAD:
308
    case PT_LOAD:
307
        return load_segment(elf, entry);
309
        return load_segment(elf, entry);
308
        break;
310
        break;
309
    case PT_INTERP:
311
    case PT_INTERP:
310
        /* Assume silently interp == "/lib/rtld.so" */
312
        /* Assume silently interp == "/lib/rtld" */
311
        elf->info->interp = "/lib/rtld.so";
313
        elf->info->interp = "/lib/rtld";
312
        break;
314
        break;
313
    case PT_DYNAMIC:
315
    case PT_DYNAMIC:
314
    case PT_SHLIB:
316
    case PT_SHLIB:
315
    case PT_NOTE:
317
    case PT_NOTE:
316
    case PT_LOPROC:
318
    case PT_LOPROC:
Line 423... Line 425...
423
 
425
 
424
        left -= now;
426
        left -= now;
425
        dp += now;
427
        dp += now;
426
    }
428
    }
427
 
429
 
-
 
430
    /*
-
 
431
     * The caller wants to modify the segments first. He will then
-
 
432
     * need to set the right access mode and ensure SMC coherence.
-
 
433
     */
-
 
434
    if ((elf->flags & ELDF_RW) != 0) return EE_OK;
-
 
435
 
428
//  printf("set area flags to %d\n", flags);
436
    printf("set area flags to %d\n", flags);
429
    rc = as_area_change_flags((uint8_t *)entry->p_vaddr + bias, flags);
437
    rc = as_area_change_flags((uint8_t *)entry->p_vaddr + bias, flags);
430
    if (rc != 0) {
438
    if (rc != 0) {
431
        printf("failed to set memory area flags\n");
439
        printf("failed to set memory area flags\n");
432
        return EE_MEMORY;
440
        return EE_MEMORY;
433
    }
441
    }