https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126399

            Bug ID: 126399
           Summary: [15 regression] __gthread_trigger() is missing hidden
                    visibility on FreeBSD/Solaris
           Product: gcc
           Version: 15.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vedran at miletic dot net
  Target Milestone: ---

On FreeBSD (and possibly also Solaris) std::call_once() throws
std::system_error("Unknown error: -1") and aborts the program when the
call_once call happens to live in a different shared object (.so) than other,
unrelated code that already forced the C++ runtime into "multithreaded" state
(e.g. constructing a std::shared_ptr, which internally checks
__gthread_active_p()).

This is a regression, observed in 15.2.0, likely related to PR115126. Also
reproduces on 16.1.0 and 17.0.0 20260705 experimental; does NOT reproduce on
14.2.0, 13.3.0, 12.4.0 (all versions are obtained from FreeBSD Ports).

Observed in OpenMM and RDKit. Minimized down to:

libwidget.cpp

#include <mutex>
std::once_flag once;
void initFn() {}
extern "C" void triggerOnce() { std::call_once(once, initFn); }

main.cpp

#include <memory>
std::shared_ptr<int> p1(new int(1));

extern "C" void triggerOnce();
int main() {
  triggerOnce();
  return 0;
}

% g++15 -fPIC -shared -o libwidget.so libwidget.cpp -lpthread
% g++15 -o main main.cpp -Wl,-rpath,. ./libwidget.so -lpthread
% ./main
terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error: -1
Abort (core dumped)

For comparison:

% g++14 -fPIC -shared -o libwidget.so libwidget.cpp -lpthread
% g++14 -o main main.cpp -Wl,-rpath,. ./libwidget.so -lpthread
% ./main
(no crash)

Reply via email to