FreeBSD初心者運用日記 このページをアンテナに追加

2008-09-18

[]LD_LIBRARY_PATHについて 23:09 LD_LIBRARY_PATHについて - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - LD_LIBRARY_PATHについて - FreeBSD初心者運用日記 LD_LIBRARY_PATHについて - FreeBSD初心者運用日記 のブックマークコメント

一時的に、ライブラリのパスを追加するための環境変数 by LPIC参考書

2008-05-27

[][]アーカイブファイルに含まれてる関数を調べる 07:56 アーカイブファイルに含まれてる関数を調べる - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - アーカイブファイルに含まれてる関数を調べる - FreeBSD初心者運用日記 アーカイブファイルに含まれてる関数を調べる - FreeBSD初心者運用日記 のブックマークコメント

$ nm -g /usr/lib/libc.a | grep -v "U" | grep -v "D" | grep -v "C" | grep -v "W" | grep -v "w" | grep -v "R" | grep -v "B" | grep -v "V"       

2008-05-25

[][]アーカイブファイルに含まれるオブジェクトファイルをリストする方法 00:15 アーカイブファイルに含まれるオブジェクトファイルをリストする方法 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - アーカイブファイルに含まれるオブジェクトファイルをリストする方法 - FreeBSD初心者運用日記 アーカイブファイルに含まれるオブジェクトファイルをリストする方法 - FreeBSD初心者運用日記 のブックマークコメント

$ ar t /usr/lib/libc.a | head
wmemset.o
wmemmove.o
wmemcpy.o
wmemcmp.o
wcsxfrm.o
wcswidth.o
wcstok.o
wcsstr.o
wcsspn.o
wcsrchr.o

2007-11-16

[]メモ 08:07 メモ - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - メモ - FreeBSD初心者運用日記 メモ - FreeBSD初心者運用日記 のブックマークコメント

  • ソース作成
$ cat hoge.c
#include <stdio.h>
#include <math.h>

