Re: __cxa_thread_call_dtors: dtr 0x........ from unloaded dso, skipping

From: Dimitry Andric <dim_at_FreeBSD.org>
Date: Thu, 29 Jun 2023 10:37:10 UTC
On 29 Jun 2023, at 12:25, Willem Jan Withagen <wjw@digiware.nl> wrote:
> 
> On 26-6-2023 17:38, Dimitry Andric wrote:
>> On 26 Jun 2023, at 17:29, Bjoern A. Zeeb <bzeeb-lists@lists.zabbadoz.net> wrote:
>>> On Mon, 26 Jun 2023, Dimitry Andric wrote:
>>> 
>>>> On 26 Jun 2023, at 17:00, Bjoern A. Zeeb <bzeeb-lists@lists.zabbadoz.net> wrote:
>>>>> while building world and current I see a lot of:
>>>>> 
>>>>> __cxa_thread_call_dtors: dtr 0x...... from unloaded dso, skipping
>>>>> 
>>>>> Can anyone shed light on that?
>>>> You need (thanks to Kostik):
>>>> https://cgit.freebsd.org/src/commit/?id=42ceab3ea1a997db93b65404be0ee4b17b5382d7
>>>> 
>>>> Build libc and install it, then the messages should disappear.
>>> Great!  Basically update world and it'll go.
>>> Do we add an UPDATING note for this or do we consider it developer noise?
>> I think the message has been there for a long time, but was not often
>> noticed. It happened when the buildworld bootstrap decides to build a
>> static bootstrap lld ("SYSTEM_LINKER: libclang will be built for
>> bootstrapping a cross-linker"), so usually when lld's version is bumped.
>> And that is because lld is one of the few threaded build tools in the
>> tree.
>> 
>> The messages themselves are harmless and can be ignored. Feel free to
>> add an UPDATING note to that effect, otherwise worried users might think
>> something is off. :)
> 
> Actually I had that in my Ceph-ports as well, and chose to ignore it....
> Looked into the difference between FreeBSD and Linux.
> Linux prevents that message by counting the number of loads, and only unloads
> when the counter hits zero. FreeBSD just seems to unload, and report illegal access.

There is no "loading" and "unloading" going on, since this is about a
static executable. What happened was that __cxa_thread_call_dtors() was
giving a misleading message, because _rtld_addr_phdr() always returned
0. Kostik has now made it so _rtld_addr_phdr() does the right thing for
static executables.

-Dimitry