[Issue 14824] New: A stale function might get called when unloading shared libraries on FBSD
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Fri Jul 24 16:34:51 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14824
Issue ID: 14824
Summary: A stale function might get called when unloading
shared libraries on FBSD
Product: D
Version: D2
Hardware: All
OS: FreeBSD
Status: NEW
Severity: normal
Priority: P1
Component: druntime
Assignee: nobody at puremagic.com
Reporter: code at dawg.eu
FreeBSD's runtime linker has a bug where it could resolve a PLT
function entry to a weak definition in a dynamically loaded shared
library without pinning that library. Once the lib get's unloaded
further calls to that function will crash.
This happens with the host test [¹] which loads plugin1.so and plugin2.so (both
depending on libdruntime.so).
On the first call to dur!"usecs" the PLT entry is resolved to
plugin1.so b/c it preceeds libdruntime.so in the symbol search
order. When plugin1.so gets unloaded, the PLT of druntime would still point to
the definition in plugin1, even though plugin2 might still call those functions
in druntime.
GLIBC get's this right and pins plugin1.so, see [²].
This was found on FBSD-8.4, but a look at the relevant source code [³]
indicates, that it's still not fixed.
A workaround is to explicitly load the common dependent library (libdruntime.so
here) before loading the plugins, that way the symbol search order will prefer
druntime.
[¹]:
https://github.com/D-Programming-Language/druntime/blob/645edac3483c8908de29c55c9312dc5dcf2f6bdd/test/shared/src/host.c
[²]:
https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/dl-lookup.c;hb=6b183b833968010a95ba41ed307dd8bea7b2e641#l917
[³]:
https://github.com/freebsd/freebsd/blob/527ac1e9fb2b2f29df0bcfb2e91053cea93956bb/libexec/rtld-elf/rtld.c#L3846
--
More information about the Digitalmars-d-bugs
mailing list