adapt dynamic linker for new binutils versions that omit DT_RPATH
authorRich Felker <dalias@aerifal.cx>
Sun, 23 Nov 2014 21:17:57 +0000 (16:17 -0500)
committerRich Felker <dalias@aerifal.cx>
Mon, 30 Mar 2015 05:41:33 +0000 (01:41 -0400)
the new DT_RUNPATH semantics for search order are always used, and
since binutils had always set both DT_RPATH and DT_RUNPATH when the
latter was used, processing only DT_RPATH worked fine. however, recent
binutils has stopped generating DT_RPATH when DT_RUNPATH is used,
which broke support for this feature completely.

(cherry picked from commit d8dc2b7c0289b12eeef4feff65e3c918111b0f55)

src/ldso/dynlink.c

index 6d265b354301fbc132291477b63b642e849e6aa3..cc84c8ab44949c516559ec2db6b5f68fdc852d76 100644 (file)
@@ -517,6 +517,8 @@ static void decode_dyn(struct dso *p)
                p->hashtab = (void *)(p->base + dyn[DT_HASH]);
        if (dyn[0]&(1<<DT_RPATH))
                p->rpath_orig = (void *)(p->strings + dyn[DT_RPATH]);
+       if (dyn[0]&(1<<DT_RUNPATH))
+               p->rpath_orig = (void *)(p->strings + dyn[DT_RUNPATH]);
        if (search_vec(p->dynv, dyn, DT_GNU_HASH))
                p->ghashtab = (void *)(p->base + *dyn);
        if (search_vec(p->dynv, dyn, DT_VERSYM))