View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0006403 | Rocky-Linux-8 | gcc-toolset-12 | public | 2024-04-27 07:15 | 2024-04-27 07:15 |
Reporter | Christopher Cooley | Assigned To | |||
Priority | normal | Severity | crash | Reproducibility | have not tried |
Status | new | Resolution | open | ||
OS | Rocky Linux | OS Version | 8.6 | ||
Summary | 0006403: Crash in _M_start_thread when using C++ 11 threads in a dlopened library | ||||
Description | Minimal example: I have two source files executable.cpp and library.cpp, which are compiled into an executable and dynamic library, respectively. The executable dlopens the dynamic library, and calls a function within it. The dynamic library function starts a thread. This all works fine when the executable is compiled WITHOUT -lstdc++. However, when the executable is compiled WITH -lstdc++, a segmentation fault occurs. Compiling with -lstdc++ only seems to work if -lpthread is also used to compile the executable, even though the executable itself does not uses threads. This was unexpected behavior to me. --- executable.cpp: #include <dlfcn.h> #include <stddef.h> int main(int argc, char **argv) { void *libraryObject; void (*libraryFunction)(void); libraryObject = dlopen("./library.so", RTLD_NOW); if(libraryObject == NULL) { return 1; } libraryFunction = (void (*)(void)) dlsym(libraryObject, "libraryFunction"); if(libraryFunction == NULL) { return 1; } libraryFunction(); return 0; } library.cpp: #include <thread> #include <iostream> extern "C" void libraryFunction(void); void threadFunction(void); void libraryFunction(void) { std::thread threadObject(threadFunction); threadObject.join(); } void threadFunction(void) { std::cout << "Hello from threadFunction" << std::endl; } | ||||
Steps To Reproduce | Compiling the executable without -lstdc++ works: $ cc library.cpp -o library.so -shared -fpic -lpthread -lstdc++ $ cc executable.cpp -o executable -ldl $ ./executable Hello from threadFunction Compiling the executable with -lstdc++ and without -lpthread does not work: $ cc library.cpp -o library.so -shared -fpic -lpthread -lstdc++ $ cc executable.cpp -o executable -ldl -lstdc++ $ ./executable Segmentation fault (core dumped) Compiling the executable with -lstdc++ and -lpthread does work: $ cc library.cpp -o library.so -shared -fpic -lpthread -lstdc++ $ cc executable.cpp -o executable -ldl -lstdc++ -lpthread $ ./executable Hello from threadFunction Backtrace of crash: (gdb) bt #0 0x0000000000000000 in ?? () #1 0x00007ffff78f8e89 in std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) () from /lib64/libstdc++.so.6 #2 0x00007ffff7ff0678 in std::thread::thread<void (&)(), , void>(void (&)()) () from ./library.so #3 0x00007ffff7ff0498 in libraryFunction () from ./library.so #4 0x000000000040118f in main () | ||||
Additional Information | Output of cc -v: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/opt/rh/gcc-toolset-12/root/usr/libexec/gcc/x86_64-redhat-linux/12/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target: x86_64-redhat-linux Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/gcc-toolset-12/root/usr --mandir=/opt/rh/gcc-toolset-12/root/usr/share/man --infodir=/opt/rh/gcc-toolset-12/root/usr/share/info --with-bugurl=https://bugs.rockylinux.org/ --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-libstdcxx-backtrace --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-12.2.1-20221121/obj-x86_64-redhat-linux/isl-install --enable-offload-targets=nvptx-none --without-cuda-driver --enable-offload-defaulted --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 12.2.1 20221121 (Red Hat 12.2.1-7) (GCC) | ||||
Tags | No tags attached. | ||||
Date Modified | Username | Field | Change |
---|---|---|---|
2024-04-27 07:15 | Christopher Cooley | New Issue |