Changeset f215c6ef in mainline for uspace/lib/c/generic/rtld/rtld.c


Ignore:
Timestamp:
2025-01-26T21:33:13Z (7 weeks ago)
Author:
Matěj Volf <git@…>
Children:
ea77c2d
Parents:
31ea2a7
git-author:
Matěj Volf <git@…> (2025-01-26 21:04:16)
git-committer:
Matěj Volf <git@…> (2025-01-26 21:33:13)
Message:

properly initialize RTLD runtime for static binaries

this is a better approach than what I did of previous commit

see https://github.com/HelenOS/helenos/pull/242 for a lot more context

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/rtld/rtld.c

    r31ea2a7 rf215c6ef  
    4343
    4444rtld_t *runtime_env;
    45 static rtld_t rt_env_static;
    46 
    47 /** Initialize a minimal runtime linker environment for use in executables loaded directly by kernel. */
    48 errno_t rtld_init_static(void)
    49 {
     45
     46/** Initialize the runtime linker for use in a statically-linked executable. */
     47errno_t rtld_init_static(elf_finfo_t *finfo, rtld_t **rre)
     48{
     49        rtld_t *env;
    5050        errno_t rc;
    5151
    52         runtime_env = &rt_env_static;
    53         list_initialize(&runtime_env->modules);
    54         list_initialize(&runtime_env->imodules);
    55         runtime_env->program = NULL;
    56         runtime_env->next_id = 1;
    57 
    58         rc = module_create_static_exec(runtime_env, NULL);
     52        env = calloc(1, sizeof(rtld_t));
     53        if (env == NULL)
     54                return ENOMEM;
     55
     56        list_initialize(&env->modules);
     57        list_initialize(&env->imodules);
     58        env->program = NULL;
     59        env->next_id = 1;
     60
     61        rc = module_create_static_exec(finfo->base, env);
    5962        if (rc != EOK)
    6063                return rc;
    6164
    62         modules_process_tls(runtime_env);
    63 
     65        modules_process_tls(env);
     66
     67        *rre = env;
    6468        return EOK;
    6569}
    6670
    67 /** Initialize and process an executable, static or dynamic.
     71/** Initialize and process a dynamically linked executable.
    6872 *
    6973 * @param p_info Program info
     
    7579        module_t *prog;
    7680
    77         DPRINTF("Load program with rtld.\n");
     81        DPRINTF("Load dynamically linked program.\n");
    7882
    7983        /* Allocate new RTLD environment to pass to the loaded program */
     
    9599         */
    96100
    97         if (p_info->dynamic) {
    98                 DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic);
    99                 dynamic_parse(p_info->dynamic, 0, &prog->dyn);
    100         } else {
    101                 DPRINTF("Program is statically linked\n");
    102         }
     101        DPRINTF("Parse program .dynamic section at %p\n", p_info->dynamic);
     102        dynamic_parse(p_info->dynamic, 0, &prog->dyn);
    103103        prog->bias = 0;
    104104        prog->dyn.soname = "[program]";
     
    128128         */
    129129
    130         if (p_info->dynamic) {
    131                 DPRINTF("Load all program dependencies\n");
    132                 errno_t rc = module_load_deps(prog, 0);
    133                 if (rc != EOK) {
    134                         free(prog);
    135                         free(env);
    136                         return rc;
    137                 }
     130        DPRINTF("Load all program dependencies\n");
     131        errno_t rc = module_load_deps(prog, 0);
     132        if (rc != EOK) {
     133                free(prog);
     134                free(env);
     135                return rc;
    138136        }
    139137
Note: See TracChangeset for help on using the changeset viewer.