Segmentation fault при попытке создать поток при статической линковке libstdc++

Возникла необходимость статически слинковать все библиотеки при сборке бинарника. После добавления в cmake скрипт строки set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") или add_link_options(-static-libgcc -static-libstdc++ -static) любая попытка создать объект std::thread вызывает Segmentation fault.

ОС: Ubuntu 20.04, Cmake v 3.19, GCC 9.3.

Для воспроизведения проблемы написал небольшой проект.

Cmake скрипт:

cmake_minimum_required(VERSION 3.5)
project(thread_test LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package (Threads)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
add_executable(thread_test main.cpp)
target_link_libraries(${PROJECT_NAME} ${CMAKE_THREAD_LIBS_INIT})

С++ код:

#include <chrono>
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
using std::thread;
using namespace std::chrono_literals;

int main() {
    thread th([]() -> void {
        std::this_thread::sleep_for(1s);
        cout << "Some text." << endl;
    });
    th.join();
    cout << "End" << endl;
    return 0;
}

Если закомментировать строку set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static") то всё начинает работать как надо.

upd: Попробовал собрать этот с++ код руками. Всё тоже самое. g++ -static -pthread -std=c++17 -o thread_test main.cpp. После запуска Segmentation fault. Т.е. у g++ вообще не получается слинковать потоки статически. Вопрос, что делать, остаётся открытым.


Ответы (1 шт):

Автор решения: KoVadim

Порылся у себя по исходникам и нашел. Потом нашел и на SO.

Штука в том, что нужно подлинковать ещё и библиотеку rt. В консоли получается где то так

g++ main.cpp -static -lrt -pthread -Wl,--whole-archive -lpthread -Wl,--no-whole-archive

работает и для gcc, и для clang

Но вот как это сделать в cmake - не знаю.

→ Ссылка