ファットバイナリ(またはマルチアーキテクチャバイナリ)とは、複数の命令セットにネイティブなコードで拡張(または「ファット化」)されたコンピュータ実行可能プログラムまたはライブラリであり、結果として複数のプロセッサタイプで実行できます。[ 1 ]これにより、通常の単一アーキテクチャバイナリファイルよりも大きなファイルが生成されるため、この名前が付けられています。
一般的な実装方法は、各命令セットに対応するマシンコードのバージョンを用意し、その前にすべてのオペレーティングシステムと互換性のあるコードを含む単一のエントリポイントを配置し、適切なセクションへのジャンプを実行するというものです。別の実装方法としては、異なる実行可能ファイルを異なるフォークに格納し、それぞれにオペレーティングシステムが直接使用する独自のエントリポイントを持たせる方法があります。
ファットバイナリの使用は、NeXTSTEPおよび NeXTSTEP から派生した Apple オペレーティングシステム ( macOSやiOSなど)を除いて、オペレーティングシステムソフトウェアでは一般的ではありません(下記参照)。同じ問題を解決するには、インストーラプログラムを使用してインストール時にアーキテクチャ固有のバイナリを選択する ( Android の複数のAPKなど)、実行時にアーキテクチャ固有のバイナリを選択する ( Plan 9のユニオン ディレクトリなど)など、いくつかの代替手段があります。GNUstepのファットバンドル)[ 2 ] [ 3 ] 、ソースコード形式でソフトウェアを配布してその場でコンパイルするか、仮想マシン( Javaなど)とジャストインタイムコンパイルを使用する。
1988年、アポロコンピュータのDomain/OS SR10.1では、 Motorola 680x0とApollo PRISMの実行可能ファイルのバイナリをバンドルした新しいファイルタイプ「cmpexe」(複合実行可能ファイル)が導入されました。[ 4 ]
ファットバイナリ方式は、1994 年に始まったApple Macintoshの68kマイクロプロセッサからPowerPCマイクロプロセッサへの移行をスムーズにしました。古いプラットフォーム向けの多くのアプリケーションは、進化するエミュレーション方式の下で新しいプラットフォーム上で透過的に実行されましたが、エミュレートされたコードは一般的にネイティブ コードよりも遅く実行されます。「ファットバイナリ」としてリリースされたアプリケーションはより多くのストレージ スペースを消費しましたが、どちらのプラットフォームでもフルスピードで実行されました。これは、同じプログラムの 68k コンパイル バージョンと PowerPC コンパイル バージョンの両方を実行可能ファイルにパッケージ化することによって実現されました。[ 5 ] [ 6 ]古い 68k コード (CFM-68K またはクラシック 68K) は引き続きリソース フォークに格納され、新しい PowerPC コードはPEF形式でデータ フォークに格納されました。[ 7 ] [ 8 ] [ 9 ]
ファットバイナリは、PowerPCまたは68kのみをサポートするプログラムよりも大きかったため、不要なバージョンを削除するユーティリティが多数作成されました。[ 5 ] [ 6 ] 80MBハードドライブが一般的なサイズであった小型ハードドライブの時代には、プログラムコードがドライブ全体の使用率の大部分を占めていたため、ファットバイナリの不要なメンバーを削除することでハードドライブのかなりのスペースを解放できたため、これらのユーティリティは役に立つことがありました。
ファットバイナリは、 NeXTのNeXTSTEP / OPENSTEPオペレーティングシステムの機能であり、NeXTSTEP 3.1以降で利用可能です。
NeXTSTEPでは、これらは「マルチアーキテクチャバイナリ」と呼ばれています。マルチアーキテクチャバイナリは、NeXTのMotorola 68kベースのハードウェアとNeXTSTEPを実行するIntel IA-32ベースのPCの両方でソフトウェアを実行できるようにコンパイルすることを目的としており、両方のプラットフォームで単一のバイナリファイルを使用します。[ 10 ]
その後、OPENSTEPアプリケーションをPCやOPENSTEPがサポートするその他のプラットフォーム(m68k/ SPARC / PA-RISC)上で実行できるようにするために使用されました。
マルチアーキテクチャ(ファット)バイナリは、Mach-Oフォーマットの特徴の一つです。
ツールチェーンとIDEが拡張され、クロスコンパイルが容易になった。含めるアーキテクチャを選択するためのチェックボックスがいくつか用意された。
すべてのマルチアーキテクチャバイナリは、struct fat_header2 つの符号なし整数を含む構造体 ( ) で始まります。最初の整数 ("magic") は、このファイルが Fat バイナリであることを識別するマジックナンバーとして使用されます。2 番目の整数 ( nfat_arch ) は、アーカイブに含まれる Mach-O ファイルの数 (異なるアーキテクチャ用の同じプログラムのインスタンスの数) を定義します。このヘッダーの後には、nfat_arch個の fat_arch 構造体 ( ) があります。この構造体は、ファイルを見つけるオフセット (ファイルの先頭から)、アライメント、サイズ、および Mach-O バイナリ (アーカイブ内) が対象とする CPU タイプとサブタイプを定義します。struct fat_arch
開発者ツールに同梱されていたGNUコンパイラコレクションのバージョンでは、 NeXTSTEPが動作する様々なアーキテクチャ向けにソースコードをクロスコンパイルすることができました。例えば、複数の「-arch」オプション(引数としてアーキテクチャを指定)を使用することで、ターゲットアーキテクチャを選択することが可能でした。これは、異なるアーキテクチャで動作するNeXTSTEPプログラムを配布する便利な方法でした。
また、異なる対象オブジェクトファイルを使用してライブラリを作成することも可能でした(例えば、NeXTSTEPのlibtoolを使用)。
Apple Computer は 1996 年に NeXT を買収し、OPENSTEP コードの開発を継続しました。Mach-O は Apple のフリーのDarwin オペレーティングシステム(2000 年) および Apple のMac OS X (2001 年) のネイティブ オブジェクト ファイル フォーマットとなり、NeXT のマルチ アーキテクチャ バイナリは引き続きオペレーティングシステムでサポートされました。Mac OS X では、マルチ アーキテクチャ バイナリを使用して、アーキテクチャの複数のバリアントをサポートできます。たとえば、PowerPC G3、PowerPC G4、およびPowerPC 970世代のプロセッサ向けに最適化された32 ビットコードの異なるバージョンを持つことができます。また、32 ビットと64 ビットのPowerPC、または PowerPC とx86、またはx86-64とARM64など、複数のアーキテクチャをサポートするためにも使用できます。[ 11 ]

