Differences between dynamic linking and static linking for ThreadPool

Author: JayceSu98Created Nov 2, 2023Updated Apr 29, 2024

I'm a novice programmer and I've encountered an issue while working with this project. When I compile the project using: ubuntu 1804

g++ -static -o example example.cpp -lpthread I encounter a "Segmentation fault (core dumped)" error. Thread 2 "example" received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7ffff7ff9700 (LWP 7905)] 0x0000000000000000 in ?? () (gdb) bt #0 0x0000000000000000 in ?? () #1 0x000000000046cb2c in std::condition_variable::wait(std::unique_lockstd::mutex&) () #2 0x0000000000406692 in std::condition_variable::wait<ThreadPool::ThreadPool(unsigned long)::{lambda()#1}::operator()() const::{lambda()#1}>(std::unique_lockstd::mutex&, ThreadPool::ThreadPool(unsigned long)::{lambda()#1}::operator()() const::{lambda()#1}) (this=0x7fffffffe290, __lock=..., __p=...) at /usr/include/c++/7/condition_variable:99 #3 0x000000000040587b in ThreadPool::ThreadPool(unsigned long)::{lambda()#1}::operator()() const (__closure=0x601b38) at ThreadPool.h:43 #4 0x000000000040a59f in std::__invoke_impl<void, ThreadPool::ThreadPool(unsigned long)::{lambda()#1}>(std::__invoke_other, ThreadPool::ThreadPool(unsigned long)::{lambda()#1}&&) (__f=...) at /usr/include/c++/7/bits/invoke.h:60 #5 0x0000000000409bb8 in std::__invoke<ThreadPool::ThreadPool(unsigned long)::{lambda()#1}>(std::__invoke_result&&, (ThreadPool::ThreadPool(unsigned long)::{lambda()#1}&&)...) (__fn=...) at /usr/include/c++/7/bits/invoke.h:95 #6 0x000000000040c54c in std::thread::_Invoker<std::tuple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1}> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (this=0x601b38) at /usr/include/c++/7/thread:234 #7 0x000000000040c4cc in std::thread::_Invoker<std::tuple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1}> >::operator()() (this=0x601b38) at /usr/include/c++/7/thread:243 #8 0x000000000040c3b2 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<ThreadPool::ThreadPool(unsigned long)::{lambda()#1}> > >::_M_run() (this=0x601b30) at /usr/include/c++/7/thread:186 #9 0x00000000004434df in execute_native_thread_routine () #10 0x000000000040dabb in start_thread (arg=0x7ffff7ff9700) at pthread_create.c:463 #11 0x0000000000526e9f in clone () However, when I compile it without the static flag:

g++ -o example2 example.cpp -lpthread it runs perfectly fine. I'm trying to understand the difference and why this is happening. Could someone please explain this to me?