連載 / プログラマー入門ー⑨ 込まれるので、指定した形式によって夫行時の乍カ嗹い ます。系寸パスて指定した場合には実行時にも同しディレ クトリを探します。ところかオ目対パスで指定していると、 コンパイル時にはコンパイルを実行するディレクトリに対 する相対パスになりますが、実彳郛にはプログラムを実行 したディレクトリに対する相対ディレクトリになります。 実行モジュールに記録されたサーチパスに依存する場 合、コンパイル時と実彳の環竟が違えは川しなくなる という欠点があります。たとえば、ディレクトリ構成が違 うときや、ライプラリのインストール先を変更した場合、 -L で哩め込んだサーチパスの未がなくなります。 そこで、いよいよ LD-LIBRARY-PATH の出番です。 LD LIBRARY PATH(SunOS) LD-LIBRARY-PATH は、 -L オプションとは違っ た働きをします。コンパイル時に共有ライプラリを探す ために使われる点は同しですが、このサーチパスは実行 モジュールに埋め込まれません。その代わり実行時に LD-LIBRARY-PATH が設定されていると、共有ライ プラリを探すサーチパスとして使われます。 実彳叔こは、次の優先頂位でライプラリを探します。 1. LD-LIBRARY-PATH に設定されたサーチパス 2. コンパイル時に -L オプションてオ日疋したサーチパス 3. OS のデフォルト・ディレクトリ したがって、実行モジュールに言求されたサーチパス に共有ライプラリがないとか、そもそも実行モジュールに サーチパスカ求されていないときには、共有ライプラリ の位置を LD-LIBRARY-PATH に設定してからプログ ラムを実行してください。 X ウインドウ・システムの libXI 1 のように、共有ラ イプラリをシステムの一部として提供するアプリケーショ ンでは、オ剽純勺なインストール先カ鴃まっています。この ようなライプラリをダイナミック・リンクするプログラム を作って、無償で公開したり販売したりするときには、 ・標準的なディレクトリにインストールしている環境で は、ユーザーカ可も指定しなくてもプログラムを実行で きる ・標準的なディレクトリにインストールしていない環境 78 では、ユーザーか夫行時に LD-LIBRARY-PATH を 設定すればフ。ログラムを実行できる となるように酉艫して作ります。 とはいえ、コンパイルする計算機をつねに想的な環竟 にしておけるとはかぎりません。そこで、どのような設定 でコンパイルすれはよいかをコンパイル時の環竟別に、次 にとりあげましよう。ここではコンパイル時の環境を 3 種 類にう嶽頁して、それぞれの、 開発者がおこなうべき設定 ・ユーサーカワ。ログラムを実行するときの条件 を紹介します。 ケース 1 最初は、標ま純勺なディレクトリに共有ライプラリがイン ストールされているケースです。しつは、開発者にとって もっとも都合のよい状態で、開発者は自分とユーザーの環 境の違いを思い煩うことなく、 -L オプションで共有ライ 前者の場合には、実行モジュールに書き込まれたサーチ の 2 不頁が考えられます。 されていない ・オ剽勺なディレクトリに共有ライプラリがインスト されている ・オ剽勺なディレクトリに共有ライプラリがインスト このプログラムを実行する竟には、 プラリの位置を指定してしまえます。 ーノレ ーノレ UNIX MAGAZINE 1995.6 この場合は、開発者はコンパイル時に -L オプションで ライプラリがないケースです。 ンストールされておらず、そのディレクトリに同名別人の 2 番目は、標勺なディレクトリに共有ライプラリがイ ケース 2 クトリを設定して実行することになります。 LD-LIBRARY-PATH に共有ライプラリのあるディレ 構成と違うので利用できません。そのため、ユーザーは サーチパスはユーサーが使用する計算機のディレクトリ 後者の場合には、実行モジュールに記録されている ドを実行できます。 パスを利用できるので、ユーザーは何も設定せずにコマン
連載 / プログラマー入門ー⑨ 図 1 Solaris では矛盾したリンク方式のま諚をおこなうとエラーになる % cc -dn a. c —Bdynamic ld : fatal : option —dn and —Bdynamic are xncompatible ld: fatal : Fi1e processing errors. 表 1 リンク方式諚するオプション ライプラリ実行モジュ リンク方式の指定 NO output written tO a—dn—dynamic ーノレ OS SunOS SVR4 なし できます。これが、、ライプラリごとのリンク方式 " にあた ります。たとえば lib 。はダイナミック・リンクで、 libb は スタティック・リンクというように、 1 つの実行モジュー ル中にダイナミック・リンクとスタティック・リンクが 実行モジュールのリンク方式 混在してもかまいません。 74 ま旧に渡されるので囹可は言及しません。 3 cc コマンドのオプションでも指定できますが、このオプションはそのま の一 B オプションで指定しますが、実行モジュールのリン SunOS では、ライプラリのリンク方式は ld コマンド なります俵 1 ) 。 0 研策に、 SoIaris と略 ) では、リンク方式窈旨定ガ去が異 す 3 。 SunOS 4. x ( 以後、 SunOS と略 ) と solaris 2. x リンク方式は、 ld コマンドのオプションで指定しま OS の種類とリンク方式の指定 でさえ可能です。 ンクされたダイナミック・リンクの実行モジュールの作成 極端 } な場合には、すべてのライプラリがスタティック・リ は、スタティックにリンクされるライプラリもあります。 るとはかぎらないわけです。コンパイル時の指定によって っても、すべてのライプラリがダイナミックにリンクされ つまり、ダイナミック・リンクの実行モジュールであ ジュールになります。 るライプラリがあれば、ダイナミック・リンクの実行モ 含めて、すくなくとも 1 つでもダイナミック・リンクす そこで、ライプラリのリンク方式か混在している場合も の・実行・モジューノレで、す。 必要です。このイ督はみをもつものがダイナミック・リンク 夫イ - 」時にライプラリをリンクするには、柑芯の仕掛けが ク方式を指定するオプションはありません。そこで、ライ プラリのリンク方式の指定によって実行モジュールのリン ク方式が自重加勺に決定されます。 SunOS で実行モジュールがダイナミック・リンクにな るのは、ライプラリのリンク方式でダイナミック・リンク の指定が 1 つでもあるときです。実行モジュールがスタ ティック・リンクになるのは、ライプラリのリンク方式の 指定がスタティック・リンクしかない場合です。 SVR4 は、ライプラリのリンクカ試は ld コマンドのオ プション -B 、実行モジュールのリンク方式は -d と別々に 指定します。ただし、任意の組合カ滸されているわけで はありません。矛盾した組合、すなわち、実行モジュー ルはスタティック・リンクで、ライプラリの一一 ; をダイナ ミック・リンクにする指定はできません。ューサーがその ような指定をした場合に何か起きるかはシステム依存です が、たいていの親切なシステムではエラーメッセージを表 示してユーサーの矛盾を孑商してくれます ( 図 1 ) 。 ライプラリのリンク方式の指定 —Bdynamic ー 10 —Bstatic ー 1 佖 ンを使い、次のように指定します。 ライプラリのリンク方式は、 ld コマンドの一 B オプショ はふたたび -Bstatic か -Bdynamic か現れるまでは有 はダイナミック・リンクになります。これらのオプション -Bdynamic の後ろに指定したライプラリ ク・リンクに -Bstatic の後ろに指定したライプラリはスタティッ と libc はダイナミック・リンクになります。 と指定すると、 liba と libd はスタティック・リンク、 libb —Bstatic —ld —Bstatic ー 10 —Bdynamic ー 16 —lc \ ld たとえば、 効で、コマンド行中に何回出現してもかまいません。 UNIX MAGAZINE 1995.6
図 4 % cc % cc % ls 連載 / プログラマー入門ー① リンク方式いによる実行モジュールのサイズの比較 ー 0 statichello he110. c —Bstatic ー 0 dynamichello he110. c -Bdynamic ー 1 * 五 e110 —rwxrwxr—x 1 1 ara 24576 Apr 9 04 : 10 dynamichello 106496 Apr 9 04 : 10 statichello イルを取り出して、実行モジュールに結合します ( 図 2 ) 。 一方、ダイナミック・リンクでは共有ライプラリのコー ドを実行モジュールに連結しません ( 図 3 ) 。そのため、実 行モジュールのサイズはスタティック・リンクのときにく らべて小さくなります。 例を挙げましよう。図 4 は、 hello world" を表小する同 しプログラムをスタティック・リンクとダイナミック・リ ンクをそれぞれおこなった際の実行モジュールのサイズを 上交したものです。このプログラムは標準ライプラリ libc をリンクしますが、スタティック・リンクはダイナミック・ リンクのおよそ 4 倍になっていることが分かります。去も匠 では、ちょっと大きなプログラムだとダイナミック・リン クで IMB 近くなるものカ軫しくありません。これがスタ ティック・リンクになると・ けっこう辛いですね。 ダイナミック・リンクではライプラリのコードが連結さ れないので、実行モジュールはそのままでは実行できない 不完全な状態です。そこで、実行時に共有ライプラリのリ ンクをするための f 廱トけか実行モジュールに埋め込まれま す。この信褂けは OS 依存ですが、通常は実↑丁時に共有ラ イプラリをリンクするための導入コードか実行モジュール に組み込まれます。 SunOS や Solaris の場合にはこのコードに加えて、ダ イナミック・リンクかどうかを判別するためのデータ構造、 、、 -DYNAMIC" にダイナミック・リンクのためのデータ が設定されます。 ライプラリの位置の指定 ーヨ殳に ld コマンドは OS に刊属のライプラリの所在を 知っていて、ユーサーカ畤別な指定をしなくても、どこか らともなく指定されたライプラリを探しだしてリンクして くれます。ところが、世の中にはシステムカ甘是イ」いーる以外 のライプラリもあり、これらの多くはシステムのライプラ リとは違うディレクトリにインストールされます。標ま純勺 76 なディレクトリにないライプラリは、その位置を ld コマ ンドに教えなくてはなりません。さもないとコンパイルに 失敗してしまいます。 スタティック・リンクの場合、ライプラリの位置を指定 するのは難しくありません。リンクはコンパイル時にしか おこないませんから、とにかくコンパイル時に実際にライ プラリが置いてあるディレクトリを指定するだけです。 ダイナミック・リンクの場合には、コンパイル時に実 彳の重川乍まで心配しなくてはなりません。なにしろ実行 時にもリンク処理がおこなわれるうえ、コンパイル竟と 実行環境か 1 司しとはかぎらないので、どのような工竟の下 でプログラムを実行しようともリンクか成功するような適 切な指定をおこなう必要があります。また、後するよう に、セキュリティに関係した制限もあります。 以降は、スタティック・リンクとダイナミック・リン クそれぞれの場合にライプラリの位置をどのように指定す るかを説明し、さらにダイナミック・リンク固有の間題に ついてもみていきます。 スタティック・リンクの場合 スタティック・リンクの場合には、ライプラリの位置の 孑旨定はあまり難しくありません。たいていの OS では、以 下のディレクトリ、 /usr/lib /lib /usr/ccs/lib にアーカイプ・ライプラリがあり、ユーザーがその所 在を教えなくても ld が自動的にこれらのディレクト リからライプラリを探しだしてリンクしてくれます。 /usr/ccs/lib は SVR4 の標準勺なディレクトリです。 市販のアプリケーションやフリー・ソフトウェアには /usr/local/lib にライプラリを置くものも多いので、 SunOS では上記のディレクトリのほかに、 /usr/local/lib UNIX MAGAZINE 1995.6
犯人は「ここだ 3 5 第求 京お 東資 テ 現代の複雑なソフトウェア開発には、様々な難問が待ち受 けています。実行時のメモリアクセスエラー、アプリケーショ ンの中で実行スビードを遅くさせている部分の解析、プロク ラムのテスト実行を監視し、テストが行われていない箇所や プログラムの使用状況の把握。発生すれば致命的となる工 ラーの多くは、見つけ出して修正するまでに数週間を要しま すこうしたプログラムの総合的なチェックは、最も解決の難 しい問題て魂プログラム開発の品質と効率を考えたときに は、 pure Softwa 「 e のプロダクトにおまかせください。開発工 程における大幅な時間の削減と信頼性の高いソフトウェア の構築を約束しますインストールも、操作も、実行も簡単 見、迷宮に迷い込んてしまったような難事件も、即座に犯人 を割り出す工ンジニアたちに頼もしいシステムの誕生です [ こ基 : をイ上三ル ] ・ CD-ROM から ta 「ファイルを展開。・イン ストールスクリプトを実行。あとは、会社名、ライセンス数、ライセンス 番号、パスワードを入力し、パスを通すだけです。面倒なライセンス についての設定は一切不要で ー行匿ー・プログラム構築前に pu 市 y とひと言添えてプログ ラムを構築。・できた実行形式ファイルを実行。これだけで、 purify がプログラムのエラーをチェッグ PureCoverage 、 Quantity 、 Pure Link も同様て魂 2 イラを速はな ! ヨ C / C 十十 / Fo 「む an に対応。また、純正コ ンパイラだけてなく、 gcc 等の純正以外のコンパイラにも対応 ーイを選区な、ヨ自作のプログラムだけてなく、ソースコードの ない共有ライプラリやサードバーティ製のライプラリもチェックが可能。 第 完全 日本語版 実行時工ラー検出ツール ープログラムの未初期化メモリの読み 込み、配列の境界外へのアクセス、 メモリの解放忘れ、 NULL ポインタの 読み書きなど、メモリーの不正使用を 的確に検出し、デパックの勛率を大 ド Y 幅に向上させるツール。 テスト保証ツール。 プロクラムのテスト実行を監視しテ ストが行われていない箇所やプログ ラムの使用状況をレポートします PIJR ド Y と同時に使用することてプロ グラムの品質向上を支援します。 実行速度解折ツール。 プロクラムの実行速度をマシン・サイ クルで計測します。また、計測結果を 様々な方法で表示することにより、プ ログラムのノくフォーマンスのポトルネッ クを簡単にかっ正確に解析てきます ( X11 uantify PureLink Purify ツ・ ( 0 e 「 09e ま 90 に G に 00 ^ 第ド Y インタルメンタリカ 標準リンカと互換性のあるインタルメ ンタリカ。プログラムの再リンク時間を に LINK 10 分の 1 以下にします 動作環境 SunOS4. X, Solaris2. X HP-UX 21 日間の無料貸出受付中 . Ⅳ 0 無料セミナー開催 日時 / 平成 7 年 6 月 1 日木 14 : 00 ~ 16 . 00 6 月 2 日金 14 00 ~ 16 . 00 会場 / 幣社セミナールーム 詳しくは「 PURE SOFTWARE 製品セミナー係」福原 TEL. ( 03 ) 5683 ー 831 1 開発元 S 〇 FTWARE Pure Software,lnc 一三ロ
BERKELEY SOFTWARE DESIGN, INC. BSD/OS Ver. 2.0 値下けしました 3 月 1 日から料金改定し、個人、大学などの研 究機関、 10 人以下の会社などは、更にお求め 安くなりました。学割、先払割引、研究機関 割引なども用意しております。 2.0 ソースライセンス 158 , 000 円 2.0 バイナリライセンス 74 , 000 円 追加ライセンス 30,000 円 大学サイトライセンス 1 年 288 , 000 円 また、今回から法人購入に関する料金は別設 定となりますので、お問い合わせください。 BSD OS e 20 新機肯旨 4.4BSDLite べースに変更することによる数々 の拡張 ( 2Gbyte 以上のディスクのサポート等 ) クラスタードファイルシステムによる高速化 (Ver. 1.1 との比較で 2 倍程度 ) 共有ライプラリにより、ディスク容量や、メ モリ占有量の改善 ( フルインストールで 100Mbyte 以上節約 ) SCO UNIX バイナリエミュレーション機能 ( 5500 種に及ぶ SCOUNIX のアプリケーション をそのまま SCOUNIX より高速に実行できます ) Accelerated X 新バージョン標準添付 インストールが容易になりました。 AcceIerated X 1.2 版標準添付開始 高速 X サーバがいよいよ登場 ! Power9000 - 200K Xstone (Viper) Matrox ー 300K Xstone SWiM(Motif ) 好評発売中 BSD / 386 版 , FreeBSD 版 , Linux 版 , Coherent 版 , NetBSD 版 価格各 25,000 円 ( 数量割引可 ) 株式会社フォア・チューンル 0 引系 〒 154 東京都世田谷区駒沢 2-11-3 第二集花園ピル 8 階 電話 03-5481-8794 FAX ()3-5481 ー 8432 lnternet: bsdi-info@foretune.co.jp 資料請求 No. 00B 標準的なディレクトリを指定し、 LD_LIBRARY-PATH で実際に共有ライプラリがあるディレクトリを指定しま す。コンパイル時は LD_LIBRARY-PATH で指定した ディレクトリにライプラリがみつかるので、リンクは成功 します。実行モジュールには -L オプションて指定した標 準的なディレクトリ名が埋め込まれるので、 ・・もうあ とはお分かりですね。 ケース 3 3 番目は、オ剽純勺なディレクトリに共有ライプラリがイ ンストールされていなくて、そのディレクトリに同名別人 のライプラリがあるケースです。これは非常に困った状態 です。 一見、ケース 2 での対処に似ているように思われま す。しかし、コンパイル時には -L オプションの設定が LD-LIBRARY-PATH の設定に優先するので、 -L オプ ションて指定されたディレクトリに同名別人のライプラリ がみつかると、これを参照して実行モジュールを作ってし まいます。仕方がないので LD-LIBRARY-PATH だけ 成疋してコンパイルしましよう。 このケースの弱点は、 -L オプションを指定しないため に実行モジュールにサーチパスが埋め込まれないことで す。このため、このコマンドを実行するユーサーは標ま純勺 なディレクトリに共有ライプラリがインストールされてい る場合でも、 LD-LIBRARY-PATH を設定してからプ ログラムを実行しなくてはなりません。 SVR4 のダイナミック・リンクの場合 前節のケース 3 のように、コンノヾイルの仕方によって は竟変数を設定しておかねはフ。ログラムの実行ができな くなってしまう場合があります。 これは -L オプションに、 ・コンパイル時のライプラリのサーチパス 夫彳の標勺なライプラリのサーチパス の 2 種類の機能をもたせているのが原因です。そこで、 SVR4 では新しい環境変数を導入してこの問題を解決し ました。 LD-RUN-PATH は、実行モジュールに埋め込むサー チパスを指定する竟変数です。 LD-LIBRARY-PATH 連載 / プログラマー入門ー⑨ 79 UNIX MAGAZINE 1995.6
ld 連載 / プログラマー入門ー⑨ ー B オプションを指定しなけれは、たんにダイナミック・ リンクとみなすので、 オプジェクト・ファイル A オプジェクト・ファイル B ー 1 佖—Bstatic ー 16 図 2 アーカイプ・ライプラリのリンク ライプラリ オプジェクト・ファイル A のときには、 liba はダイナミック・リンク、 libb はスタ ティック・リンクになります。 ライプラリのリンク方式の指定の例外 注意しなくてはならないのが、 -Bdynamic を指定した 場合でも OS によってはかならすしもダイナミック・リ ンクになるとはかぎらないことです。 SunOS では、 -Bdynamic を指定して共有ライプラリ がなくて代わりにアーカイプ・ライプラリがみつかったと きには、それを使ってスタティック・リンクをおこない ます。 それではこの逆の場合、すなわち -Bstatic を指定 したときにアーカイプ・ライプラリか験出できす共有ラ イプラリがみつかれば、共有ライプラリを使ったダイナ ミック・リンクになるかといえは、そうではありません。 -Bstatic が指定された場合にはあくまでもスタティッ ク・リンクを試み、アーカイプ・ライプラリがみつから なければ、たとえ共有ライプラリがあってもエラーになり ます。 ライプラリは複数のディレクトリに置かれるので、 ld コ という場合は、スタティック・リンクになるのでしよう つかる ・共有ライプラリよりも先にアーカイプ・ライプラリがみ レクトリにある ・共有ライプラリとアーカイプ・ライプラリが別々のディ を順番に十ヾます。それでは、 マンドがライプラリを探すときにはこれらのディレクトリ SVR4 では、実行モジュールのリンク方式を ld のオプ 実行モジュールのリンク方式の指定 実験で市薩忍できるのて読者への宿題としましよう。 かれるディレクトリ窈旨定力 1 去さえ知っていれば、簡単な この間題は、共有ライプラリの作り方とライプラリか置 か、それともダイナミック・リンクでしようか。 ション、 UNIX MAGAZINE 1995.6 未定義シンポル x オプジェクト・ファイル B シンポル x の定義 十 ↓ 実彳丁モジューノレ 図 3 ライプラリのリンク オプジェクト・ファイル A 未定義シンポル x ライプラリ オプジェクト・ファイル B シンポル x の定義 で明示的に指定します。ー dy はダイナミック・リンク、一面 ならスタティック・リンクになります。 一方 SunOS では、実行モジュールのリンク方式を明 示的に指定するガ去がありませんが、すべてのライプラリ 扣疋ー 10 に先立って -Bdynamic か -Bstatic を 1 度 だ ( 対旨定すれば、結果的に実行モジュールのリンク方式を 指定したのと同じ効果か得られます。デフォルトはダイナ ミック・リンクなので、何も指定しなけれは夫行モジュー ルはダイナミック・リンクになります。 実行モジュールの本冓造 前回の記事で説明したように、スタティック・リンクで はアーカイプ・ライプラリから勵里するオプジェクト・ファ ↓ 夫イ丁モジュール オプジェクト・ファイル A ー dy 75
・引数が stop のときはデーモンを停止 このはかにも、システムを停止するためのコマンドとし て、 BSD 系 UNIX と互換の shutdown (/usr/ucb/ のように重川乍させれはいいのです。スクリプトを実行する shutdown) があるのですが、なせかうまく動いてくれま 順番としてどのような番号を付け川まいいのか迷ってしま せん。今回はしつくり調査する余裕がなかったので、いす いますが、ほかのサービスに景グを与えるようなサービス れ詳しい原因カ喇明したらレポートします。 には小さな番号が付けられていますから 19 、適当に大きな 番号を選んでやれば OK です。 とりあえすはマシンにリモートログ monkey : はあー インして、プリンタくらいは使えるようになったで。で 舌か』泉してしまいましたが、 Run LeveI を理解して も、コンパイラは別売りやいうし、それがないと Mule おけは、マシンの停止は簡単です。要するに、通常はレ や bash なんかもコンパイルでけへん。いったい、どな ベル 2 の状態で動いているシステムを、レベル 0 、 5 あ いしてこのマシンで生活したらええんやろ・・ るいは 6 に移行させればいいのです。 Run LeveI の状 態を変えるプログラムはいくつかありますが、 sarumata ・ところがどっこい、 monkey 君。世の中そ こでは んなに悪い話ばっかりゃないで。どこぞの FTP サイト /etc/telinit と /usr/sbin/shutdown を紹介してお きます。 には、 PC 版 SoIaris 用の gcc のバイナリキットが置 いてあるそうな。 ほかにもシステムを強制的に止める /usr/sbin/halt monkey : へえー、そんなもんがあるんですか。 ( はん などがありますが、 telinit や shutdown と違い、 /etc/ まはたんにコンパイラを買う金がなかっただけちゃう rc0. d にあるスクリプトを実行せすにマシンを止めてし か ? ) で、どこの FTP サイトなんでしよう ? まうので、あまりお勧めできません。 sarumata : それを探すのもおまえの仕事や。ぶつくさ telinit の実行は簡単で、コマンドの後ろに引数、、 0 " を 言う暇があったら、さっさと探して取ってこんかい ! ! 付けます。 monkey : そんな殺生な。きようも残業して一日中マシ /etc/telinit 0 ( 突然、思いついたよう ンと格闘していたのに 引数が 5 や 6 でも意味は同じですが、、、 0 " のほう に ) そうや、デートの約束があるんで、きようはこれま が分かりやすいでしよう。 でということで。ほな、さいなら一 ! ! 一方、 shutdown を使ってシステムを停止する場合は、 身の危険を感した ( ? ) monkey 君、ありもしない約束 次のように実行します。 をでっち上げて、そそくさと帰ってしまいました。 /usr/sbin/shutdovn —iO —gO monkey 君の言うとおり、 Solaris 2.4 のコンノヾイラは オプション一 i やー g のあとには空白を入れないことに注 涜りとなっています。これがないと皆さんか愛用してい 意してください。 -i に続く番号は Run LeveI を表し、オ る ( ? ) bash や tcsh などのシェルはおろか、 Mule や プションを指定しない場合はレベル S ( シングルューサー といったフリー・ソフトウェアも使えません。 モード ) に移行します。また、一 g のあとには指定されたレ Solaris のシステムに関する設定はまだまだありますが、 ベルへの移行を開始するまでの秒数を指定します ( デフォ とりあえすこのくらいにしておいて、次回は、 ルトは 60 秒 ) 。 shutdown では本当に実行するかどうか ・ gcc のバイナリキットの入手とインストール を訊かれますが、そオび人後の処理は telinit と同しです。 ・ MuIe やなど、おもなフリー・ソフトウェアのイ どちらを実行しても、最終的にはコンソールに、 ンストーノレ Type any key t0 continue について紹介する予定です。 というメッセージか表刀ヾさマシンの電源を切ることが ( おかやま・きよひこ、かたやま・よしあき できます。このとき、何かキーを押すとマシンは再起動し 奈良先端不斗 : 物支術大完た学 ) ます。 19 さきに走酬ルておく必要があるからてす。 一三ロ 38 UNIX MAGAZINE 1995.6
連載 / プログラマー入門ー⑨ と同し形式で夫行時のライプラリの位置を設定してコンパ イルすると、実行モジュールにこのサーチパスカ求され ・・ご想像のとおりです。 ます。あとは、 ところで SVR4 では、実行時のサーチパスを設定する 手段か環境変数に限定されています。もっと直接的に ld コマンドに教えこむことができたっていいしゃないです か、ねえ。 ・・ということで、 SVR4 よりも一歩先をゆく Solaris では ld コマンドに一 R オプションを用意し、これて指定 したサーチパスも実行モジュールに埋め込むようにしまし た。なお、 LD-RUN-PATH 環竟変数と -R オプション か 1 司時に設定されたときの優立は、 1. ー R オプション 2. LD-RUN-PATH 環竟変数 です。 SVR4 と SunOS の違いはもう 1 つあります。 SVR4 では LD-LIBRARY-PATH の形式が変わりました。 SunOS の場合、コンパイル時には -L オプションのはう が LD-LIBRARY-PATH の設定よりも優先されます。 SVR4 の LD-LIBRARY-PATH の形式は、 2 不重類の 図 5 ldd の実行結果 されるんだろう」 1ibd1. so . 1 = > libc . so . 1 = > % ldd a. out /usr/lib/libc . so . 1 /usr/lib/libdl . SO . 1 サーチパスを dirl :dir2 : ・ ( セミコロン ) て区切って表すのですが、 ;dirm:dirn: セミコロンで区切った左側のサーチパスはコンパイル時に ー L オプションよりも優先します。たとえば、 ldd となります。 dir2 dirl dir3 のとき、コンパイル時のライプラリのサーチパスは、 ・ LD-LIBRARY-PATH が市禧 ; 市 r3 ・ -L オフションが市可 「いったい、このプログラムってどのライプラリがリンク にオプションと竟変数が 4 不頁も登場すると、 う難しくなってしまいました。ましてや、 SoIaris のよう す。 SunOS でも十分複雑なのに、 SVR4 になるといっそ 自由度カ止がるということは、複雑さの増加をも表しま 80 と頭を悩ませることになってしまいます。 「大丈夫、だいじよーぶ。ライプラリがみつからないって 言われていないんだから、正しいライプラリをリンクでき てるんだよ」 いえいえ、世の中そんな甘いもんやおへんで。 X ウインドウ・システムの GUI である Motif など は、さまざまな不頁があるのにライプラリには同じ名前を 付けています。このように同名別人のライプラリがあると きには、たとえダイナミック・リンクに成功していても 期待したものを使っているとはかぎりません。 X11R5 と XI 1R6 のように、同しシステムであってもライプラリに 複数のバージョンがあるときには、意図しないものをリン クしてしまうこともあります。 細心の注意を払って、、ついうつかり " をなくせばよいと いわれそうですが、生来のうつけ者にそんなことを要求さ れたって困ります。そこで、このようなときには ldd コ マンドに頼ってみましよう。 ldd は、現在の竟でどの共有ライプラリがリンクされ るかを教えてくれるコマンドです。図 5 を見てください。 ldd コマンドにダイナミック・リンクのプログラムを引 数として与えると、 ライプラリ名 = > パス名 の羅列を表示します。左側がダイナミック・リンクすべき 共有ライプラリの名前で、右側はリンクされるライプラリ のパスを表しています。これで実際にイつれるライプラリ を知ることができます。 ダイナミック・リンクの落し穴 「おっかしいなあ、ちゃんとこのディレクトリにライプ ラリがあるのに、どうしてみつからないって言われるんだ ろう」 SunOS や Solaris のダイナミック・リンクには落し穴 があります。 SetUID または SetGID したプログラムで は、実行時に LD-LIBRARY-PATH を設定しても無効 UNIX MAGAZINE 1995.6
連載 / UN Ⅸの首具箱ー⑩ 図 1 配布パッケージを展開したディレクトリ mew—O . 89 : OOack 00b0f . j is 00 change s OOeuc ・ J is OOfaq OOinsta11 OOinsta11. jis 3. make install を実行 00readme OOreadme . jis 00t0d0 00usage 00usage ・」 is Makefi1e bin/ lookup/ -url . el —refile . el pgp ・ el pem. e1 -gnus ・ el —fib . e1 mew mew mew— mew— mew mew mew . dOt . emacs mew . el mewencode . c . patch. gz mhc/ patches/ make を実行した結果、生成された *. elc ファイル と bin ディレクトリ以下の実行ファイルがそれぞれ ELISPDIR と BINDIR にコピーされます。 4. ange-ftp.el をインストール Mew には an e-ft . el が必で Mule 2 はもとから付属しているので、そのまま利用できます。 Mule 1 の場合、展開時に作られた patches ディレク トリ中の ange-ftp/ange-ftp.mule.patch というノヾッ チファイルを ange-ftp に当てます。 136 が必要になります。以下に注意すべき点を挙げます。 で、 MIME の設定を全然してないというのであれば設定 はほとんどありません。ただ Mew は MIME 対応なの の mh-e を利用していたユーザーは、新たに設定する事柄 いままで、 MH あるいは Emacs がインターフェイス MH の設定 MuIe と書くことにします。 は、対象とする Emacs を MuIe 2.2 PLOI とし、たんに ても、 MH と Emacs の設定がまだ残っています。以降 Mew の lisp file やコマンドのインストールか終了し Mew の設定 明していきます。 定などのソフトウェア的な設定が必要です。次にそれを説 ル竹喋は終了です。あとは実際に使用するための、竟設 make install に成功すれば、プログラムのインストー 羅列します。 file が置いてあるディレクトリを : ( コロン ) で区切って といったメッセージが出たら、 LOADPATH に該当する lisp make の途中で「 xxx ファイル (lisp file) がおまへん」 ~ / ・ mh-profile を用意する MH を使ったことがあれば、かならすありますが、も しなけ川ま、 1 度 inc コマンドを実行してください。自動 的に作成されます。さらに次の恥頁を石忍してください。 ・ PATH: MaiI て始まる行があるか ? もしなけれは、追加します。 ・ Draft-FoIder: drafts て始まる行があるか ? これもなければ追加します。 ・ MH の send コマンドに MIME 機能をもたせている か ? send: -hencode と whom: -hencode があるかを確 訒します。ない場合砌日します。 川じ、 ・ inc や scan したときに MIME コードがちゃんと復号 されるか ? lnc: —form scan. form と scan: -form scan. form があるかを確認します。ただし、次に説明するように scan. form は、 scan. format の場合もあります。 -/MaiI/scan. form を用意する ~/ ・ mh-profile にある一 f 。 rm の引数として指定される ファイルです。 ~/. mh-profile 中で用いたファイル名 に合わせます。ここでは scan. form としましよう。この ファイルは、 MH コマンドの inc や scan を使ったとき にメールのヘッタ部分をどのようにスキャンするかを指 定するファイルです。書き方の詳しい説明はほかの参考書 などに譲って、 こでは図 2 をそのままコピーすることに します。 これで MH 側の設定は終了です。 MH を使って MIME 対応のメールの読み書きをおこなっていたユーサーは、と くに何もする必要はなかったでしよう。初めてのユーサー こまでの設定をしつかりとおこなってください。 は、 UNIX MAGAZINE 1995.6
UN Ⅸへの招待 ( ⑩ 図 2 forw 実行の Subj ect : Forwarded Message Return—Path : aya Return—Path : く aya> Received : from localhost by husband. myhome ( 4.1/SMI—4.1 ) id AA00191 ; Sat , 15 Apr 95 16 : 34 : 18 JST Message—Id : く 9504150734.AA00191@husband.myhome> TO : aya Subj e ct : thomas In-Rep1y-To : Your message of "Sat , 18 Mar 95 00 : 05 : 10 JST. く 9503171505.AA00757@husband.myhome> Date: Sat, 15 Apr 95 16 : 34 : 16 JST From : Yusuke lmaizumi く yusuke> 機関車トーマスの付いたパンツを買って。 そしたら、しっしが出る前に教えるから。 ゆうたん End of Forwarded Message 図 3 scan の実彳」 1 + 04 / 15 yusuke@home ・ co ・ jp thomas くくママ機関車トーマスの付いたパンツを買って。 彼カ矗集担当者に中幻医する、というような場合に使うコマ ンドです。 このコマンドを実行すると、画面は図 2 のようになり ます (. mh-profile に、、 Editor: vi" の言己があった場 合 ) 。図からも分かるように転送するメッセージは、 Forwarded Message End of Forwarded Message のあいだに置かれます。 To: や Subject: の部分は、 comp コマンドのときといに自分で入力してください。 フォルダの走査一一 scan コマンド scan コマンドは、フォルダにどんなメッセージが溜 まっているかを調べるために使います。 scan は、 1 つの メッセージについて以ード窈青報を 1 行で表示します (inc から、 UNIX MAGAZINE 1995.6 コマンド実翁時と同じメッセージです ) 。 ・メッセージ番号 ・メールの送信日時 ・メーノレの送信者 ・サプジェクト ・メッセージの一工碚防 ) 165 得ることができます。 ると、フォルダ内の一 ; のメッセージについてだけ情報を 記の報が表示されます。一方、次のような引数を指定す カレントフォルダにあるすべてのメッセージについて、上 オプションを指定せすに scan コマンドを実行すると、 りに収まるだけ表示されます。 の記号を表示したあとに、メッセージのう頁部分が行の残 信者、 thomas がサプジェクトです。以 - ヒの情報と、、くイ メールの送信日時、 yusuke@home.co.jp がメールの送 たとえば、図 3 では 1 がメッセージ番号、 04 / 10 が