2005年、AppleはPowerPCプロセッサからIntel x86プロセッサへの移行を発表しました。Appleは、マルチアーキテクチャバイナリ形式の実行ファイルを使用することで、PowerPCとx86の両方をネイティブにサポートする新しいアプリケーションの配布を推進しました。[ 12 ] Appleは、このようなプログラムを「ユニバーサルアプリケーション」と呼び、ファイル形式を「ユニバーサルバイナリ」と呼んでいます。これはおそらく、この新しい移行を以前の移行やマルチアーキテクチャバイナリ形式の他の使用法と区別する方法でしょう。
ユニバーサルバイナリ形式は、既存のネイティブPowerPCアプリケーションの前方移行には必須ではありませんでした。2006年から2011年まで、AppleはPowerPC(PPC)からx86への動的バイナリ変換ツールであるRosettaを提供し、この役割を担わせました。しかし、Rosettaはかなり高いパフォーマンスオーバーヘッドがあったため、開発者はユニバーサルバイナリを使用してPowerPCとIntelの両方のバイナリを提供するよう促されました。ユニバーサルバイナリの明らかな欠点は、インストールされた実行可能ファイルがすべて大きくなることですが、Mac OS Xの導入からIntelへの移行までの間、ハードドライブの容量は実行可能ファイルのサイズを大幅に上回っていました。ユニバーサルバイナリは同じアプリケーションの単一プラットフォーム版の2倍のサイズになるかもしれませんが、通常利用可能な空き容量の量を考慮すると、余分なサイズは一般的に無視できる程度です。実際、プログラムリソースを複製するのではなく共有できるため、ユニバーサルバイナリアプリケーションは、2つの単一アーキテクチャアプリケーションよりも小さいことがよくあります。すべてのアーキテクチャが必要ない場合は、lipoおよびdittoコマンドラインアプリケーションを使用して、マルチアーキテクチャバイナリイメージからバージョンを削除し、いわゆるシンバイナリを作成できます。
さらに、マルチアーキテクチャバイナリ実行ファイルには、PowerPCおよびx86の32ビット版と64ビット版の両方のコードを含めることができ、アプリケーションを32ビットプロセッサをサポートする形式で出荷しつつ、64ビットプロセッサで実行する際にはより大きなアドレス空間と広いデータパスを利用できるようにすることが可能です。
Xcode開発環境のバージョン2.1から3.2(Mac OS X 10.4から10.6で動作)では、AppleはアプリケーションをIntelアーキテクチャとPowerPCアーキテクチャの両方に対応させるユーティリティを搭載していました。ユニバーサルバイナリには、最終的に最大4つのバージョンの実行可能コード(32ビットPowerPC、32ビットx86、64ビットPowerPC、64ビットx86 )が含まれるようになりました。しかし、Xcode 4.0ではPowerPCのサポートが削除されたため、 Mac OS X 10.7以降を使用している開発者は利用できません。
2020年、AppleはIntel x86プロセッサからAppleシリコン(ARM64アーキテクチャ)への移行を発表しました。この移行を円滑に進めるため、AppleはUniversal 2バイナリ形式のサポートを追加しました。Universal 2バイナリファイルは、x86-64とARM64の両方の実行可能コードを含むマルチアーキテクチャバイナリファイルであり、64ビットIntelと64ビットAppleシリコンの両方でネイティブにバイナリを実行できます。さらに、Appleはx86からArm64命令セットへの動的バイナリ変換であるRosetta 2を導入し、Universalバイナリ形式を持たないアプリケーションも実行できるようにしました。
2006年、AppleはPowerPCからIntel CPUに切り替え、Open FirmwareをEFIに置き換えた。しかし、2008年までに、一部のMacは32ビットEFIを使用し、一部は64ビットEFIを使用していた。このため、Appleは32ビットと64ビットの両方のEFIバイナリを含む「fat」バイナリでEFI仕様を拡張した。[ 13 ]
Intel 8080 (およびZilog Z80 ) プロセッサファミリ用のCP/M-80、MP/M-80、Concurrent CP/M、CP/M Plus、Personal CP/M-80、SCP 、およびMSX-DOS実行ファイルは、 Intel 8086バイナリ用のDOS互換オペレーティングシステムと同じ.COMファイル拡張子を使用します。[ nb 1 ]どちらの場合も、プログラムはオフセット +100h にロードされ、ファイルの最初のバイトにジャンプして実行されます。[ 14 ] [ 15 ] 2 つのプロセッサファミリのオペコードは互換性がないため、間違ったオペレーティングシステムでプログラムを開始しようとすると、不正確で予測不可能な動作が発生します。
これを回避するために、CP/M-80 プログラムと DOS プログラムの両方を含むファット バイナリを作成する方法が考案されており、その前には両方のプラットフォームで正しく解釈される初期コードが続きます。[ 15 ]これらの方法は、それぞれの環境用に作成された完全に機能する 2 つのプログラムを組み合わせるか、間違ったプロセッサで開始された場合にプログラムが適切に終了するようにするスタブを追加します。これが機能するためには、.COM ファイルの最初の数個の命令 (ガジェット ヘッダーとも呼ばれます[ 16 ] ) が 8086 プロセッサと 8080 プロセッサの両方で有効なコードである必要があり、これによりプロセッサはコード内の異なる場所に分岐します。[ 16 ] 例えば、Simeon Cran のエミュレータ MyZ80 のユーティリティは、オペコード シーケンスEBh、52h、EBhで始まります。[ 17 ] [ 18 ] 8086 はこれをジャンプとみなし、オフセット +154h から次の命令を読み取りますが、8080 または互換プロセッサはそのまま進み、+103h から次の命令を読み取ります。この目的で使用される同様のシーケンスはEBh、03h、C3hです。[ 19 ] [ 20 ] John C. Elliott の FATBIN [ 21 ] [ 22 ] [ 23 ]は、CP/M-80 と DOS .COM ファイルを 1 つの実行可能ファイルに結合するユーティリティです。[ 17 ] [ 24 ]彼のオリジナルのPMsfxの派生版は、吉彦美野のPMarcによって作成されたアーカイブをCP/M-80 と DOS の両方で自己解凍できるように変更し、 EBh、18h、2Dh、70h、6Dh、73h、2Dhから始めて、自己解凍PMAアーカイブの "-pms-" シグネチャも含めるようにし、[ 25 ] [ 17 ] [ 24 ] [ 18 ]それによって実行可能な ASCII コードの一形式も表しています。
DOS互換オペレーティングシステムがCP/M-80およびMSX-DOSマシン用の.COMプログラムを誤って実行しないようにするもう1つの方法は[ 15 ]、8080コードをC3h、03h、01hで開始することです。これはx86プロセッサによって「RET」命令としてデコードされ、プログラムを正常に終了しますが[ nb 2 ]、8080プロセッサでは「JP 103h」命令としてデコードされ、プログラム内の次の命令にジャンプするだけです。同様に、SLR SystemsのCP/MアセンブラZ80ASM+は、DOS上で誤って実行されるとエラーメッセージを表示します。[ 17 ]
CP/M-80 3.0 .COM ファイルの中には、 GENCOMによって1 つ以上のRSXオーバーレイが添付されているものがあります。[ 26 ]その場合、ファイルは追加の256 バイトのヘッダー (1ページ) で始まります。これを示すために、ヘッダーの最初のバイトはマジック バイトC9hに設定されます。これは、このタイプの COM ファイルを CP/M 3.0実行可能ローダーに識別する署名として機能するだけでなく、8080 互換プロセッサ用の「RET」命令としても機能し、古いバージョンの CP/M-80 でファイルが実行された場合に正常な終了につながります。[ nb 2 ]
C9h は、どの x86 プロセッサでもプログラムの最初のバイトとして適切ではありません (世代によって意味が異なりますが、[ nb 3 ]意味のある最初のバイトではありません)。DOS の一部のバージョンの実行可能ローダーは、C9hで始まる COM ファイルを拒否し、誤った動作を回避します。
同様の重複コードシーケンスは、Z80/ 6502 [ 17 ]、8086/ 68000 [ 17 ]、またはx86/ MIPS / ARMバイナリの組み合わせに対しても考案されている。[ 16 ]
CP/M-86と DOS は実行可能ファイルのファイル拡張子を共有していません。[注 1 ]そのため、通常は実行可能ファイルを混同することはありません。しかし、初期の DOS はアーキテクチャの点で CP/M と非常に多くの共通点があったため、初期の DOS プログラムの中には、実行可能コードを含むバイナリを共有するように開発されたものもありました。これを行ったことが知られているプログラムの 1 つはWordStar 3.2xで、 CP/M-86 とMS-DOSの移植版で同一のオーバーレイ ファイルを使用し、[ 27 ]実行時にこれらのオペレーティングシステムの異なる呼び出し規約に適応するために動的に修正されたコードを使用していました。[ 27 ]
Digital ResearchのCP/M-86およびDOS用のGSXも、バイナリ的に同一の16ビットドライバを共有している。[ 28 ]
DOSデバイス ドライバ(通常、ファイル拡張子は.SYS ) は、慣例として最初の 4 バイトがFFFFFFFFhであるファイル ヘッダーで始まりますが、これは必須ではありません。 [ 29 ]これは、ドライバがロードされるとき(通常、DOS BIOSでCONFIG.SYSのDEVICEステートメントを実行するとき) にオペレーティングシステムによって動的に修正されます。DOS は、DEVICE ごとにロードされる .COM 拡張子のファイルを拒否せず、FFFFFFFFh をテストしないため、組み込み COM プログラムのエントリ ポイントへのジャンプ命令をファイルの最初の 4 バイト (通常は 3 バイトで十分) 内に配置することで、COM プログラムとデバイス ドライバを同じファイルに結合することが可能です。[ 30] [ 29 ]組み込みプログラムとデバイス ドライバのセクションが共通のコードまたはデータの一部を共有している場合、コードは、オフセット +0100h で .COM スタイルのプログラムとして、また +0000h でデバイス ドライバとしてロードされることを処理する必要があります。[ 30 ]位置に依存しないように設計されていない共有コードが「間違った」オフセットにロードされた場合、再配置ローダーによって既に実行されていたものと同様の内部アドレス修正が必要になります。ただし、この場合はロードされたプログラム自体が修正を行う必要があります。これは自己再配置ドライバの状況に似ていますが、プログラムは既にオペレーティングシステムのローダーによってターゲットの場所にロードされています。
DOS では、慣例として、実際のファイルの種類を反映しないファイル拡張子を持つファイルがあります。[ nb 4 ]例えば、COUNTRY.SYS [ 31 ]は DOS デバイス ドライバではなく、[ nb 5 ] CONFIG.SYS COUNTRY ディレクティブとNLSFUNCドライバで使用するバイナリNLSデータベース ファイルです。[ 31 ]同様に、PC DOSおよびDR-DOSシステム ファイルIBMBIO.COMおよびIBMDOS.COM は、ブートストラップ ローダーによってロードされる特別なバイナリ イメージであり、COM スタイルのプログラムではありません。[ nb 5 ] DEVICE ステートメントを使用して COUNTRY.SYS をロードしようとしたり、コマンド プロンプトで IBMBIO.COM または IBMDOS.COM を実行したりすると、予期しない結果が生じます。[ nb 4 ] [ nb 6 ]
上記と同様の手法を用いることで、これを回避できる場合もあります。例えば、DR-DOS 7.02以降では、Matthias R. Paulによって開発された安全機能が組み込まれています。[ 32 ]これらのファイルが不適切に呼び出された場合、埋め込まれた小さなスタブがファイルのバージョン情報を表示して正常に終了します。[ 33 ] [ 32 ] [ 34 ] [ 31 ]さらに、メッセージは、外部のNetWare & DR-DOS VERSIONファイル識別ユーティリティによって認識される特定の「マジック」パターンに従うように特別に作成されています。[ 31 ] [ 32 ] [ nb 7 ]
同様の保護機能として、Jay Sage と Joe Wright のZ-Systemタイプ 3 およびタイプ 4 の "Z3ENV" プログラム[ 35 ] [ 36 ]および "Z3TXT" 言語オーバーレイ ファイル[ 37 ]の冒頭に 8080 命令C7h ("RST 0" ) があり、不適切にロードされた場合、CP/M-80 ではクラッシュではなくウォームブートとなる[ 35 ] [ 36 ] [ 37 ] [ nb 2 ]があった。
非常に似たような方法で、多くの(バイナリ)ファイル形式は慣例としてファイルの先頭付近に1Ahバイト(ASCII ^Z )を含んでいます。この制御文字は、ファイルが非バイナリモードで開かれたときに「ソフト」ファイル終了(EOF)マーカーとして解釈されるため、多くのオペレーティングシステム(PDP-6モニタ[ 38 ]、RT-11、VMS、TOPS-10 [ 39 ]、CP/M [ 40 ] [ 41 ]、DOS [ 42 ] 、 Windows [ 43 ]など)では、コンソールでファイルが誤って出力されたときに「バイナリのゴミ」が表示されるのを防ぎます。

