$B:#2s$,=i$a$F$NEj9F$G$9$,!"$3$3$N%a!<%j%s%0%j%9%H$K$U$5$o$7$/$J$$(B
$BFbMF$G$7$?$i$4;XE&2<$5$$!#(B
$B:#!"$o$?$7$O6&M-%i%$%V%i%j$d
$B$N$G$9$,!"J,$+$i$J$$;v$P$+$j$G:G=i$+$i%D%^%:%$$F$*$j$^$9!#(B
$B
(1) $B6&M-%i%$%V%i%j$,%a%b%j>e$G6&M-$5$l$kMM;R$r3NG'$7$h$&$H$7$?!#(B
$B$D$^$j!":G=i$N%3!<%k$G%a%b%j$K%m!<%I$5$l(B $B$=$N8e>oCs$9$k$5$^$r(B
$B3NG'$7$h$&$H$7$?!#(B
$B$7$+$7!"6&M-%i%$%V%i%j$O$=$NETEYJL$N%"%I%l%9$K%m!<%I$5$l$?!#(B
(2) $B#2$D$N0[$J$k $B>\:Y$rE:IU%U%!%$%k(B(try1.txt, try2.txt) $B$K$^$H$a$^$7$?!#(B $B$b$7$+$7$?$i!"A4A3%H%s%A%s%+%s$J;v$r$7$F$$$k2DG=@-$b$"$j$^$9!#(B
$B$7$+$7!"#2$D$N
$B$I$J$?$+$465<(D:$1$k$H$"$j$,$?$$$H;W$$Ej9F$$$?$7$^$7$?!#(B
$B59$7$/$*4j$$CW$7$^$9!#(BX22:001# cat - & <----- 1つ目のプログラムを起動。(標準入力待ち)
[1] 2260
X22:001# head - & <----- 2つ目のプログラムを起動。(標準入力待ち)
[2] 2261
[1]+ Stopped cat -
X22:001# ps <----- プロセス番号を確認。
PID TTY TIME CMD
2174 pts/0 00:00:00 login
2198 pts/0 00:00:00 su
2199 pts/0 00:00:00 bash
2260 pts/0 00:00:00 cat <----- プロセス番号=2260
2261 pts/0 00:00:00 head <----- プロセス番号=2261
2262 pts/0 00:00:00 ps
[2]+ Stopped head -
X22:001#
X22:001# ------ ここで /proc/プロセス番号/maps を確認。------
X22:001#
X22:001# cat /proc/2260/maps
08048000-0804c000 r-xp 00000000 03:01 146815 /bin/cat
0804c000-0804d000 rw-p 00003000 03:01 146815 /bin/cat
0804d000-0806e000 rw-p 0804d000 00:00 0 [heap]
b7cd5000-b7eb4000 r--p 00000000 03:01 148304 /usr/lib/locale/locale-archive
b7eb4000-b7eb5000 rw-p b7eb4000 00:00 0
b7eb5000-b7fdc000 r-xp 00000000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7fdc000-b7fe1000 r--p 00127000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7fe1000-b7fe3000 rw-p 0012c000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7fe3000-b7fe8000 rw-p b7fe3000 00:00 0
b7fe8000-b7fe9000 r-xp b7fe8000 00:00 0 [vdso]
b7fe9000-b7ffe000 r-xp 00000000 03:01 32613 /lib/ld-2.3.6.so
b7ffe000-b8000000 rw-p 00014000 03:01 32613 /lib/ld-2.3.6.so
bff7a000-bff8f000 rw-p bff7a000 00:00 0 [stack]
X22:001#
X22:001#
X22:001#
X22:001# cat /proc/2261/maps
08048000-0804e000 r-xp 00000000 03:01 130759 /usr/bin/head
0804e000-0804f000 rw-p 00005000 03:01 130759 /usr/bin/head
0804f000-08070000 rw-p 0804f000 00:00 0 [heap]
b7c91000-b7ca9000 r-xp 00000000 03:01 132215 /usr/lib/gconv/libJIS.so
b7ca9000-b7cab000 rw-p 00017000 03:01 132215 /usr/lib/gconv/libJIS.so
b7cab000-b7cae000 r-xp 00000000 03:01 131284 /usr/lib/gconv/EUC-JP.so
b7cae000-b7cb0000 rw-p 00002000 03:01 131284 /usr/lib/gconv/EUC-JP.so
b7cb0000-b7cb6000 r--s 00000000 03:01 132790 /usr/lib/gconv/gconv-modules.cache
b7cb6000-b7cd1000 r--p 00000000 03:01 130866 /usr/share/locale/ja/LC_MESSAGES/coreutils.mo
b7cd1000-b7eb0000 r--p 00000000 03:01 148304 /usr/lib/locale/locale-archive
b7eb0000-b7eb1000 rw-p b7eb0000 00:00 0
b7eb1000-b7fd8000 r-xp 00000000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7fd8000-b7fdd000 r--p 00127000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7fdd000-b7fdf000 rw-p 0012c000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7fdf000-b7fe4000 rw-p b7fdf000 00:00 0
b7fe4000-b7fe5000 r-xp b7fe4000 00:00 0 [vdso]
b7fe5000-b7ffa000 r-xp 00000000 03:01 32613 /lib/ld-2.3.6.so
b7ffa000-b7ffc000 rw-p 00014000 03:01 32613 /lib/ld-2.3.6.so
bfa9c000-bfab1000 rw-p bfa9c000 00:00 0 [stack]
X22:001#
X22:001#
X22:001#
-------------------------------------------------------------------------------------------
以上の結果から
(1) cat プログラムは、 アドレス=0x08048000~のメモリにロードされた。
(2) headプログラムも同じく、アドレス=0x08048000~のメモリにロードされた。
08048000-0804c000 r-xp 00000000 03:01 146815 /bin/cat
:
:
08048000-0804e000 r-xp 00000000 03:01 130759 /usr/bin/head
:
:
同じ場所に同時に2つのプロブラムがロードされている????。
-------------------------------------------------------------------------------------------
X22:001# ls -l <----- ソースファイルは2つ。
合計 16
-rw-r--r-- 1 root root 48 2010-06-13 11:35 lib0.c
-rw-r--r-- 1 root root 155 2010-06-13 11:35 main.c
X22:001#
X22:001#
X22:001# cat main.c <----- main.c の中身。
/*----------------------------*/
#include <stdio.h>
void lib0(void);
int main(void)
{
getc(stdin); <----- プロセスがココで止める為。
lib0();
return 0;
}
/*----------------------------*/
X22:001#
X22:001#
X22:001# cat lib0.c <----- lib0.c の中身。
/*----------------------------*/
void lib0(void){}
/*----------------------------*/
X22:001#
X22:001#
X22:001# gcc -c -fPIC -o lib0.o lib0.c <----- lib0.c をコンパイル。
X22:001# gcc -shared -o lib0.so lib0.o <----- 更に共有ライブラリにする。
X22:001# gcc -o main -lc -L. -l0 main.c <----- main.cとリンクし実行形式を作る。
X22:001#
X22:001#
X22:001# ls -l
合計 40
-rw-r--r-- 1 root root 48 2010-06-13 11:35 lib0.c
-rw-r--r-- 1 root root 577 2010-06-13 11:37 lib0.o
-rwxr-xr-x 1 root root 5178 2010-06-13 11:37 lib0.so
-rwxr-xr-x 1 root root 11376 2010-06-13 11:37 main
-rw-r--r-- 1 root root 155 2010-06-13 11:35 main.c
X22:001#
X22:001#
X22:001# LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main & <----- 1つ目をバックグラウンドで実行。
[1] 2424 <----- プロセス番号=2424
X22:001#
[1]+ Stopped LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main
X22:001#
X22:001#
X22:001#
X22:001# LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main & <----- もう1つバックグラウンド実行。
[2] 2425 <----- プロセス番号=2425
X22:001#
[2]+ Stopped LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main
X22:001#
X22:001#
X22:001#
X22:001# ------ ここで /proc/プロセス番号/maps を確認。------
X22:001#
X22:001# cat /proc/2424/maps
08048000-08049000 r-xp 00000000 03:01 165474 /root/test/001/main
08049000-0804a000 rwxp 00000000 03:01 165474 /root/test/001/main
b7e37000-b7e39000 rwxp b7e37000 00:00 0
b7e39000-b7e3a000 r-xp 00000000 03:01 165479 /root/test/001/lib0.so
b7e3a000-b7e3b000 rwxp 00000000 03:01 165479 /root/test/001/lib0.so
b7e3b000-b7f62000 r-xp 00000000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7f62000-b7f67000 r-xp 00127000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7f67000-b7f69000 rwxp 0012c000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7f69000-b7f6e000 rwxp b7f69000 00:00 0
b7f6e000-b7f6f000 r-xp b7f6e000 00:00 0 [vdso]
b7f6f000-b7f84000 r-xp 00000000 03:01 32613 /lib/ld-2.3.6.so
b7f84000-b7f86000 rwxp 00014000 03:01 32613 /lib/ld-2.3.6.so
bfb9d000-bfbb2000 rwxp bfb9d000 00:00 0 [stack]
X22:001#
X22:001#
X22:001#
X22:001# cat /proc/2425/maps
08048000-08049000 r-xp 00000000 03:01 165474 /root/test/001/main
08049000-0804a000 rwxp 00000000 03:01 165474 /root/test/001/main
b7de6000-b7de8000 rwxp b7de6000 00:00 0
b7de8000-b7de9000 r-xp 00000000 03:01 165479 /root/test/001/lib0.so
b7de9000-b7dea000 rwxp 00000000 03:01 165479 /root/test/001/lib0.so
b7dea000-b7f11000 r-xp 00000000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7f11000-b7f16000 r-xp 00127000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7f16000-b7f18000 rwxp 0012c000 03:01 49803 /lib/tls/i686/cmov/libc-2.3.6.so
b7f18000-b7f1d000 rwxp b7f18000 00:00 0
b7f1d000-b7f1e000 r-xp b7f1d000 00:00 0 [vdso]
b7f1e000-b7f33000 r-xp 00000000 03:01 32613 /lib/ld-2.3.6.so
b7f33000-b7f35000 rwxp 00014000 03:01 32613 /lib/ld-2.3.6.so
bffad000-bffc3000 rwxp bffad000 00:00 0 [stack]
X22:001#
X22:001#
X22:001#
------------------------------------------------------------------------------------------
以上の結果から
(1) 1回目の起動では共有ライブラリlib0.soは、アドレス=b7e39000~のメモリにロードされた。
(2) 2回目の起動では共有ライブラリlib0.soは、アドレス=b7de8000~のメモリにロードされた。
:
b7e39000-b7e3a000 r-xp 00000000 03:01 165479 /root/test/001/lib0.so
:
:
:
b7de8000-b7de9000 r-xp 00000000 03:01 165479 /root/test/001/lib0.so
:
:
共有ライブラリなのに 一旦 メモリにロードされたあとでも 2回目の使用の時には別アドレスに
再ロードされる????。
------------------------------------------------------------------------------------------