int main() {
        double rad;
        for(rad=0;
        rad < 3.1;
        rad += 0.1) printf("sin(%f) = %f\n", rad, sin(rad));
        return;
}
$ gcc hoge.c
/var/tmp//cc86EJaS.o(.text+0x4d): In function `main':
: undefined reference to `sin'
  • ライブラリ
/usr/lib$ nm libm.a | grep sin
w_sinhf.o:
         U __ieee754_sinhf
00000000 T sinhf
w_sinh.o:
         U __ieee754_sinh
00000000 T sinh
w_asinf.o:
         U __ieee754_asinf
00000000 T asinf
w_asin.o:
         U __ieee754_asin
00000000 T asin
s_asinhf.o:
00000000 T asinhf
s_asinh.o:
00000000 T asinh
e_sinhf.o:
00000000 T __ieee754_sinhf
e_sinh.o:
00000000 T __ieee754_sinh
         U sin
         U sinf
         U sin
         U sinf
         U sin
e_asinf.o:
00000000 T __ieee754_asinf
e_asin.o:
00000000 T __ieee754_asin
         U sin
s_sin.o:
0000004c T sin
s_sinf.o:
         U __kernel_sinf
00000000 T sinf
         U __kernel_sinf
         U __kernel_sinf
00000000 t sin_pif
         U __kernel_sin
00000000 t sin_pi
k_sinf.o:
00000000 T __kernel_sinf
k_sin.o:
00000000 T __kernel_sin

  • lオプションつけて、再gcc
$ gcc hoge.c -lm

実行

>|sh|

$ ./a.out

sin(0.000000) = 0.000000

sin(0.100000) = 0.099833

sin(0.200000) = 0.198669

sin(0.300000) = 0.295520

sin(0.400000) = 0.389418

sin(0.500000) = 0.479426

sin(0.600000) = 0.564642

sin(0.700000) = 0.644218

sin(0.800000) = 0.717356

sin(0.900000) = 0.783327

sin(1.000000) = 0.841471

sin(1.100000) = 0.891207

sin(1.200000) = 0.932039

sin(1.300000) = 0.963558

sin(1.400000) = 0.985450

sin(1.500000) = 0.997495

sin(1.600000) = 0.999574

sin(1.700000) = 0.991665

sin(1.800000) = 0.973848

sin(1.900000) = 0.946300

sin(2.000000) = 0.909297

sin(2.100000) = 0.863209

sin(2.200000) = 0.808496

sin(2.300000) = 0.745705

sin(2.400000) = 0.675463

sin(2.500000) = 0.598472

sin(2.600000) = 0.515501

sin(2.700000) = 0.427380

sin(2.800000) = 0.334988

sin(2.900000) = 0.239249

||<

2007-05-04

[][]ライブラリの依存関係について 05:20 ライブラリの依存関係について - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - ライブラリの依存関係について - FreeBSD初心者運用日記 ライブラリの依存関係について - FreeBSD初心者運用日記 のブックマークコメント

unixのライブラリについてよくわかっていないので、勉強したことをまとめてみました。

  • 動的ローダについて
    • プログラムを実行したときにそのプログラムが必要とする動的ライブラリを探します。
    • 動的リンカともいうらしい。
    • FreeBSDにおいては/libexec/ld-elf.so.1が該当するようです。
    • 動的ローダは、環境変数LD_LIBRARY_PATHに設定されているライブラリパスを最初に検索します。その後、/lib と /usr/lib から検索します。次に、後述のELFキャッシュに記載しているライブラリパスを検索するようです。そのELFキャッシュにライブラリパスを追加するには/etc/ld-elf.so.conf ファイルを編集すればよいみたいです。(編集してldconfigコマンド実行したらELFキャッシュに反映されるんだっけ。。?)
    • このファイルはFreeBSDのバイナリを実行するのにとてもとても大事なファイルで、間違って消してしまったり移動してしまったりすると、lscpmvなどのコマンドすら実行できなくなる。もし間違って移動してしまった場合は、/rescue/mvつかって元に戻すことができる。

コンパイラやリンカは出力するプログラムにライブラリへの絶対パスを埋めこむことはしません。その代りに、ライブラリ名と適切な動的ローダへの絶対パスを埋めこみます。そして、実行時に、(動的ローダが)適切なライブラリに結びつけるわけです。a.out のプログラム用には /lib/ld.so、 ELF のプログラム用には /lib/ld-linux.so.1 がそれぞれ動的ローダになっています。

http://www.linux.or.jp/JF/JFdocs/archive/ELF-HOWTO.html
  • キャッシュについて
    • ELF キャッシュは /var/run/ld-elf.so.hints
    • a.out キャッシュは /var/run/ld.so.hints
    • /etc/ld-elf.so.confをもとに、ldconfig(8)で更新される。
    • ldconfig -m /hogeとすれば、/hogeがライブラリのパスに追加される。
    • ldconfig -rで、ヒントファイルの中身が表示される。
    • ライブラリのパスが、LD_LIBRARY_PATHで設定。(.profileなどで指定)
    • ToDo: 実際にldconfigためしてみる。
    • ELFELFとかa.outとかってのは実行形式のフォーマット。昔は、a.out使われていたけど、最近はELFが主流らしいとか。FreeBSDも3.?まではa.out形式で実行ファイルもってらすい。
    • 最近は、/etc/ld-elf.so.confに記載するより、/etc/defaults/rc.conf内にあるidconfig_pathsに記述するのが流行り?らしい。
  • ライブラリの種類について
    • 動的ライブラリ
    • 静的ライブラリ(拡張子a?)
    • 共有ライブラリ(拡張子so?)
    • ToDO:動的ライブラリと共有ライブラリの違いがよくわかってないので調べる。
  • ライブラリのいろんな形式について
    • libhoge.soのような形式の名前を、linker nameとよび
    • libhoge.so.3のような形式の名前を、so nameとよび
    • libhoge.so.3.0のような形式の名前を、real nameとよぶ。

  • 参考

・ふりび5系

# find / -name \*libcrypt.so\* 
/usr/lib/libcrypt.so
/lib/libcrypt.so.2
# ls -asl /usr/lib/libcrypt.so
0 lrwxrwxrwx  1 root  wheel  18  3 26 01:59 /usr/lib/libcrypt.so -> /lib/libcrypt.so.2

・ふりび6系

# find / -name \*libcrypt.so\* 
/usr/lib/libcrypt.so
/usr/obj/usr/src/tmp/lib/libcrypt.so.3
/usr/obj/usr/src/tmp/usr/lib/libcrypt.so
/usr/obj/usr/src/lib/libcrypt/libcrypt.so
/usr/obj/usr/src/lib/libcrypt/libcrypt.so.3
/lib/libcrypt.so.2
/lib/libcrypt.so.3
# ls -asl /usr/lib/libcrypt.so
0 lrwxr-xr-x  1 root  wheel  18 May  3 13:36 /usr/lib/libcrypt.so -> /lib/libcrypt.so.3