チャレンジ一覧 / linux-filesystem-top-level

Day 7: /lib

ディレクトリの概要

/libはシステムが動作するために必要な共有ライブラリを保存するディレクトリ。Linuxでは多くのコマンドが「小さい実行ファイル+共有ライブラリ」で構成されている。

主に/bin/sbinのプログラムが実行時に読み込む基本ライブラリが置かれている。

中身を見ていく

la -1(一部抜粋)
ld-linux-x86-64.so.2
libc.so.6
libm.so.6
libpthread.so.0
libdl.so.2
modules

プログラム実行時に必要なライブラリを読み込む動的リンカー(linker)

Linuxの多くのプログラムが使用する基本ライブラリ

ファイル操作やメモリ管理などを提供する

数学関数(sin, cos, sqrtなど)を提供するライブラリ

マルチスレッド処理を行うためのライブラリ

カーネルモジュールが入るディレクトリ

リンクとは

プログラムは複数の部品から作られている。それらの部品を1つの実行ファイルにまとめる作業をリンク(link)と呼ぶ。

必要なライブラリを全部プログラムに埋め込む方式。

イメージ:

[プログラム] ├ ライブラリ ├ ライブラリ └ ライブラリ

特徴内容
ファイルサイズ大きい
実行単体で動く
更新再コンパイル必要

静的リンクの場合、lddをするとnot a dynamic executable(これは動的リンクされた実行ファイルではありません)とでる。

%ldd /usr/bin/busybox
	not a dynamic executable

※lddは指定したプログラムが使う共有ライブラリを表示するコマンド

必要なライブラリを実行時に読み込む方式。

プログラム+外部ライブラリで動く

Linuxでは多くのプログラムが動的リンクで動作する。

メリット

特徴内容
ファイルサイズ小さい
実行ライブラリが必要
更新ライブラリ更新だけでOK

動的リンカー(dynamic linker)

プログラムを実行するときに必要な共有ライブラリを読み込んで結びつけるプログラム。プログラム実行時にライブラリ依存関係を解決する。(動的リンカーで必要なライブラリを探すイメージ)

Linuxでは代表的にld-linux-x86-64.so.2がこれに当たる。