Changeset 1ea99cc in mainline for uspace/srv/loader/elf_load.c


Ignore:
Timestamp:
2009-08-20T20:47:35Z (15 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b50b5af2
Parents:
24edc18
Message:

Merge changes from original Subversion dynload branch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/loader/elf_load.c

    r24edc18 r1ea99cc  
    102102 * @return EOK on success or negative error code.
    103103 */
    104 int elf_load_file(char *file_name, size_t so_bias, elf_info_t *info)
     104int elf_load_file(char *file_name, size_t so_bias, eld_flags_t flags,
     105    elf_info_t *info)
    105106{
    106107        elf_ld_t elf;
     
    117118        elf.fd = fd;
    118119        elf.info = info;
     120        elf.flags = flags;
    119121
    120122        rc = elf_load(&elf, so_bias);
     
    123125
    124126        return rc;
    125 }
    126 
    127 /** Run an ELF executable.
    128  *
    129  * Transfers control to the entry point of an ELF executable loaded
    130  * earlier with elf_load_file(). This function does not return.
    131  *
    132  * @param info  Info structure filled earlier by elf_load_file()
    133  */
    134 void elf_run(elf_info_t *info, pcb_t *pcb)
    135 {
    136         program_run(info->entry, pcb);
    137 
    138         /* not reached */
    139127}
    140128
     
    151139        pcb->entry = info->entry;
    152140        pcb->dynamic = info->dynamic;
     141        pcb->rtld_runtime = NULL;
    153142}
    154143
     
    303292                break;
    304293        case PT_INTERP:
    305                 /* Assume silently interp == "/rtld.so" */
    306                 elf->info->interp = "/rtld.so";
     294                /* Assume silently interp == "/app/dload" */
     295                elf->info->interp = "/app/dload";
    307296                break;
    308297        case PT_DYNAMIC:
     298                /* Record pointer to dynamic section into info structure */
     299                elf->info->dynamic =
     300                    (void *)((uint8_t *)entry->p_vaddr + elf->bias);
     301                DPRINTF("dynamic section found at 0x%x\n",
     302                        (uintptr_t)elf->info->dynamic);
     303                break;
     304        case 0x70000000:
     305                /* FIXME: MIPS reginfo */
     306                break;
    309307        case PT_SHLIB:
    310308        case PT_NOTE:
    311         case PT_LOPROC:
    312         case PT_HIPROC:
     309//      case PT_LOPROC:
     310//      case PT_HIPROC:
    313311        default:
    314312                DPRINTF("Segment p_type %d unknown.\n", entry->p_type);
     
    380378            AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
    381379        if (a == (void *)(-1)) {
    382                 DPRINTF("Memory mapping failed.\n");
     380                DPRINTF("memory mapping failed (0x%x, %d)\n",
     381                        base+bias, mem_sz);
    383382                return EE_MEMORY;
    384383        }
     
    422421        }
    423422
     423        /*
     424         * The caller wants to modify the segments first. He will then
     425         * need to set the right access mode and ensure SMC coherence.
     426         */
     427        if ((elf->flags & ELDF_RW) != 0) return EE_OK;
     428
     429//      printf("set area flags to %d\n", flags);
    424430        rc = as_area_change_flags(seg_ptr, flags);
    425431        if (rc != 0) {
     
    458464                break;
    459465        case SHT_DYNAMIC:
    460                 /* Record pointer to dynamic section into info structure */
    461                 elf->info->dynamic =
    462                     (void *)((uint8_t *)entry->sh_addr + elf->bias);
    463                 DPRINTF("Dynamic section found at 0x%x.\n",
    464                         (uintptr_t)elf->info->dynamic);
    465466                break;
    466467        default:
Note: See TracChangeset for help on using the changeset viewer.