**Linux バイナリ互換性の聖杯:Musl と `dlopen`**

*概要  
  * Musl は軽量な C ライブラリで、静的リンクと小さなバイナリサイズを実現するよう設計されています。  
  * `dlopen` は実行時に共有ライブラリを動的ロードできる機能で、モジュール化されたアプリケーションを可能にします。

*主なメリット  
  * **バイナリサイズの削減** – 静的リンクされた Musl バイナリは多くの場合 < 5 MB です。  
  * **決定論的ビルド** – Musl の純粋 C 実装により、コンパイラ固有の不具合を回避できます。  
  * **動的柔軟性** – `dlopen` は再コンパイル不要でオプションのプラグインやドライバをロード可能です。

*一般的なユースケース  
  * ストレージが限られた組込みシステム。  
  * 攻撃面を最小化したいコンテナ環境。  
  * 実行時にプラグインを追加するアーキテクチャ(例:ウェブサーバ、メディアプレイヤー)。

*典型的なワークフロー  
  1. コアアプリケーションを Musl でコンパイル (`musl-gcc -static`)。  
  2. プラグインを共有オブジェクトとしてビルド (`gcc -fPIC -shared`)。  
  3. 実行時に `dlopen` でプラグインをロードし、`dlsym` でシンボルを取得。

*注意点と対策  
  * **互換性のギャップ** – Musl は glibc の拡張機能すべてをサポートしていない可能性があります。十分にテストしてください。  
  * **シンボル可視性** – エクスポート関数は `__attribute__((visibility("default")))` を付与しておく必要があります。  
  * **エラーハンドリング** – `dlopen` の戻り値を必ず確認し、`dlerror()` で詳細を調べてください。

*参考リソース  
  * Musl公式サイト: https://www.musl-libc.org/  
  * GNU `dlopen` マニュアル: https://man7.org/linux/man-pages/man3/dlopen.3.html  

Musl の軽量静的バイナリと `dlopen` の動的パワーを組み合わせることで、コンパクトなデプロイと実行時拡張性の両立が可能になります。これにより、モダンな Linux アプリケーションで求められる「小ささ」と「柔軟さ」のバランスを実現できます。

2026/01/26 16:41

**Linux バイナリ互換性の聖杯:Musl と `dlopen`** *概要 * Musl は軽量な C ライブラリで、静的リンクと小さなバイナリサイズを実現するよう設計されています。 * `dlopen` は実行時に共有ライブラリを動的ロードできる機能で、モジュール化されたアプリケーションを可能にします。 *主なメリット * **バイナリサイズの削減** – 静的リンクされた Musl バイナリは多くの場合 < 5 MB です。 * **決定論的ビルド** – Musl の純粋 C 実装により、コンパイラ固有の不具合を回避できます。 * **動的柔軟性** – `dlopen` は再コンパイル不要でオプションのプラグインやドライバをロード可能です。 *一般的なユースケース * ストレージが限られた組込みシステム。 * 攻撃面を最小化したいコンテナ環境。 * 実行時にプラグインを追加するアーキテクチャ(例:ウェブサーバ、メディアプレイヤー)。 *典型的なワークフロー 1. コアアプリケーションを Musl でコンパイル (`musl-gcc -static`)。 2. プラグインを共有オブジェクトとしてビルド (`gcc -fPIC -shared`)。 3. 実行時に `dlopen` でプラグインをロードし、`dlsym` でシンボルを取得。 *注意点と対策 * **互換性のギャップ** – Musl は glibc の拡張機能すべてをサポートしていない可能性があります。十分にテストしてください。 * **シンボル可視性** – エクスポート関数は `__attribute__((visibility("default")))` を付与しておく必要があります。 * **エラーハンドリング** – `dlopen` の戻り値を必ず確認し、`dlerror()` で詳細を調べてください。 *参考リソース * Musl公式サイト: https://www.musl-libc.org/ * GNU `dlopen` マニュアル: https://man7.org/linux/man-pages/man3/dlopen.3.html Musl の軽量静的バイナリと `dlopen` の動的パワーを組み合わせることで、コンパクトなデプロイと実行時拡張性の両立が可能になります。これにより、モダンな Linux アプリケーションで求められる「小ささ」と「柔軟さ」のバランスを実現できます。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

