1 ポイント 投稿者 GN⁺ 2023-07-10 | 1件のコメント | WhatsAppで共有
  • .NET モジュールのファイル形式の限界を探り、標準出力に "Hello, World!" を表示する最小の実行ファイルを作成します。
  • 実験のために、筆者は C# または CIL で実装されたマネージド エントリポイントを使い、.NET Framework 4.x.x 上で実行され、サードパーティ依存がないことという任意のルールを設定します。
  • 実行ファイルのサイズを段階的に縮小するため、null 許容参照アノテーションを無効化し、.NET モジュールを手作業で記述し、インポートとベース再配置を削除し、不要なメタデータを取り除き、ASCII 文字列の利用を最適化します。
  • 最終結果は、理論上可能な有効な .NET PE ファイルの最小サイズである 889 バイトの実行ファイルです。
  • 記事では、実行ファイルのサイズを縮小するために行った各段階について、コード例と説明を提供しています。
  • 筆者は、ファイル形式を理解し、実行ファイルサイズを最適化するために戦略的な判断を行う重要性を強調しています。
  • 未使用のパディング セグメントに文字列を移動すると、ファイルは 13 バイト小さくなります。
  • mscorlib への参照を削除すると、バイナリの領域を節約できます。
  • .NET メタデータ ディレクトリの VersionString を切り詰めると、さらにバイトを節約できます。
  • バイナリの最終サイズは 834 バイトで、圧縮すると 476 バイトまでさらに小さくできます。
  • 意味のないプロジェクトであっても、既存システムの限界を探るのは楽しいことがあります。
  • 筆者は参考用として完全なソースコードを GitHub で公開しています。
  • 記事では、リバースエンジニアリング、コードゴルフ、PE ファイル最適化について論じています。
  • 筆者は自身の経験を共有し、ファイルサイズ縮小に関するさらなる探究を促しています。
  • この記事は筆者により CC BY 4.0 でライセンスされています。

1件のコメント

 
GN⁺ 2023-07-10
Hacker Newsのコメント
  • Michal Strehovskýは .NET を使って 8KB 未満のスネークゲームを作成しました。
  • 実行ファイルはシステムにインストールされたランタイムを必要とするため、この記事は人々を混乱させる可能性があります。
  • 実際の実行ファイルについて信頼できる情報源は、Native AOT バイナリです。
  • 著者の所在地は興味深い南極のマクマード基地です。
  • セクションのアラインメントが 0x200 バイトなので、ファイルサイズが大きくなります。
  • デモシーンは 1k バイナリを生み出してきました。
  • バイナリの詳細を掘り下げることで、深い洞察が得られ、知識を豊かにできます。
  • 完全に自己完結型でコンパイルされた C# Hello World は、約 440 kB のサイズで実現可能です。
  • .NET のクラシックフレームワークは廃止されており、新しいアプリはその上に構築すべきではありません。
  • C コンパイラを使ってコンパイルする方が、.NET を使うより簡単かもしれません。
  • 一部のコメントでは、ネイティブコンパイルされた .NET 実行ファイルへの関心が示されています。
  • Oberon+ IDE の Hello.dll モジュールは、わずか 2048 バイトです。
  • TurboPascal v1 を使って、1k 未満の Hello World com をビルドしました。