diff options
author | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2004-08-17 13:37:54 +0000 |
---|---|---|
committer | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2004-08-17 13:37:54 +0000 |
commit | 6d6f3a5c26adcf6b105edfb4b53e97ceee81944c (patch) | |
tree | fdf250e80080d49b1e421f7157661033821c5fb7 /ldso/ldso/ldso.c | |
parent | d965f80088fafaacfd33d0b0770724f4fbcbe6e5 (diff) |
Let ldso decide if it should relocate itselft a second time. This
is needed if ldso should use libcs malloc whenever possible.
Fix RTLD_LAZY propagation to RTLD_NOW relocation when requested by
libdl.
Diffstat (limited to 'ldso/ldso/ldso.c')
-rw-r--r-- | ldso/ldso/ldso.c | 65 |
1 files changed, 25 insertions, 40 deletions
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 4256189e7..62b6c7437 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -91,7 +91,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt { ElfW(Phdr) *ppnt; char *lpntstr; - int i, goof = 0, be_lazy = RTLD_LAZY, trace_loaded_objects = 0; + int i, goof = 0, unlazy = 0, trace_loaded_objects = 0; struct dyn_elf *rpnt; struct elf_resolve *tcurr; struct elf_resolve *tpnt1; @@ -127,26 +127,6 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt * this beast to run. We start with the basic executable, and then * go from there. Eventually we will run across ourself, and we * will need to properly deal with that as well. */ - lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + load_addr); - - tpnt->chains = hash_addr; - tpnt->next = 0; - tpnt->libname = 0; - tpnt->libtype = program_interpreter; - tpnt->loadaddr = (ElfW(Addr)) load_addr; - -#ifdef ALLOW_ZERO_PLTGOT - if (tpnt->dynamic_info[DT_PLTGOT]) -#endif - { - INIT_GOT(lpnt, tpnt); -#ifdef __SUPPORT_LD_DEBUG_EARLY__ - _dl_dprintf(_dl_debug_file, "GOT found at %x\n", lpnt); -#endif - } - - /* OK, this was a big step, now we need to scan all of the user images - and load them properly. */ { ElfW(Ehdr) *epnt; ElfW(Phdr) *myppnt; @@ -165,6 +145,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt brk_addr = 0; rpnt = NULL; + if (_dl_getenv("LD_BIND_NOW", envp)) + unlazy = RTLD_NOW; /* At this point we are now free to examine the user application, and figure out which libraries are supposed to be called. Until @@ -191,6 +173,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt _dl_symbol_tables = rpnt = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); _dl_memset(rpnt, 0, sizeof(struct dyn_elf)); rpnt->dyn = _dl_loaded_modules; + app_tpnt->rtld_flags = unlazy | RTLD_GLOBAL; app_tpnt->usage_count++; app_tpnt->symbol_scope = _dl_symbol_tables; lpnt = (unsigned long *) (app_tpnt->dynamic_info[DT_PLTGOT] + app_tpnt->loadaddr); @@ -236,13 +219,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt } } - /* Now we need to figure out what kind of options are selected. Note that for SUID programs we ignore the settings in LD_LIBRARY_PATH */ { - if (_dl_getenv("LD_BIND_NOW", envp)) - be_lazy = 0; - if ((auxvt[AT_UID].a_un.a_val == -1 && _dl_suid_ok()) || (auxvt[AT_UID].a_un.a_val != -1 && auxvt[AT_UID].a_un.a_val == auxvt[AT_EUID].a_un.a_val @@ -383,6 +362,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt _dl_exit(15); } } else { + tpnt1->rtld_flags = unlazy | RTLD_GLOBAL; #ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #endif @@ -468,6 +448,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt _dl_exit(15); } } else { + tpnt1->rtld_flags = unlazy | RTLD_GLOBAL; #ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #endif @@ -525,6 +506,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt _dl_exit(16); } } else { + tpnt1->rtld_flags = unlazy | RTLD_GLOBAL; #ifdef __SUPPORT_LD_DEBUG_EARLY__ _dl_dprintf(_dl_debug_file, "Loading:\t(%x) %s\n", tpnt1->loadaddr, tpnt1->libname); #endif @@ -545,23 +527,14 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt /* * If the program interpreter is not in the module chain, add it. This will * be required for dlopen to be able to access the internal functions in the - * dynamic linker. + * dynamic linker and to relocate the interpreter again once all libs are loaded. */ if (tpnt) { - tcurr = _dl_loaded_modules; - if (tcurr) - while (tcurr->next) - tcurr = tcurr->next; - tpnt->next = NULL; + tpnt = _dl_add_elf_hash_table(tpnt->libname, (char *)load_addr, tpnt->dynamic_info, + (unsigned long)tpnt->dynamic_addr, tpnt->dynamic_size); + tpnt->libtype = program_interpreter; tpnt->usage_count++; - - if (tcurr) { - tcurr->next = tpnt; - tpnt->prev = tcurr; - } else { - _dl_loaded_modules = tpnt; - tpnt->prev = NULL; - } + tpnt->symbol_scope = _dl_symbol_tables; if (rpnt) { rpnt->next = (struct dyn_elf *) _dl_malloc(sizeof(struct dyn_elf)); _dl_memset(rpnt->next, 0, sizeof(struct dyn_elf)); @@ -572,6 +545,18 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt _dl_memset(rpnt, 0, sizeof(struct dyn_elf)); } rpnt->dyn = tpnt; + tpnt->rtld_flags = RTLD_NOW | RTLD_GLOBAL; /* Must not be LAZY */ +#ifdef RERELOCATE_LDSO + /* Only rerelocate functions for now. */ + tpnt->init_flag = RELOCS_DONE | COPY_RELOCS_DONE; + lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + load_addr); +# ifdef ALLOW_ZERO_PLTGOT + if (tpnt->dynamic_info[DT_PLTGOT]) +# endif + INIT_GOT(lpnt, tpnt); +#else + tpnt->init_flag = RELOCS_DONE | JMP_RELOCS_DONE | COPY_RELOCS_DONE; +#endif tpnt = NULL; } @@ -602,7 +587,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, struct elf_resolve *app_tpnt * to the GOT tables. We need to do this in reverse order so that COPY * directives work correctly */ if (_dl_symbol_tables) - goof += _dl_fixup(_dl_symbol_tables, be_lazy); + goof += _dl_fixup(_dl_symbol_tables, unlazy); /* OK, at this point things are pretty much ready to run. Now we |