FatELF [ 44 ]は、 Linuxやその他のUnix ライクなオペレーティングシステム向けのファットバイナリ実装でした。技術的には、FatELF バイナリは、どのアーキテクチャでどのバイナリを使用するかを示すメタデータを含むELFバイナリの連結でした。 [ 45 ] CPU アーキテクチャの抽象化 (バイト順序、ワードサイズ、CPU命令セットなど) に加えて、複数のカーネルABIとバージョンをサポートするバイナリの利点があります。
開発者によると、FatELFにはいくつかのユースケースがある。[ 44 ]
概念実証用のUbuntu 9.04イメージが利用可能です。[ 47 ] 2021年現在FatELFはLinuxカーネルのメインラインには統合されていません。[ 48 ] [ 49 ]
Windowsで使用されるポータブル実行可能ファイル形式ではプラットフォームへのコード割り当てはできませんが、アーキテクチャに基づいてディスパッチするローダープログラムを作成することは可能です。これは、ARM上のWindowsデスクトップ版が32ビットx86エミュレーションをサポートしているため、有用な「ユニバーサル」マシンコードターゲットとなるからです。Fatpackは、この概念を示すローダーです。リソースセクションにパックされた実行可能ファイルを1つずつ実行しようとする32ビットx86プログラムが含まれています。[ 50 ]
Windows 11 ARM64 の開発時に、Microsoft はArm64X と呼ばれるPortable Executableフォーマットを拡張する新しい方法を導入しました。 [ 51 ] Arm64X バイナリには、個別の x64/Arm64EC バイナリと Arm64 バイナリに含まれるすべてのコンテンツが含まれていますが、ディスク上でより効率的な 1 つのファイルに統合されています。Visual C++ ツールセットは、このようなバイナリの生成をサポートするようにアップグレードされています。また、Arm64X バイナリのビルドが技術的に難しい場合は、開発者は代わりに Arm64X ピュアフォワーダー DLL をビルドできます。[ 52 ]
以下の方法は、同じ目的の複数のバージョンのマシンコードが同じファイル内に提供されるという点で、ファットバイナリに似ています。
2007 年以降、異種プラットフォーム向けの特殊なコンパイラの中には、複数の種類のプロセッサ上で並列実行するためのコード ファイルを生成するものがあります。例えば、 Intel EXOCHI (Exoskeleton Sequencer) 開発スイートのCHI ( C for Heterogeneous Integration) コンパイラは、マルチスレッド用のOpenMPプラグマの概念を拡張し、異なる命令セット アーキテクチャ(ISA)用のコード セクションを含むファット バイナリを生成します。これにより、ランタイムローダは、異種システム環境で利用可能な複数の CPU コアとGPUコア上で並列実行を動的に開始できます。 [ 53 ] [ 54 ]
2006 年に導入されたNvidiaの並列コンピューティング プラットフォームCUDA (Compute Unified Device Architecture) は、GPU 上での汎用コンピューティング ( GPGPU ) を可能にするソフトウェアです。そのLLVMベースのコンパイラNVCC は、いわゆるPTX仮想アセンブリ(テキストとして) を含むELFベースのファット バイナリを作成できます。CUDAランタイム ドライバは、これを後で、実際に存在するターゲット GPU 用のSASS (Streaming Assembler ) バイナリ実行可能コードにジャストインタイムでコンパイルできます。実行可能ファイルには、CUDA ランタイムがロード時に選択できる、1 つ以上の特定の GPU アーキテクチャ専用の実行可能コード セクションを含む、いわゆるCUDA バイナリ(別名cubinファイル) も含まれる場合があります。 [ 55 ] [ 56 ] [ 57 ] [ 58 ] [ 59 ] [ 60 ]ファット バイナリは、2007 年に導入された GPUシミュレータであるGPGPU-Simでもサポートされています。[ 61 ] [ 62 ]
Multi2Sim (M2S) は、OpenCL の異種システムシミュレータフレームワークであり (当初はMIPSまたは x86 CPUのみに対応していましたが、後にARM CPU や、AMD / ATI EvergreenおよびSouthern Islands 、 Nvidia FermiおよびKeplerファミリーなどの GPU もサポートするように拡張されました) [ 63 ]、ELF ベースのファットバイナリもサポートしています。[ 64 ] [ 63 ]
GNU Compiler Collection (GCC) と LLVM にはファットバイナリ形式はありませんが、リンク時最適化(LTO)用のファットオブジェクトファイルがあります。LTO ではコンパイルをリンク時まで遅らせるため、オブジェクトファイルには中間表現(IR)を格納する必要がありますが、一方で (速度や互換性のために) マシンコードも格納する必要がある場合があります。IR とマシンコードの両方を含む LTO オブジェクトはファットオブジェクトとして知られています。[ 65 ]
同じ命令セットアーキテクチャを対象とするプログラムやライブラリであっても、プログラマは古いCPUとの互換性を維持しながら、より新しい命令セット拡張機能を利用したい場合があります。これは、関数マルチバージョニング(FMV)によって実現できます。同じ関数のバージョンがプログラムに書き込まれ、コードの一部がCPUの機能(CPUIDなどを介して)を検出して、どのバージョンを使用するかを決定します。Intel C++ Compiler、GCC、およびLLVMはすべて、マルチバージョン関数を自動的に生成する機能を備えています。[ 66 ]これは、意味的な影響のない動的ディスパッチの一種です。
多くの数学ライブラリには、CPU の機能に応じて自動的に選択される手書きのアセンブリルーチンが備わっている。例としては、glibc、Intel MKL、OpenBLASなどがある。さらに、glibc のライブラリローダーは、特定の CPU 機能のために代替パスからのロードをサポートしている。[ 67 ]
同様の、しかしバイトレベルの粒度を持つアプローチは、元々は Matthias R. Paul と Axel C. Frinke によって考案されたもので、実行可能ファイルに埋め込まれた小さな自己破棄、緩和、再配置ローダーと、任意の数の代替バイナリ コード スニペットによって、ロード時に特定のターゲット環境で特定の機能を実行する(または実行しない)ために必要なプログラムまたはドライバのサイズまたは速度が最適化されたランタイム イメージを条件付きで構築するというものです。これは、ある種の動的デッド コード除去(DDCE)によって実現されます。 [ 68 ] [ 69 ] [ 70 ] [ 71 ]
COUNTRY.SYSCOUNTRY.SYS{{cite newsgroup}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)(注:DOS COMプログラムの呼び出し規約に関する詳細情報が含まれています。)[…] DOS 保護機能 […] このアイデアは、Simeon Cran の MYZ80 エミュレータのユーティリティに基づいています。それらの DOS 保護ヘッダーは、
Z80レジスタを変更しないことでさらに優れています。魔法のシーケンスは EB 52 EB: […] XCHG […] MOV D,D […] XCHG […] ですが、これは DOS コードがプログラムの開始からかなり離れた場所になることを意味します。 […] 自己解凍
PMArc
アーカイブを使用すると、さらに楽しめます
。 `[…] defb 0EBh, 018h, '-pms-' […]` で開始すると、PMAユーティリティによって有効なアーカイブとして扱われ、
8086
プロセッサを011Ahに、Z80プロセッサを0130hに割り当てます。[…]
.COM ファイル
を作成すると[…] 'JMP SHORT 3' が表示され、その後に 3 バイトのガベージ バイトが続きます。 […]
Z80 の
逆アセンブリを見ると
[…] 'EX DE,HL; INC BC;' に変換されます […] 3 バイト目は 'JUMP' で、その後に yy xx として指定された 16 ビット アドレスが続きます […]
MS-DOS
および […]
CP/M
[…]で実行される .COM ファイルが作成されます
(注:著者はZ80について述べていますが、この手順は8080および互換プロセッサでも動作します。)
れ
まし
た
。
[
…] MSODBALL 2.05 -
Amstrad
706k フォーマットと DOS 706k フォーマットの間でフロッピーディスクを変換します。 […] 両方のプログラムは CP/M-80 と DOS で動作します。 […]
CP/M
バージョンのソースが含まれています。 […] DSKWRITE.ASM には
DOS
バージョンのソースが含まれています。 […] 単一の
.COM ファイル
を取得するには
、FBMAKE を使用する必要があります。 […]
(注:FATBNSEA.COMパッケージに含まれるFBMAKEについて言及しています。)
[…]
自己解凍アーカイブ
は、多数の小さなファイルを含む
.COM ファイル
です。これを実行すると、小さなファイルが作成されます […] 自己解凍アーカイブ プログラムは、
DOS
(2 以降) または
CP/M
で実行され、効果は同じです。Unix でこれらを解凍するには、
ZXCC
を使用できます […] FATBNSEA.COM […] FATBIN は、CP/M-80 .COM ファイルと DOS .COM ファイルを組み合わせて、両方のシステムで動作する 1 つのファイルを作成します。 […] M3C4SEA.COM […] M3CONV バージョン 4 -
Spectrum
スナップショットを .Z80 または .SNA フォーマットから
Multiface 3
フォーマットに変換します (Multiface 3 ->
Z80
は PC でのみ対応)。 […] PMSFX21X.COM […]
PMSFX
は、これらの自己解凍アーカイブを生成するために使用されたプログラムです。このバージョン (2.11) では、CP/M または DOS で自己解凍するアーカイブを生成できます。PMSFX を使用するには
PMARC が必要です。新機能: DOS では、正確なファイルサイズをサポートします。 […] SP2BMSEA.COM […] Stop Press Canvas ファイルを
Windows
.BMPに変換します
[…]
[…]
DOS
および
CP/M
で解凍可能な
.COM ファイル
を生成する
PMSFX
のバージョンを作成しました(最初の 3 バイトは、有効な
Z80
コード、有効な
8086
コード、および有効な
PMAヘッダーです) […]
自己解凍アーカイブ
として
. […]
[…] このような違いを疑う理由は、バージョン 3.2x も
CP/M-86
をサポートしていたためです(
オーバーレイは
DOS
と CP/M-86で同一であり
、メインの実行ファイルのみが異なります) […]
.OVR
ファイルは DOS と CP/M-86 で 100% 同一であり、実行時にフラグ (
WordStar 3.20
マニュアルに明確に示されています) で切り替えられます […] WordStar の OS インターフェースは非常に狭く、よく抽象化されています […] WordStar 3.2x のオーバーレイは、DOS バージョンと CP/M-86 バージョンで 100% 同一です。実行時に、INT 21h (DOS) と INT E0h (CP/M-86) のどちらを呼び出すかを選択するスイッチがあります。WS.COM は DOS と CP/M-86 で同じではありませんが、おそらく大きな違いもないでしょう。[…]
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)[…] FreeKEYB は […] .COM と .SYS ドライバ (小型モデル) が一体化したものです。最初の JMP を安全に上書きできます。これが私が「トリッキーなヘッダー」と言った意味の一部です。 […] FFFFh:FFFFh を 3 バイトのジャンプと保留中の DB FFh に置き換えることができます。MS-DOS、PC
DOS、DR-DOS、そしておそらく他の DOS の問題でも動作します。 […]
[…] ドライバに SYS デバイス ドライバ ヘッダーを追加して、CTMOUSE が通常の
TSR
とデバイス ドライバの両方を 1 つに持つことができるようにします。これは、当社の FreeKEYB 高度なキーボード ドライバと同様です。 […] これは、 DR
DOS 3.41以降では
INSTALL
= がサポートされており、DR DOS が
[
D
]
CONFIG.SYS
ディレクティブの順序を保持する
ため、
DR DOSでは実際には必要ありません […] しかし、これは […]
MS-DOS
/
PC DOS
システムでの […] 柔軟性を向上させます。これらのシステムでは […]
ファイル内の順序に関係なく、
常に
DEVICE
= ディレクティブが INSTALL= ステートメントの前に実行されます。 […] ソフトウェアによっては、マウス ドライバがデバイス ドライバとして存在する必要がある場合があります。昔からマウス ドライバは常にデバイス ドライバでした。これらのマウス ドライバは、使用するプロトコルに応じて特定のデバイス ドライバ名を持っていました (たとえば、
マウス システム モードの場合は「
PC$MOUSE
」
)。一部のソフトウェアは、使用する正しいタイプのマウスを見つけるために、これらのドライバを検索する場合があります。 […] もう 1 つの利点は、デバイス ドライバは通常、メモリ消費量が少ないことです (
環境も
PSP
もありません
)。 […] 基本的には、複雑なファイル ヘッダー、コマンドラインを解析するための異なるコード、異なるエントリ ポイントと終了行、および ORG 0 / ORG 100h の違いを克服するためのセグメント マジックです。デバイス ドライバの
自己ロード ハイイングは、
ドライバ ヘッダーをそのままにして、ドライバの残りの部分だけを再配置する必要があるため、少し複雑です […]
カルデラの OpenDOS 7.01 をアップデートして、
IBMBIO.COM
のスタートコードを修正してください - 正常なプログラムを開始してください - 完全なコマンドを実行してください。バージョン Einzug halten wird の機能をすべて使用すると、次の操作が可能になります。
(注:NWDOSTIP.TXTは、Novell DOS 7およびOpenDOS 7.01に関する包括的な資料であり、多くの未公開機能や内部構造の説明が含まれています。これは、著者が
MPDOSTIP.ZIP2001年まで維持管理し、当時多くのサイトで配布していた、さらに大規模な資料集の一部です。提供されているリンクは、HTMLに変換された古いバージョンのファイルへのリンクですNWDOSTIP.TXT。)[…] オペコード「RST 0」があり、これを実行すると
ウォームブートになります。
Z3TXT
モジュールを含むファイルは
決して実行されるべきではありませんが、1 バイトのコストで、その例外的な可能性から身を守ることができます。 ヘッダーには、文字列「Z3TXT」に続いてヌル (0) バイトも含まれていました。 多くの
Z-System
モジュールには、このような識別子が含まれています。このカテゴリには、常駐コマンドパッケージ (RCP)、フローコマンドパッケージ (FCP)、および環境記述子モジュール (
Z3ENV
) が含まれます。Bridger Mitchell 氏の […] JETLDR.COM など、これらのモジュールをファイルからメモリにロードするプログラムは、ID 文字列を使用してファイルを検証できます。つまり、ユーザーが指定した種類のモジュールであることを確認できます。これにより、ユーザーのミスや破損したファイルを検出できます。 […] ヘッダーは次のようになります。 […] rst […] db 'Z3TXT',0
; ヌル終端 ID […]
; 12345678
; 8 文字である必要があります […] db 'PROGNAME'
; スペースで埋める […]
; 123
; 3 文字である必要があります […] db 'ENG'
; 言語名 […] dw LENGTH
; モジュールの長さ […]
ASCII
ファイルの終端は、
コントロールZ文字(1AH)または
CP/Mの
読み取り操作によって返される実際のファイル終端
によって示されます
。ただし、マシンコードファイル(
COMファイル
など)に埋め込まれたコントロールZ文字は無視され、CP/Mによって返されるファイル終端条件を使用して読み取り操作が終了します。[…]
(56ページ)
[…] CP/M は、ASCIIファイルの最後のデータ文字の後にCONTROL-Z文字を挿入することで、ファイルの終わりを示します。ファイルの内容が 128 文字の正確な倍数である場合、CONTROL-Z を追加すると 127 文字が無駄になるため、CP/M はそうしません。CONTROL-Z 文字をファイルの終わりマーカーとして使用できるのは、ASCII ファイルでは CONTROL-Z がデータとして使用されることがほとんどないためです。ただし、非 ASCII ファイルでは、CONTROL-Z は他の文字と同じように出現する可能性があります。したがって、ファイルの終わりマーカーとして使用することはできません。CP/M は、非 ASCII ファイルの終わりを示すために別の方法を使用します。CP/M は、ファイルに割り当てられた最後のレコード (ディスク領域の基本単位) を読み取ったときに、ファイルの終わりに達したとみなします。各ファイルのディスク ディレクトリ エントリには、そのファイルに割り当てられたディスク レコードのリストが含まれています。この方法は、ファイルの末尾を特定するために、ファイルの内容ではなく、ファイルのサイズに依存している。[…]
[…] FreeKEYB は、初期化時に、ロードされるマシンの種類、キーボードの種類、レイアウト、国、コード ページ、インストールされているマウスとビデオ アダプタの種類、そのシステムにロードされている他のドライバ、オペレーティングシステム、使用されているロードおよび再配置方法、含まれている個々の機能、コマンドラインで指定されている構成オプションに応じて、ドライバのランタイム イメージを構築します。サポートされているコマンドライン スイッチとオプションの数が多いため […] (約 50 個のスイッチ […] に複数の設定が可能)、無数の依存関係を持つ機能の組み合わせが多数存在し […] 結果として […] 無限の数の […] 異なるターゲット イメージが存在します。 FreeKEYB の動的デッドコード除去技術は、これらの依存関係を解決し、デッドコードとデータを削除します。これは、従来の TSR プログラミングのように、限られた数のモジュールやサブルーチン全体を含めるか除外するか、ディスパッチ テーブルを修正するといったことに限定されません。バイト レベルで動作し、より大きなルーチンの途中にある個々の命令を削除できます。特定のケースを処理したり、特定の機能をサポートしたりするために、コード全体に分散されています。特別なツールを使用してコードを分析し、修正テーブルを作成します。条件定義を使用して、さまざまなケースを宣言します。アセンブリ時だけでなく初期化時にもオプションです。ランタイム イメージに少なくともある程度のデッドコードが残るというオーバーヘッドなしに、これらの条件間のすべての依存関係を追跡し、ランタイム イメージを動的に構築および再配置し、これらの小さく、変化し、移動するバイナリ パーツ間のすべての参照を修正します。小さな .COM/.SYS スタイルのモデルを引き続き使用できます。初期化時に実行されます。
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)[…] 独自の機能 […] を
動的デッドコード削除
と呼んでいます。インストール時に […] ドライバのどのコンポーネントが必要で、どれが不要かを指定できます。これは、私がこれまで DOS で見たことのない、動的にロード可能なモジュール化と遅延リンクの範囲にまで達しています。スクリーンセーバ、マクロ、電卓、マウスサポート、または <ほぼその他すべて> が気に入らない場合は、コマンドラインで指定できます。FreeKEYB は、ルーチン間のすべての依存関係を考慮しながら、その機能を扱い、要求された機能を提供するのに必要のないすべてのコード断片を完全に削除してから、ドライバがイメージをターゲットの場所に移動して常駐します。 […]
[…] brandneue[s] 機能、
デッドコード排除機能
、宝石ではなく最高のインストールと再構築、したがって、コードの日付を変更する必要があります (zB wenn jemand ein) Bestimmtes FreeKEYB-Feature nicht benötigt)。 […]
{{cite newsgroup}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)