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

--- Comment #8 from Mathieu Malaterre <mathieu.malaterre at gmail dot com> ---
 % more CMakeLists.txt main.cc Module.cc openvdb.cc Tree.h
::::::::::::::
CMakeLists.txt
::::::::::::::
cmake_minimum_required(VERSION 3.13)
project(p)

# only export limited set of symbols
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)

# important to have pthread at runtime:
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads REQUIRED)

# important to use SHARED:
add_library(openvdb SHARED openvdb.cc)
target_include_directories(openvdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

add_executable(vdb_view main.cc Module.cc)
target_link_libraries(vdb_view openvdb Threads::Threads)
target_include_directories(vdb_view PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
::::::::::::::
main.cc
::::::::::::::
void initialize();

int main(int , char *[])
{
    initialize();
    return 0;
}
::::::::::::::
Module.cc
::::::::::::::
#include "Tree.h"

class Module
{
    void init();
};

void Module::init() // no-inline
{
   Tree::treeType();
}
::::::::::::::
openvdb.cc
::::::::::::::
#include "Tree.h"

static std::string do_segfault() { return Tree::treeType(); }

 __attribute__((visibility("default")))
void initialize()
{
  do_segfault();
}
::::::::::::::
Tree.h
::::::::::::::
#pragma once

#include <mutex>
#include <memory>

class Tree
{
public:
    static const std::string treeType() {
      static std::once_flag once;
      std::call_once(once, []() {
        sTreeTypeName.reset(new std::string());
                      });
      return *sTreeTypeName;
    }
private:
    static std::unique_ptr<const std::string> sTreeTypeName;
};

std::unique_ptr<const std::string> Tree::sTreeTypeName;

Reply via email to