記事では、Go を使用して完全に静的なプログラムを構築し、Godot を利用して glibc か musl のいずれかに依存する Linux ディストリビューション上で動作させる方法について説明しています。

  • 背景: Go はカーネル ≥ 3.2 用に静的コンパイルできますが、GPU ドライバやグラフィックスライブラリは特定の C ライブラリ(glibc または musl)にリンクする必要があります。これらを混在させると失敗します——glibc バイナリは musl システムで動作せず、逆も同様です。
  • 問題と対処法:
    c‑shared
    c‑archive
    モードでの初期試行が musl では失敗したため、著者は graphics.gd 用にビルドオーバーレイ(
    GOOS=musl
    )を導入しました。最終的な解決策として、共有 C モードを廃止し、Go コードを Godot の静的アーカイブと直接リンクさせることで、glibc と musl 両方の libc 実装に対応する単一バイナリを生成しました。
  • 配布上の問題: このバイナリはカーネル ≥ 3.2 であればどんな Linux 上でも動作しますが、完全に静的な graphics.gd バイナリは失敗します。Godot は X11/Wayland/OpenGL/Vulkan 用に
    dlopen
    を使用し、musl は静的モードでダイナミックリンカを提供できません(TLS の非互換性)。そのため、glibc と musl 両方のリンク済みビルドを公開する必要があります。
  • 将来の修正案:
    dlopen
    が弱いシンボルであることから、著者はホストのダイナミックリンカをロードし、アセンブリトランペット経由でシステム libc の TLS に切り替える小さな C ヘルパーを埋め込む提案をしています。これが統合されれば、musl +
    dlopen
    でハードウェアアクセラレーション付きのグラフィックスを持つ真に静的バイナリが実現できるでしょう。
  • デモと使用方法: 「Dodge The Creeps」プロジェクト(
    https://release.graphics.gd/dodge_the_creeps.static
    )のサンプルビルドは、GCC がインストールされた任意の Linux システムで実行・レンダリングできます。ユーザーは
    GOOS=musl GOARCH=amd64 gd build
    export_presets.cfg
    を削除して新しい musl プレセットを追加)を使用して、自分のプロジェクトを musl 向けにクロスコンパイルできます。

本文

Go + Godot を使ってネイティブかつインストール可能な Android・iOS バイナリ(プロプライエタリ SDK なし)を作るのは、実際にあまり難しくありませんでした。そこで、本格的な挑戦に移ります…

Linux のバイナリ互換性

