Upgrade to Pro — share decks privately, control downloads, hide ads and more …

R&D 祭 2024 今だ!ABI問題

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

R&D 祭 2024 今だ!ABI問題

Avatar for OLM Digital R&D

OLM Digital R&D PRO

May 17, 2026

More Decks by OLM Digital R&D

Other Decks in Technology

Transcript

  1. 前回:Maniacコード コード 企画 ビルド テスト リリース デプロイ 管理 監視 DEV

    開発 OPS 運用 要望とアイデア の管理 ソースコードの バージョン管理 自動コンパイル 開発環境の自動構築 自動インストール 結合テスト バージョン番号 の決め方 2 © OLM Digital, Inc.
  2. 概要 • VFX Reference Platform • ダイナミックライブラリ • ABIについて •

    CMakeでABI問題の対応 • まとめ 4 © OLM Digital, Inc.
  3. VFX Reference Platform • 映像業界の様々なバージョンの統一 – DCCの使用するコンパイラ – DCCの使用するライブラリ –

    Diamond(菱形)依存関係を防ぐ • 映像会社とソフト会社の協力 – Linuxの対応のハードルを下げる – 一緒に決める 5 © OLM Digital, Inc.
  4. VFX Reference Platform • 2023年からNew libstdc++ ABIに切り替え推進 • DCCが2024年で切り替え –

    Maya 2024、Nuke 15 • 必要な対応 – New libstdc++ に切り替え – ABI二つの対応 • libstdc++ • New libstdc++ • Maya 2023まだ使っているから 6 © OLM Digital, Inc.
  5. • ランタイム – スタンダード – libstdc++, vc… • 外部ライブラリ –

    OpenCV – Boost – … • 二種類 – スタティック – ダイナミック 実行ができる ライブラリについて コード ダイナミック ライブラリ バイナリ コンパイル されたコード 実行できる プログラム リンク ライブラリ のヘッダー … コンパイル ダイナミック ライブラリ バイナリ 7 ライブラリ バイナリ © OLM Digital, Inc.
  6. ダイナミックライブラリについて • いいところ – 更新が可能 • 後方互換性が必要 • バグを見つけたら修正されたバイナリ配布 ‐

    セキュリティ問題 – プラグインの仕組みが可能 • Maya、AEなどのプラグインはダイナミックライブラリ • 悪いところ – 勝手に更新されてクラッシュの原因になる • OSのライブラリ更新時 • ソフトのインストール時 – ABI問題が置きやすい 8 © OLM Digital, Inc.
  7. ABIってなに? 10 © OLM Digital, Inc. • バイナリフォーマット – C++の関数名

    – 型名、レイアウト – 関数の呼び方 – パラメータの使い方 – など – 参考:What is ABI, and What Should WG21 Do About It? • OS依存 – WindowsでコンパイルされたものをLinuxで使えない • コンパイラ依存 – MinGWとVC++でコンパイルされたものを一緒に使えない • インターフェースなので互換性が大事!
  8. • コンパイルされたライブラリで実行可能 ABIの互換性 ダイナミックライブラリV2 実行ができる プログラム 使用 コードのバイナリ 実行ができる プログラム

    リンク コンパイル ライブラリ バイナリ V2 ライブラリ ヘッダー V2 プログラム ライブラリ ヘッダー V2 ライブラリ バイナリ V2 ライブラリ バイナリ V2 © OLM Digital, Inc. 11
  9. • 後方互換性 – 古いライブラリでコンパイルされたものが新しいバージョンで実行可能 ABIの互換性 ダイナミックライブラリV2 後方互換性があ れば実行できる プログラム 使用

    コードのバイナリ 実行ができる プログラム リンク コンパイル ライブラリ バイナリ V2 ライブラリ ヘッダー V2 プログラム ライブラリ ヘッダー V2 ライブラリ バイナリ V2 ライブラリ バイナリ V3 © OLM Digital, Inc. 12
  10. • 前方互換性 – 新しいライブラリでコンパイルされたものが古いバージョンで実行可能 ABIの互換性 ダイナミックライブラリV2 前方互換性があ れば実行できる プログラム 使用

    コードのバイナリ 実行ができる プログラム リンク コンパイル ライブラリ バイナリ V2 ライブラリ ヘッダー V2 プログラム ライブラリ ヘッダー V2 ライブラリ バイナリ V2 ライブラリ バイナリ V0 © OLM Digital, Inc. 13
  11. APIの互換性の問題発生 • APIの互換性がない → ABIの互換性がない header.h #include “header.h” int main() { void

    fly(10.0f); return 0; } 14 © OLM Digital, Inc. mylib Version 1ライブラリ void fly(float speed); mylib Version 2ライブラリ void fly(float speed, float altitude); myprogram.c 実行環境 Version 1でコンパイル myprogram.exe myprogam Version 2ライブラリ mylib.dll mylib.so
  12. • C/C++ では一つの定義のルール(One Definition Rule) • 同じ名前なのに定義が違うものだと>> Undefined behavior 実行環境

    Version 1でコンパイル myprogram.exe myprogam ABIの互換性の問題発生 Version 2ライブラリ mylib.dll mylib.so mylib Version 1ライブラリ struct MyStruct{ int a; int b; }; mylib Version 2ライブラリ struct MyStruct{ int a; int b; Int c; }; 15 © OLM Digital, Inc. header.h #include “header.h” int main() { MyStruct s; s.a = 1; s.b = 2; return 0; } myprogram.c
  13. 映像制作でのABI問題 • DCCプラグインとDCCのライブラリのABI互換性が必須! • ランタイム – 前方互換性がない – VC++のランタイム •

    2015年移行互換性あり? – libstdc++ • GCC5.1、2015年で後方互換性を壊した • 2015年でDeprecatedの導入、APIの互換性を壊す? • SDK – 前方互換性がない – 後方互換性はバージョン次第 • 殆どあり: ArnoldとAE • 殆どなし: Mayaと Nuke 17 © OLM Digital, Inc. VC++2017でのエラー Error C2338… Before VS 2017 15.8, the member type would non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to handle this correctly, but the fix inherently changes layout and breaks binary compatibility…
  14. ABI問題の対応 • プラグインのコンパイル – DCCの推薦するコンパイラを使う – バージョン毎にコンパイル • SDKバージョンxコンパイラ バージョン

    • MtoAにロードされるので、Arnoldも! • 外部ライブラリ – 再帰的に全ての依存ライブラリ – ソースからコンパイル • プラグインと同じコンパイラ – Linuxでは二つのバージョンをコンパイル • _GLIBCXX_USE_CXX11_ABI=1 • _GLIBCXX_USE_CXX11_ABI=0 • ビルド時相応しいバージョンとリンク 18 © OLM Digital, Inc.
  15. ランタイムのバージョンでさらにややこしい • LinuxではDistroのlibstdc++が固定 – 更新可能ですが・・・ – devtoolsetでごまかしてたり • 新しいABIをStaticリンクで •

    注意:DTS 6-7 が_GLIBCXX_USE_CXX11_ABIを無視 • Windowsのバージョンわかりにくい – 2017からDLLの名前が変わらない – Propertiesで確認・・・ 19 libstdc++.so.6.0.25 libstdc++.so.6.0.28 © OLM Digital, Inc.
  16. ABI問題の対応 • プラグインのコンパイル – DCCの推奨コンパイラを使う – バージョン毎にコンパイル • SDKバージョンxコンパイラ バージョン

    • MtoAにロードされるので、Arnoldも! • 外部ライブラリ – 再帰的に全ての依存ライブラリ – ソースからコンパイル • プラグインと同じコンパイラ – Linuxでは二つのバージョンをコンパイル • _GLIBCXX_USE_CXX11_ABI=1 • _GLIBCXX_USE_CXX11_ABI=0 • ビルド時相応しいバージョンとリンク 20 コンパイラ指定問題 ABI指定問題 →CMakeで解決 © OLM Digital, Inc.
  17. • モダンCMakeデファクトスタンダード なぜCMake? コード 内部ライブラリ 外部ライブラリ 内部ライブラ リのバイナリ 外部ライブラ リのバイナリ

    コンパイルさ れたコード 実行ができる コード コンパイル リンク … add_executable(application1) target_sources(application1 PRIVATE src.cpp src.h) target_compile_features(application1 PRIVATE cxx_std_14) find_package(library1) target_link_libraries(application1 PRIVATE library1) 21 © OLM Digital, Inc.
  18. • DCCの対応はさまざま – モダンCMake対応 • Nuke • Houdini – CMake対応

    • Maya ‐ モダンではない • ターゲットの定義がない • 配布されているQtのCMakeの使用が難しい – CMake非対応 • Arnold, After Effects, Photoshop • 外部ライブラリ大体モダンCMake対応 – OpenCV, Qhull, Eigen… 映像制作においてのモダンCMake対応 22 © OLM Digital, Inc.
  19. コンパイラを指定する • WindowsはコマンドラインのGeneratorで回避 – Visual C++しか使われていない – ex: -GVisual Studio

    15 2017 Win64 • Linux – GCCしか使われていない – GeneratorではGCCのバージョンの指定不可能 – CMAKE_C_COMPILER、CMAKE_CXX_COMPILERだけでは不十分 – PATHの最初に追加する – sclを推奨 23 © OLM Digital, Inc.
  20. ABI指定 • _GLIBCXX_USE_CXX11_ABIの切り替え • ソースのコンパイルのABI指定 – コマンドのフラグ • New ABI:

    -D CMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=1' • Legacy ABI: -D CMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' – ソースからのライブラリもこれで • ライブラリのABIバージョン – find_packageにはABI系のパラメータがない 24 © OLM Digital, Inc.
  21. • 依存の必要なフラグ、ヘッダーなど推移的に • ライブラリからプログラムへ B が必要 c++11 OpenMP CMakeで推移的な解決 Library

    A Library B プログラム Uses Uses プログラムが必要 C++17 OpenGL OpenMP A が必要 c++14 A requires from B OpenMP C が必要 C++17 OpenGL Library C Uses 25 © OLM Digital, Inc.
  22. ライブラリのABI指定問題 • 依存関係を推移的な解決が必要 • プログラムからライブラリへ Library A Library B プログラム

    new ABI使用 new ABI使用 Maya 2024 New ABI Library C new ABI使用 new ABI使用 26 © OLM Digital, Inc.
  23. • find_packageの検索順番 – デフォルトはModuleからConfig – 指定ができる • Moduleで対応する – 全てのライブラリに必要

    if (WIN32) set(OpenCV_DIR "${Path_to_OpenCV_Windows}")#windows, version else() list(FIND CMAKE_CXX_FLAGS "-D_GLIBCXX_USE_CXX11_ABI=1" index_flags) if(index_flags GREATER_EQUAL 0) set(OpenCV_DIR "${Path_to_OpenCV_Linux_new_ABI}" else() set(OpenCV_DIR "${Path_to_OpenCV_Linux_old_ABI}" endif() endif() find_package(OpenCV ${OpenCV_FIND_VERSION} CONFIG REQUIRED)#because OpenCv has config files ライブラリのABI指定解決手法 例: FindOpenCV.cmake Config モードでOpenCVの設定 ABIフラグのチェック フォルダーの切り替え 27 © OLM Digital, Inc.
  24. まとめ • VFX Reference Platform – 更新で初めてABI問題を意識! – 更新を見ましょう •

    対応 – くまなくコンパイル • OS毎に ‐ LinuxのABI毎に • コンパイラバージョン毎に • DCCのSDKのバージョン毎に – CMakeとCIで自動化 28 © OLM Digital, Inc.
  25. 今後 • libstdc++に関してはしばらく大丈夫? – 互換性の保証はない – DeprecatedによってAPIの互換性すらなくなる • glibcでさえ勇断ができない •

    パッケージマネージャの導入で楽になる? – 全てのライブラリをソースからコンパイル • SIGGRAPH Asiaのコースでより詳細な話 – 2024年12月3日、16時、G602, G Block, Level 6 – CMake、Python、Jenkinsでの自動化 – Security – … 29 © OLM Digital, Inc. glibcのABIの安定 abi-laboratory