[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