(参考文献:https://jangafx.com/insights/linux-binary-compatibility)

ここ数年、Linux 用のコマンドラインソフトウェアやサーバーを安定して配布することは非常に簡単です。

go build
を実行すれば、カーネル 3.2(2012 年リリース)以降で動く単一の静的バイナリが出来上がります。
問題は、ハードウェアアクセラレーション付きグラフィックスを使いたいときに現れます。Linux の GPU ドライバーはすべて C ABI を介して動的ライブラリへアクセスします。この C ライブラリは特定の libc(主に glibc、あるいは musl ベースのディストリビューション)に対してビルドされます。glibc 用にコンパイルしたライブラリや実行ファイルは musl システムで動かず、逆も同様です—明らかな非互換性です。

私自身が直接経験しました。最近、個人用 PC の OS を Void Linux の musl エディションに置き換えました。musl で Zed エディタをビルドするのは大変でしたし、

graphics.gd
プロジェクトも同様に壊れがちです。Go は musl 向けに
c‑shared
c‑archive
を正しくサポートしていません。

この問題には二つの理由があります:

  1. これは現在使用しているディストリビューションであり、
    graphics.gd
    プロジェクトをビルドできる必要がある。
  2. musl は glibc より静的リンクに優れています。Linux バイナリ互換性の問題解決策は、おそらく musl に関係しているでしょう。

musl のサポート

Go で musl の問題を回避するため、

GOOS=musl
用にビルドオーバーレイを適用したランタイムパッチを導入しました。これは
graphics.gd
に追加した新しい
GOOS
です。

次に、musl 用の

c‑shared
ビルドを廃止しました。これらは公式 Godot バイナリに Go を簡単に組み込めるため便利でしたが、Godot Foundation は公式 musl ビルドを提供していません。その代わり、Go コードを直接 Godot の
c-archive
とリンクし、単一のバイナリを作成しました。

驚き: これで

graphics.gd
が musl をサポートします!

ただし問題があります。Linux 用にプロジェクトを公開したい場合、glibc ビルドと musl ビルドの両方を用意して、ユーザーにどちらを選ぶか伝える必要があります。Void Linux を導入する前は musl と glibc の違いすら完全には理解できておらず、結果として問題を増やしてしまったように感じます。


単一静的バイナリ + グラフィックス

ここで止まります。musl のメリットの一つは優れた静的ライブラリサポートです。

graphics.gd
プロジェクトを単一の静的バイナリにビルドできる方法があるはずです。

実際、Godot は Linux で全ての依存関係を含みます。その他は実行時に動的ロードされますので、

-static
フラグを付ければ…

ERROR Dynamic loading not supported

Godot は X11、Wayland、OpenGL、Vulkan 等とのインタフェースに

dlopen
を使用します。musl は TLS(スレッドローカルストレージ)の実装が異なるため、静的バイナリで
dlopen
の実装を拒否します。

しかし心配は不要です!

dlopen
は弱シンボルとしてコンパイルされるので、
graphics.gd
がそれを実装していれば、単一の静的バイナリが 3.2+ Linux システム上で動作する可能性があります。


聖杯

これには先例があります。C の detour 技術では

dlopen
を使って SDL をロードし、標準ライブラリ無しでグラフィックスを表示できます。Cosmopolitan の
dlopen
も同様の手法を採用しています。したがって、ここでの解決策は musl 用にこれを拡張することです。

具体的には、ターゲットマシン向けに小さな C プログラム(またはコンパイル済み)を含めます。このプログラムをロードし、同一プロセスから実行します。ホストの動的リンカを取り込み、システムの

dlopen
を盗用して
graphics.gd
に戻ります。呼び出し期間中はアセンブリトランポリンでシステム libc の TLS へ切り替えます。全体像は cgo と似ています。

多くの試行錯誤と LLM(大規模言語モデル)の活用を経て、musl +

dlopen
が Linux 用に単一静的バイナリ+グラフィックスを実現するために必要なすべてであることが判明しました。これで Go の単一静的バイナリ体験とハードウェアアクセラレーション付きグラフィックスの完全サポートが Linux で可能になります。


試してみる

以下は、GCC がインストールされている任意の Linux システム上で実行(およびグラフィックス描画)できるべき

graphics.gd
の「Dodge The Creeps」サンプルプロジェクトのビルドです。まだヘルパーバイナリは埋め込んでいません。

https://release.graphics.gd/dodge_the_creeps.static

任意のプラットフォームで自分のプロジェクトをクロスコンパイルすることもできます:

GOOS=musl GOARCH=amd64 gd build

export_presets.cfg
を削除して、新しい musl エクスポートプリセットがプロジェクトに追加されるようにしてください。

同じ日のほかのニュース

一覧に戻る →

2026/01/27 7:03

**Windows の状況:** Windows 11 は現在どんな状態になっているのでしょうか?

## 日本語訳: **概要:** Microsoft の最新 Windows 更新は、安定したオペレーティングシステムよりも AI 主導の機能―特に Copilot ―を優先しているため、広範なバグ、パフォーマンス問題、およびセキュリティ欠陥が発生しています。2026 年 1 月の KB パッチは、新しい Intel プロセッサでシャットダウン失敗、クラウド PST を使用した Outlook のハング、メモ帳、RDP、およびデバイスドライバーのクラッシュを引き起こしました。同じ更新パッケージは、大規模 AI モデルのダウンロードによりサイズが 4 倍になり、バイナリが肥大化し、「Copilot‑ification」による UI が導入されました。暗号化されていないスクリーンショットへの懸念から削除を余儀なくされた事例もあります。 このシフトは、2023 年 12 月に Edge、メモ帳、設定、Office 等へ Copilot を投入したことから始まりました。以前のローカルアカウント用修正(OOBE.exe /bypassNRO)は後続の更新で閉じられ、Microsoft アカウントを持たないユーザーの使い勝手が低下しました。RDP のロールバック、DRM 失敗、およびエクスプローラーの遅延に関する月次報告は、24H2/25H2 リリースに起因しています。 Microsoft は、大規模な AI 重視更新を継続しつつ、重要なバグについては迅速な KB パッチで対処すると考えられます。この戦略はユーザーの信頼を損ない、企業のサポートコストを増大させ、一部の企業が代替 OS プラットフォームやデスクトップ AI 機能の採用をより慎重に検討するきっかけになる可能性があります。 **概要スケルトン** - **メインメッセージ(何を伝えたいか)** Microsoft の最近の Windows 更新は、安定した OS よりも Copilot などの AI 主導機能を積極的に推進する方向転換が原因で、広範なバグ・パフォーマンス低下・セキュリティ問題を引き起こしています。 - **証拠 / 推論(何故そう言えるか)** - 2026 年 1 月の KB 更新により、新しい Intel チップでシャットダウン失敗、クラウド PST を使った Outlook のハング、およびアプリ(メモ帳、RDP、デバイスドライバー)のクラッシュが発生。 - 同じ更新パッケージは AI モデルのダウンロードにより以前のリリースの 4 倍のサイズになり、バイナリが肥大化。 - Copilot の統合で UI が「Copilot‑ification」され、暗号化されていないスクリーンショットへの懸念から削除を強いられた。 - **関連ケース / 背景(文脈・過去の出来事)** - このシフトは、2023 年 12 月に Microsoft Copilot が Edge、メモ帳、設定、Office 等へ投入されることで始まりました。 - ローカルアカウント用ワークアラウンド(OOBE.exe /bypassNRO)は後続の更新で閉じられ、ローカル アカウント利用者の使い勝手が低下。 - RDP のロールバック、DRM 失敗、およびエクスプローラーの遅延に関する月次報告は、24H2/25H2 リリースに起因。 - **今後何が起こるか(将来の展開・予測)** Microsoft は大規模な AI 重視更新を継続しつつ、重要バグについては迅速な KB パッチで対処すると見込まれます。Copilot のアップセルを優先することで、毎月のスキャンダルが増え、安定性が回復されるまでユーザー信頼が徐々に低下する可能性があります。 - **影響(ユーザー / 企業 / 業界)** - ユーザーは頻繁なシステムクラッシュ、生産性の損失、および暗号化されていないデータ取得へのセキュリティ懸念に直面。 - 企業はサポートコストが増大し、新しい Windows リリース採用を再検討する可能性。 - 業界全体では、競合 OS プラットフォームへのシフトやデスクトップ環境での AI 機能採用に対するより慎重な姿勢が広まる可能性があります。

2026/01/26 23:41

テレビは本日で百周年を迎えました。

## Japanese Translation: テレビは本日100周年を迎え、ジョン・ログィー・ベアードの先駆的な業績に特に焦点が当てられました。1926年1月26日、ベアードはフリス通り22番地のソーホウワークショップで回転ディスクとレンズ、穴付きシートを用いたライブテレビの最初の公開デモンストレーションを行いました。その後、光感受性セルを追加して影の階調を送信できるようにしました。最初に送信された画像は、現在ヘイスティングス博物館で展示されている聖ジョンズ救急隊メダルの影でした。 ベアードの初期デモには、バラエティ・ドミー「ストゥッキー・ビル」と最初の人間被写体ウィリアム・テイントンが含まれます。1927年にフォノヴィジョンを導入し、画像をグラムフォンレコードに記録しました。1928年にはノクトヴィジョン(赤外線テレビ)、カラーテレビ、および立体テレビの実験を行いました。また、1930–31年にBBC放送用の30ライン機械式システムも開発しました。 1932年にEMIによって電子エミトロンカメラが導入され、ベアードの240ライン機械式システムとマルコニ-EMIの405ライン電子システムは一時的にロンドンテレビで採用されました。三か月後、最終的にはマルコニ・システムが優位になりました。 ベアードは1924年11月にフリス通り22番地へ移転し、ゴードン・セルフリッジのパーム・コートデモで60ポンドを稼ぎ、第二次世界大戦で会社が破産手続きになるまで発明の展示を続けました。爆撃被害により後期のカラー作業は中断され、1946年に57歳で脳卒中で亡くなりました。 初期の成功にもかかわらず、英国家庭へのテレビ機器の普及には数十年が必要でした。カラーTVは1960年代まで一般的になりませんでした。今日ではほぼすべての人がテレビまたは同等のデバイスを所有しており、これはベアードの回転ディスクと機械式画像伝送に関する先駆的な業績のおかげです

2026/01/21 1:52

滑走路に秘められた設計技術

## 日本語訳: ### 要約: 本文は、2025年9月に発生した最近の滑走路オーバーランが、EMAS(Energy‑Management and Arresting System)とFAAガイドラインに従った慎重な設計などの高度な安全システムによって防止されたことを説明しています。これらのガイドラインは、航空場で使用される最大機体を基準に滑走路長を決定しつつ、風向き・温度・標高も考慮して十分な停止距離を確保します。Embraer 145、Gulfstream、Bombardier機が関与した米国の3件の事故では、EMASが衝撃エネルギーを効果的に吸収し、航空機が滑走路外の危険箇所に着地することを防ぎました。FAAの詳細ガイダンスは、風向き(約95%)に合わせて滑走路を配置し、ディスプレースド・スレッショルド、ブラストパッド、ランウェイセーフティエリア(RSA)を追加して安全マージンを高めることを推奨しています。今後は、EMASの活用と機体種別に応じた舗装材の調整、単一方向が支配的でない場合の風向き戦略の精緻化が継続されます。これらの改善はパイロットの怪我リスクを減らし、空港が安全インフラへの投資を促進させ、航空業界に滑走路設計がオーバーランを防ぐことへの信頼感を与え、保険費用の低減につながる可能性があります。 ### 要約骨格 **本文が主に伝えようとしていること(メインメッセージ)** 2025年9月の滑走路オーバーランは、EMASなどの設計上の安全機能のおかげで回避され、滑走路設計はFAAガイドラインに従い、主要機体を基準に長さが決定され環境要因も調整されています。 **証拠/根拠(なぜそう言われているのか)** 米国で起きた3件の事故では航空機が滑走路を超えて衝突したものの、EMASがエネルギーを吸収し危険箇所に着地しませんでした。FAAの40ページの文書は、長さ・風・温度が設計を決定する方法を説明しており、舗装層と表面処理は摩擦と構造的健全性を維持するよう指定されています。 **関連事例/背景(コンテキスト、過去の出来事)** オーバーランはEmbraer 145、Gulfstream、Bombardier機で2025年9月24–3日に発生。FAAガイドラインは滑走路を主流風に合わせる(約95%)とし、ディスプレースド・スレッショルド、ブラストパッド、RSAを標準安全対策として含めています。 **今後何が起こりうるか(将来の展開/予測)** 将来的な滑走路計画ではEMAS使用の強調、機体種別に応じた舗装材の適用、単一風向きが支配的でない場合の風向き戦略の改善が継続されるでしょう。設計更新は温度・標高調整をより正確に取り入れる可能性があります。 **これらが与える影響(利用者/企業/業界)** パイロットは安全なオーバーランと怪我リスクの低減を享受し、空港はEMASや表面メンテナンスへの投資を検討。航空業界は滑走路長計算が事故防止に十分であるという自信を得て、保険・責任コストの削減につながる可能性があります。

**Linux バイナリ互換性の聖杯:Musl と `dlopen`** *概要 * Musl は軽量な C ライブラリで、静的リンクと小さなバイナリサイズを実現するよう設計されています。 * `dlopen` は実行時に共有ライブラリを動的ロードできる機能で、モジュール化されたアプリケーションを可能にします。 *主なメリット * **バイナリサイズの削減** – 静的リンクされた Musl バイナリは多くの場合 < 5 MB です。 * **決定論的ビルド** – Musl の純粋 C 実装により、コンパイラ固有の不具合を回避できます。 * **動的柔軟性** – `dlopen` は再コンパイル不要でオプションのプラグインやドライバをロード可能です。 *一般的なユースケース * ストレージが限られた組込みシステム。 * 攻撃面を最小化したいコンテナ環境。 * 実行時にプラグインを追加するアーキテクチャ(例:ウェブサーバ、メディアプレイヤー)。 *典型的なワークフロー 1. コアアプリケーションを Musl でコンパイル (`musl-gcc -static`)。 2. プラグインを共有オブジェクトとしてビルド (`gcc -fPIC -shared`)。 3. 実行時に `dlopen` でプラグインをロードし、`dlsym` でシンボルを取得。 *注意点と対策 * **互換性のギャップ** – Musl は glibc の拡張機能すべてをサポートしていない可能性があります。十分にテストしてください。 * **シンボル可視性** – エクスポート関数は `__attribute__((visibility("default")))` を付与しておく必要があります。 * **エラーハンドリング** – `dlopen` の戻り値を必ず確認し、`dlerror()` で詳細を調べてください。 *参考リソース * Musl公式サイト: https://www.musl-libc.org/ * GNU `dlopen` マニュアル: https://man7.org/linux/man-pages/man3/dlopen.3.html Musl の軽量静的バイナリと `dlopen` の動的パワーを組み合わせることで、コンパクトなデプロイと実行時拡張性の両立が可能になります。これにより、モダンな Linux アプリケーションで求められる「小ささ」と「柔軟さ」のバランスを実現できます。 | そっか~ニュース