96374


## 前提

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]


CC BY-SA 4.0
2023-09-28T12:55:16.543
96372
2023-10-26T10:05:26.330
2023-10-26T10:05:26.330
3060
9008
question
c macos build
libSystem.B.dylib と libSystem.dylib と crt0.o との関係は？ libSystem.B.dylibが見当たらないのに実行できるのはなぜ？


`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.


CC BY-SA 4.0
2023-09-29T01:52:08.253
96374
2023-09-29T06:29:58.773
2023-09-29T06:29:58.773
3475
3475
96372
answer


（主題回答は int32_tさん回答を参照ください。）

> libSystem.B.dylib の "B" とはなんでしょう？

バージョン番号情報の一種と考えられます。macOS（やLinux）での共有ライブラリバージョン管理は、下記ルール運用となっているケースが多いです。

  * ファイル名にバージョン情報を含む実体ファイル（`libSystem.B.dylib`）
  * バージョン情報を含まないリンク（`libSystem.dylib`→`libSystem.B.dylib`）

* * *

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

実行時の動的リンクとコンパイル時の静的リンクとの差異に起因します。

  * `otool -L`コマンドは、動的リンクに必要な依存先情報(`libSystem.B.dylib`)を表示します。
  * `cc -static`が内部的に呼び出す`ld`コマンドは、静的リンクに必要な依存先情報(`crt0.o`)を表示します。

* * *

> 動的ライブラリがあれば、その動的ライブラリを同梱するような感覚でコンパイルしてくれると思っていた

動的ライブラリと静的ライブラリは別物と考えた方が良いです。動的ライブラリは実行時に依存性解決をする仕組みですから、コンパイラが気を利かせて「静的ライブラリを同梱」することは出来ません。


CC BY-SA 4.0
2023-10-03T02:57:58.393
96408
2023-10-03T02:57:58.393
49
96372
answer