mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
RTLD_DEEPBIND: make lookup not just symbolic, but walk all refobj' DAGs
PR: 275393 (cherry picked from commit 9daf6cd0f46416d9c6eb0411ea6042cd42b8a9bc)
This commit is contained in:
parent
165cc0eea9
commit
8d0740e8b9
2 changed files with 7 additions and 2 deletions
|
|
@ -3745,7 +3745,7 @@ dlopen_object(const char *name, int fd, Obj_Entry *refobj, int lo_flags,
|
|||
if (!obj->init_done) {
|
||||
/* We loaded something new and have to init something. */
|
||||
if ((lo_flags & RTLD_LO_DEEPBIND) != 0)
|
||||
obj->symbolic = true;
|
||||
obj->deepbind = true;
|
||||
result = 0;
|
||||
if ((lo_flags & (RTLD_LO_EARLY | RTLD_LO_IGNSTLS)) == 0 &&
|
||||
obj->static_tls && !allocate_tls_offset(obj)) {
|
||||
|
|
@ -4571,7 +4571,8 @@ symlook_default(SymLook *req, const Obj_Entry *refobj)
|
|||
if (refobj->symbolic || req->defobj_out != NULL)
|
||||
donelist_check(&donelist, refobj);
|
||||
|
||||
symlook_global(req, &donelist);
|
||||
if (!refobj->deepbind)
|
||||
symlook_global(req, &donelist);
|
||||
|
||||
/* Search all dlopened DAGs containing the referencing object. */
|
||||
STAILQ_FOREACH(elm, &refobj->dldags, link) {
|
||||
|
|
@ -4587,6 +4588,9 @@ symlook_default(SymLook *req, const Obj_Entry *refobj)
|
|||
}
|
||||
}
|
||||
|
||||
if (refobj->deepbind)
|
||||
symlook_global(req, &donelist);
|
||||
|
||||
/*
|
||||
* Search the dynamic linker itself, and possibly resolve the
|
||||
* symbol from there. This is how the application links to
|
||||
|
|
|
|||
|
|
@ -239,6 +239,7 @@ typedef struct Struct_Obj_Entry {
|
|||
bool ver_checked : 1; /* True if processed by rtld_verify_object_versions */
|
||||
bool textrel : 1; /* True if there are relocations to text seg */
|
||||
bool symbolic : 1; /* True if generated with "-Bsymbolic" */
|
||||
bool deepbind : 1; /* True if loaded with RTLD_DEEPBIND" */
|
||||
bool bind_now : 1; /* True if all relocations should be made first */
|
||||
bool traced : 1; /* Already printed in ldd trace output */
|
||||
bool jmpslots_done : 1; /* Already have relocated the jump slots */
|
||||
|
|
|
|||
Loading…
Reference in a new issue