96462


[実行可能ファイルフォーマットの比較 -
Wikipedia](https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AE%E6%AF%94%E8%BC%83)
に `Mach-O`というのが掲載されていました。どうやら、Macでの実行可能ファイルの形式のようです。参考：[Mach-O -
Wikipedia](https://ja.wikipedia.org/wiki/Mach-O)

私は下記のように認識していたので

  * 実行可能ファイルとオブジェクトファイル（マシンコードが記載されている）は別ものもである
  * オブジェクトファイルが最終的に実行できる状態になったものが、実行可能ファイルである

オブジェクトファイルの形式は何になっているのかと思い調べてみました。

C言語の場合

[code]

    $ gcc -c hoge.c
    $ file hoge.o  
    hoge.o: Mach-O 64-bit object x86_64
    
[/code]

Swiftの場合

[code]

    $ swiftc -c foo.swift -o foo.o
    $ file foo.o                              
    foo.o: Mach-O 64-bit object x86_64
    
[/code]

どうやら、`Math-O` のようです。

実行可能ファイルの形式については、検索すると出てくるのですが、オブジェクトファイル（マシンコード）の形式については、うまく検索に出てきません。実行可能ファイルの形式と同じになると考えてよいのでしょうか。  
リンカが認識できるような別の形式なのかも（？）とも思ったのですが...

[Mach-O - Wikipedia](https://ja.wikipedia.org/wiki/Mach-O)

>
> Mach-O（まーく・おー）はコンパイラが生成するオブジェクトファイルおよび実行ファイルのファイルフォーマットである。NEXTSTEPに由来し、macOSで標準のバイナリファイルフォーマットとして採用されている。
>
> 複数アーキテクチャのバイナリを保持する事が可能である。（ファットバイナリ）

とあるので、どうやらMach-Oに関しては、オブジェクトファイルと実行可能で同一のようですが、一般的に他の形式でも同じなのか気になります。


CC BY-SA 4.0
2023-10-10T10:50:50.063
96461
2023-10-11T06:53:52.123
2023-10-10T10:56:52.973
9008
9008
question
swift c macos
実行可能ファイルのフォーマット（形式）とオブジェクトファイルのフォーマットは同じになるものなのでしょうか？


まあだいたい ELF 形式でも Mach-O
形式でも、いわゆるオブジェクトファイルや実行形式ファイルってのは大きく一つの仕様書で定義されていたりします。その意味で「同一フォーマットのバリエーション違い」と認識してそんなに間違ってないと思います。

その仕様の中には単なる再配置可能フラグとか、実行可能フラグとか共有ライブラリフラグとかがあって区別できるようになっています。最初の１つはリンクしないと実行はできませんし、後者２つはどちらも実行可能形式であり仮想記憶空間にロード可能には違いないのですが、前者は開始可能、後者は単独での実行開始は不可能とかそういう違いがあります。

  * Mach-O なら `MH_EXECUTE` とか `MH_DYLIB` とか。
  * ELF なら `ET_EXEC` とか `ET_REL` とか。

Mach-O の
[loader.h](https://opensource.apple.com/source/xnu/xnu-344/EXTERNAL_HEADERS/mach-o/loader.h.auto.html)
とか公開されてるの見つけた。

Windows 系だとオブジェクトファイルは COFF フォーマット、実行ファイルは PE32 フォーマットとか PE32+
フォーマットとか呼ばれているので、フォーマット名としては違うといっていいかも。実行可能フラグとかその辺があるのは同じ。

[cygwin](/questions/tagged/cygwin "'cygwin' のタグが付いた質問を表示") の `file`
コマンドで今開発中のプロジェクトの一部を読んでみるテスト

[code]

    $ file hoge.abs hoge.obj piyo.o piyo.exe
    hoge.abs: ELF 32-bit MSB executable, ***** family, version 1 (SYSV), statically linked, with debug_info, not stripped
    hoge.obj: ELF 32-bit MSB relocatable, ***** family, version 1 (SYSV), with debug_info, not stripped
    piyo.o:   Intel amd64 COFF object file, no line number info, not stripped, 7 sections, symbol offset=0x704, 28 symbols, 1st section name ".text"
    piyo.exe: PE32+ executable (console) x86-64, for MS Windows, 18 sections
    $ 
    
[/code]

MS-DOS の時代だと完全配置済みバイナリに拡張子 `.COM` をつけると、その辺の識別情報一切なしにロード＆実行できるという仕様があったりします
([Wikipedia / COM
ファイル](https://ja.wikipedia.org/wiki/COM%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB))
。テキストエディタで文字を打って保存することで、終了するだけのプログラムとか書いたことあります。まあ今どきはそういうのは無いっスね。


CC BY-SA 4.0
2023-10-10T12:52:16.070
96462
2023-10-11T06:53:52.123
2023-10-11T06:53:52.123
8589
8589
96461
answer