Shared Library/Comiler/Link/Loaderロール


コンパイラが実行するタスク(gcc)

  • Cプリプロセッサ(cpp)は、helloを行うために、define、include構文などを前処理する.i作成
  • cpp hello.c > hello.i
  • Cコンパイラ(cc 1)前処理のhello.iソースをコンポーネントhelloにコンパイルします.s作成
  • gcc -S hello.i
  • アセンブリ(as)はhelloです.アセンブリs生成object(hello.o)
  • as -o hello.o hello.s
  • リンク(collect 2)printfなどの外部ライブラリのシンボルをリンクすることによって最終プログラム(a.out)
  • を作成する.

    共有ライブラリ


    static library -> .a
    dynamic library -> .so
    $ file a.out
    
    a.out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.18, not stripped

    Dynamic Loader


    共有ライブラリに関連付けられたプログラムを実行すると、内部で動的Loaderというプログラムが実行されます
    1.動的リンクの共有ライブラリを見つけてメモリにロードする
    2.entry function(C言語のmain関数)を検索して呼び出す
    3.プログラムの実行

    runtime environment


    プログラム実行時にmain関数を呼び出し、複数の操作を実行します.C runtime envを探します.
    https://en.wikipedia.org/wiki/Runtime_system
    https://en.wikipedia.org/wiki/Crt0

    References


    https://www.lesstif.com/software-architect/shared-library-linker-loader-12943542.html