libSystem.B.dylib と libSystem.dylib と crt0.o との関係は？ libSystem.B.dylibが見当たらないのに実行できるのはなぜ？


## 前提

C言語はあまり詳しくないので、用語の使い方があっているか多少不安ですし、何か勘違いがあるかもしれません。

Macには `ldd` がないようですので、 `otool -L` を使用しています。

参考：  
[Mac版lddコマンドは otool
-L](https://qiita.com/doranekohc/items/243d5c50960c129ebe44)

## 試したこと

素朴に下記のC言語のファイルを作りました

[code]

    #include <stdio.h>
    
    int main()
    {
      printf("Hello World\n");
      return 0;
    }
    
[/code]

コンパイル

[code]

    $ cc hoge.c
    
[/code]

依存関係を見る

[code]

    $ otool -L a.out
    a.out:
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.100.3)
    
[/code]

動的ライブラリの `/usr/lib/libSystem.B.dylib` に依存しているようです。

`-static` をつければこの動的ライブラリを含んだ状態でコンパイルできると考え下記のコマンドとしました。

[code]

    $ cc -static hoge.c 
    ld: library not found for -lcrt0.o
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
[/code]

上記の通りエラーとなりました。

<https://stackoverflow.com/a/3801032/1979953>  
によるとどうやら、`libSystem.dylib` もしくは `crt0.o`
がMacで、提供されてないので、もう無理です（あきらめましょう）というような雰囲気のようなのです。

## 質問

「`libSystem.dylib` もしくは `crt0.o`」は `otool -L` で表示された `libSystem.B.dylib`
のことを指しているのでしょうか？ だとすると、`libSystem.B.dylib` の "B" とはなんでしょう？

そもそも依存しているのは、`libSystem.B.dylib` と`otool -L`は教えてくれたのに、なんでエラーは `crt0.o`
がないというエラーになるのでしょうか？

また、勝手な推測で、動的ライブラリがあれば、その動的ライブラリを同梱するような感覚でコンパイルしてくれると思っていたので、エラーになったこと自体が驚きでした。エラーのとおり、動的ライブラリとは別の何かがないと
`-static`
は機能しないものなのでしょうか？（追記に書いた通り、なぜかか`libSystem.B.dylib`が見当たりませんが、実行自体はできている...）

なお、リンクやコンパイルの過程を学ぶために質問をしているので、このエラー自体を解決しようとは思っていません（どうやら前述の通り無理なようなので）。

## 追記

よくよくみてみると

[code]

    $ ls /usr/lib/ | grep libSystem        
    表示結果なし
    
[/code]

`/usr/lib/libSystem.B.dylib` はなさそうでした。

なお、実行自体はできています。

[code]

    $ ./a.out 
    Hello World
    
[/code]

(実行できていたので、あまり確認しないで、てっきり `libSystem.B.dylib` はあるものだと思ってたのですが、よくよく見てみたらなさそうです）

## さらに追記

たまたま GCCもbrewで入れていたので試しましたが、同様のエラーでした（上記まではエラーメッセージに clang と出ている通り clangを使用）。  
（まあ根本的に必要なものがないで、同様のエラーになるとは思っていましたが）

[code]

    $ gcc-13 -static hoge.c 
    ld: library not found for -lcrt0.o
    collect2: error: ld returned 1 exit status
    
[/code]




`otool -L` で表示した動的リンクの依存関係と、スタティックリンクしようとしたときに出たライブラリ不足のエラーは何も関係ありません。

コンパイラは `-static` の有無でデフォルトでリンクするライブラリを切り替えることができます。無しのときは `libSystem`、有りのときは
`crt0.o` なのでしょう。

  * 静的リンクするためには静的リンク用のライブラリが必要です。macOS 標準のシステムライブラリは静的リンク用が提供されていないようです。`-static` は諦めましょう。

  * `/usr/lib/libSystem.B.dylib` は macOS 11.0.1 以降はファイルとしては存在せず、動的リンカがそのパスではないどこかからライブラリを読み込んで実行時リンクするようです。

<https://developer.apple.com/documentation/macos-release-notes/macos-big-
sur-11_0_1-release-notes#Kernel>

> the system ships with a built-in dynamic linker cache of all system-provided
> libraries. As part of this change, copies of dynamic libraries are no longer
> present on the filesystem.




`otool -L` で表示した動的リンクの依存関係と、スタティックリンクしようとしたときに出たライブラリ不足のエラーは何も関係ありません。

コンパイラは `-static` の有無でデフォルトでリンクするライブラリを切り替えることができます。無しのときは `libSystem`、有りのときは
`crt0.o` なのでしょう。

  * 静的リンクするためには静的リンク用のライブラリが必要です。macOS 標準のシステムライブラリは静的リンク用が提供されていないようです。`-static` は諦めましょう。

  * `/usr/lib/libSystem.B.dylib` は macOS 11.0.1 以降はファイルとしては存在せず、動的リンカがそのパスではないどこかからライブラリを読み込んで実行時リンクするようです。

<https://developer.apple.com/documentation/macos-release-notes/macos-big-
sur-11_0_1-release-notes#Kernel>

> the system ships with a built-in dynamic linker cache of all system-provided
> libraries. As part of this change, copies of dynamic libraries are no longer
> present on the filesystem.

