標準Cライブラリ

標準Cライブラリ

はじめに

この記事は下記の参考資料を元にした筆者の解釈の記述です。

正確さについては保証されませんので詳しくは参考元をご参照ください。

標準Cライブラリとは

C言語にはISO(国際標準化機構)によって定められた標準ライブラリがある。

Linuxでも標準Cライブラリが提供されている。

つまり標準Cライブラリは通常OSによって用意されるものである。

GNUが提供するglibcと呼ばれる標準Cライブラリが使用されることが多い。

ほとんどのCプログラムはglibcをリンクしている。

glibcシステムコールをラップする関数を含んでおり、POSIXに定義される関数も用意している。

リンクとは

C言語で書かれたプログラムを実行するためにはソースコードコンパイルアセンブリ言語にした後アセンブラと呼ばれるソフトウェアによってマシン語に変換する。

C言語で書かれたプログラムをソースプログラムと呼びビルドされたマシン語をオブジェクトプログラムと呼ぶ。

マシン語はその後リンク処理をされてから実行される。

リンクとはライブラリで提供されているプログラムを実行対象のプログラムに取り入れることである。

リンクはマシン語の時点で行われることからライブラリで提供されるプログラムもオブジェクトプログラムであることがわかる。

lddコマンド

Linuxではlddコマンドでプログラムがリンクしているライブラリを確認することができる。

$ ldd /bin/ls
        linux-vdso.so.1 =>  (0x00007ffee45c4000)
        libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007f793567b000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007f7935477000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007f793526e000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f7934ea0000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f7934c9c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f793589c000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007f7934a98000)

ライブラリの種類とリンクの方法

リンクのタイミングについては3種類がある。

  • 静的リンク
    • ビルド時
  • 動的リンク
    • 実行時
  • 動的ロード
    • 任意でのライブラリのロード時

ビルド時にリンクされるライブラリに拡張子は.aで動的リンク・動的ロードの拡張子は.so である。

soはShared Objectの略である。

POSIXとは

POSIX(Portable Operating System Interface)とはUNIX系OSに求められるAPIファイルシステムなどの規格をまとめたものである。