Linux 移植ガイド - Hewlett Packard

HP-UX 11.x 向け Linux 移植ガイド
目次
対象読者
背景知識
Linux 移植キット
推奨される移植手順
Linux からの移植を妨げる要因
付録 a: 用語集
付録 b: オープンソース開発者ツールキット
付録 c: libhplx 内の Linux 互換 API
付録 d: Linux 移植キットの使用許諾条件
原文最終更新日: 2001 年 9 月 17 日
翻訳版作成日: 2001 年 10 月 1 日
© Copyright 2000, 2001, Hewlett-Packard Company
対象読者
本ドキュメントは、Linux アプリケーションやオープンソース アプリケーションを、HP-UX 11.x へ移植しようとしてい
るソフトウェア開発者を対象としています。HP-UX 11.x とは、PA プラットフォーム対応の HP-UX 11.0/11i、および
Itanium プラットフォーム対応の HP-UX 11i バージョン 1.5 (11.20 とも呼ばれる) を指します。
背景知識
Linux は、インターネットや e-services のソリューション展開基盤として、広く普及しつつあります。また Linux は廉価
な開発基盤であり、高度なカスタマイズが可能で、便利なツールを多数備えているほか、多くのベンダ プラットフォー
ムにわたるツール群および makefile の互換性に優れたGNU コンパイラツール群の使用が可能なため、主要な開発プラッ
トフォームとしての人気も高まっています。
Linux 移植キット
HP では Linux を戦略上重要なオペレーティングシステムとみなしており、マルチ OS 戦略の一環として HP-UX、64
ビット版の Windows® 2000、および Linux 向けに、さまざまな製品およびサービスを提供しています。この戦略に沿っ
て HP では、任意の OS 上でのビルドや展開の支援に努めています。Linux 上で開発したアプリケーションを HP-UX へ
移植する場合は、HP が提供する Linux 移植キットをご利用いただけます。
Linux 移植キットを使用すると、HP-UX に対応済みの一般的なオープンソース ツールが提供されるほか、HP-UX 向け
に Linux API を書き直す作業が軽減され、またソースコード内の移植上の問題点も簡単に検出して解決策を決定できるよ
うになるため、Linux から HP-UX へのアプリケーションの移植が容易になります。
このキットは、Linux から HP-UX へアプリケーションを移植する場合の、C/C++ソースコード、makefile、およびスクリ
プトのソース互換性の保持にも役立ちます。ただし現時点では、Linux カーネルアプリケーション、特権アプリケーショ
ン、および Linux アーキテクチャに依存するアプリケーションはサポートされていません。
Linux 移植キットの使用許諾条件
Linux 移植キットには、以下の内容が含まれています。
● 強化されたオープンソース開発者ツールキット (GNU コンパイラツール群を含む) バージョン 1.0
● libhplx Linux 互換 API ライブラリおよびヘッダファイル
● 移植上の問題点のスキャンや要約に役立つ Linux ソフトウェア移行キット (STK)
● Linux から HP-UX への移植ガイド
● Linux から HP-UX へのネットワークドライバ移植ガイド
移植キットは、PA プラットフォームおよび IPF(Itanium Processor Family)プラットフォーム向けに、それぞれ個別のバー
ジョンが用意されています。移植キットは次のサイトから入手可能です。
http://devresource.hp.com/LPK
オープンソース開発者ツールキット
このツールキットには、GNU コンパイラツール群および一般的なオープンソース ツール (perl、Xemacs、Tcl/Tk、bash な
ど) が含まれています。さらにいくつかの一般的なオープンソース パッケージも追加されています。詳細は「付録 b:
オープンソース開発者ツールキット」を参照してください。
個々のオープンソース ツールは、そのツールのライセンスおよび免責事項の下で使用を許諾されています。オープン
ソース ツールをインストールするときは、事前にそのツールの readme ファイルに記載されているライセンスおよび免責
事項を必ず確認してください。オープンソース ツールは、オープンソース コミュニティによりサポートされていま
す。HP では、これらのオープンソース ツールはサポートしておりません。
Linux 互換 API ライブラリlibhplx
Linux 互換 API ライブラリであるlibhplx には、libhplx.sl 内の約 200 個の Linux 互換 API をはじめ、関連するヘッダファイ
ルとライブラリソースも含まれています。これらの Linux 互換 API は Linux glibc 2.1.3 をベースに作成されたもので、現
在の HP-UX には含まれていない API であり、既存の HP-UX ライブラリや HP-UX 開発ツールと組み合わせて使用でき
ます。提供される API の一覧については、「 libhplx.sl 内の Linux 互換 API 」で確認してください。移植時に役立つ
『Linux GNU C Library Reference Manual』も用意しています。
重要: libhplx は Linux のglibc がベースとなっているため、スレッドセーフではあ
りません。
Linux ソフトウェア移行キット
Linux ソフトウェア移行キット (STK) には、Linux アプリケーション (C、C++、スクリプト、makefile など) を Itanium 対
応の HP-UX 11i バージョン 1.5 に移行するための移植のガイドライン、ドキュメント、およびツールが含まれていま
す。
Linux STK には、以下の内容が含まれています。
● Linux から HP-UX への移植時に注意が必要なコーディング上の問題点を検出するための各種ツール
❍ 作業量の見積もりに役立つツール (lxscansummary)
❍ 移植上問題のあるソースコード行を特定し、解決方法を提示するツール (lxscandetail)
❍ Web (またはテキスト) 形式のレポートを生成するツール
● ドキュメントライブラリ
❍ Linux から HP-UX への移植ガイド
❍ ホワイトペーパー
❍ オンラインドキュメント
❍ Linux および HP-UX のマンページ
Linux から HP-UX へのネットワークドライバ移植ガイド
Linux (カーネルバージョン 2.2)から HP-UX 11i バージョン 1.5 へのネットワークドライバ移植ガイドおよびサンプルコー
ドが、2001 年 9 月よりご利用いただけるようになります。 Linux から HP-UX 11.x へのネットワークドライバ移植ガイ
ドは現在入手可能です。 この移植ガイドでは、Linux と HP-UX でドライバの環境を比較し、ネットワークデバイス ド
ライバを Linux から HP-UX へ移植する際の手順を詳細に説明しています。 HP-UX 環境におけるバスアクセス、メモリ
マッピング、割り込みの扱いは、それぞれ該当する部分のコードを用いて解説しています。 また、サンプルとして PCI
Fast Ethernet カード(Intel 21143 チップセットベース)用のデバイスドライバの HP-UX 版および Linux 版が記載されていま
す。
この製品に関するご質問は、[email protected]にお寄せください。恐れ入りますが英語でお願いいたします。
Linux から HP-UX への推奨移植手順
ここでは、既存の Linux アプリケーションを PA または IPF プラットフォーム対応の HP-UX バージョン 11. x へ移植する
際の手順について説明します。アプリケーションの移植に関してここで取り上げられている以外の問題が生じた場合
は、[email protected]までお問い合わせください。恐れ入りますが英語でお願いいたします。また、HP-UX 上で
の開発に関するその他のツール、フォーラム、情報などについては、HP Developer's Resource (http://devresource.hp.com) を
ご覧ください。
以下の一覧は、既存の Linux アプリケーションを HP-UX に移植する際の作業手順を示したものです。これらの手順は、
記載順に実行することをお勧めします。
システム要件の特定と検証
HP-UX パッチのインストール
Linux 移植キットソフトウェアのインストール
その他のソフトウェアパッケージのインストール
Linux アプリケーションの展開とアンパック
Linux アプリケーションドキュメントを探して内容を確認
Linux アプリケーションの移植準備
Linux アプリケーションの構成
Linux アプリケーションの移植とビルド
Linux アプリケーションのインストール
Linux アプリケーションのテストと実行
Linux アプリケーションのデバッグ
Linux アプリケーションのチューニング
Linux アプリケーションの配置
移植例
libhplx のカスタマイズ (省略可)
システム要件の特定と検証
移植先となる HP-UX 11.x システムにログオンします。次にそのシステム上に、Linux STK ツールとlibhplx ライブラリの
インストールに適した HP-UX リリースがインストールされていることを確認します。次のコマンドを実行してくださ
い。
% uname -a
uname から以下の結果が返されれば、有効なリリースがインストールされています。
● HP-UX [hostname] B.11.0 ...
● HP-UX [hostname] B.11.11 ...
● HP-UX [hostname] B.11.20 ...
ディスク容量
CD
内容
サイズ
インストール先ディレクトリ
CD 1
Linux 互換 API ライブラリ liphplx
Linux STK ツール
Linux STK ドキュメント (Linux マンページなど)
54MB
2MB
54MB
/usr/local/hplx
/opt/STKU
/opt/STKU
CD 2
オープンソース開発者ツールキット
580MB
/usr/local
HP-UX パッチのインストール
数学演算 API
libhplx 内の float 型の結果を返す数学演算関数を使用したときに、"no relocation of float args" エラーの発生を回避するに
は、HP-UX 11.0 に少なくとも以下のパッチを適用する必要があります。HP-UX 11i (PA) または 11i バージョン 1.5 (IPF)
については、これらのパッチは不要です。
GNU コンパイラを使用する場合
PHSS_21701
PHSS_21947
1.0
1.0
linker startup code / SLLIC ELF support
ld(1) and linker tools cumulative patch
HPC/aCC コンパイラを使用する場合
PHSS_18066
PHSS_18649
PHSS_21701
PHSS_21947
PHSS_22217
PHSS_22272
1.0
1.0
1.0
1.0
1.0
1.0
C Preprocessor cumulative patch
Assembler patch
linker startup code / SLLIC ELF support
(ld(1) and linker tools cumulative patch
+O4/PBO compiler cumulative patch
ANSI C compiler cumulative patch
動的リンク機能
動的リンク機能であるdlopen()、dlclose()、dlsysm()、およびdlerror() は、Itanium 対応の HP-UX 11i バージョン 1.5、64
ビット版の HP-UX 11.0、および 32/64 ビット版の 11i システム上で使用可能です。また、パッチ ID PHSS_22478以上を
適用すれば、32 ビット版の 11.0 システムでもこれらの API を使用できます。
pread()/pwrite()
11.00 用のカーネルパッチはPHKL_20349以上、libc パッチはPHCO_20765以上です。HP-UX 11i ではこの機能はデフォル
トでサポートされています。
HP-UX パッチハブ
HP-UX パッチおよびサポートについては、以下の URL をご覧ください。
● アメリカ/アジア太平洋地域: http://us-support.external.hp.com
●
ヨーロッパ: http://europe-support...external.hp.com
Linux stk ソフトウェアのインストール
必要に応じて Linux STK ツールファイルセットを、移植先の HP-UX システム (PA プラットフォーム対応の HP-UX
11.0/11i または IPF プラットフォーム対応の HP-UX 11i v1.5) にインストールします。ただし、さまざまなツールファイ
ルセットやドキュメントファイルセットを含む Linux STK 全体をインストールする必要はなく、引き続き Linux ワーク
ステーション上で使用することも可能です。なお HP-UX 11.0/11i 上には、Linux 互換ライブラリlibhplx もインストール
する必要があります。Itanium 対応の HP-UX 11i バージョン 1.5 には、このライブラリが付属しています。
1. HP-UX マシンに適切なツールデポをコピーします。HP-UX 11.0 または 11i にはSTK11tools.binを、HP-UX 11i v1.5
にはSTK1120tools.binをインストールしてください。
2. HP-UX プロンプトで、次のコマンドを実行します。
$ su - root<CR>
# export LANG=C<CR>
# export DISPLAY=myhost:0.0<CR>
# swinstall -s full_path_to_tools_depot *
3. ログファイル/var/adm/sw/swinstall.logを開いて、インストールが正常に終了したことを確認します。正常に終了して
いれば、"Selection succeeded" という内容が書き込まれています。
HP-UX の Linux 互換ライブラリlibhplx には、約 200 個の一般的な Linux API の HP-UX 対応版が含まれています。この
ライブラリを利用すると移植が容易になります。このライブラリを探してダウンロードするには、以下の手順を実行し
てください。
● HP Developer's Resource(http://devresource.hp.com/)内のLinux 移植キットホームページに移動します。
●
●
libhplx library を選択し、登録フォームに必要事項を入力します。登録およびライブラリのダウンロードは無料で
す。
使用許諾条件に同意のうえ、アーキテクチャに適したライブラリをダウンロードし、手順に従ってインストールし
ます。
その他のソフトウェアパッケージのインストール
HP-UX に移植する Linux アプリケーションを、HP-UX 上でビルドおよびリンクするには、追加のソフトウェアパッ
ケージが必要になる場合があります。追加のソフトウェアパッケージは、移植する Linux アプリケーションの makefile か
ら検出できるように、適切なビルドディレクトリにインストールしなければなりません。移植する Linux アプリケーショ
ンで、Linux 移植キットに含まれていないオープンソース ソフトウェアパッケージが必要な場合は、それらのパッケージ
が使用可能かどうか、HP-UX Porting and Archive Centre ( http://hpux.cae.wisc.edu) で確認してください。
また追加で必要になるソフトウェアパッケージが独立したソフトウェアベンダから購入したものである場合は、そのソ
フトウェアに付属しているインストール手順も確認してください。
Linux アプリケーションの展開とアンパック
一般的な圧縮ツールの使用例を次に示します。
$ tar -zxvf [filename].[tar.gz │ tgz]
$ gunzip [gzip file].[gz │ z │ Z]
$ zcat [file].[gz │ z │ Z]
Linux アプリケーションドキュメントを探して内容を確認
多くの Linux アプリケーションパッケージには、インストールや構成に関する重要な情報が記載された、通常
はREADMEまたはINSTALLという名前のファイルが付属しています。ドキュメントを探すには、プロンプトで次のよう
に入力します。
$ ls
READMEまたはINSTALL、あるいはこれに類似した名前のファイルを探してください。これらのドキュメントには、必
ず目を通しておくようにしてください。
Linux アプリケーションの移植準備
次に、Linux アプリケーションのソースコード内で移植上問題となる点を探し、これを解決する必要があります。まず
Linux STK のファイルスキャナを使用して、C、C++、makefile、およびスクリプトについて、アプリケーションのソース
ファイル内に Linux の移植上の問題点がないかどうかを調べます。次に、アプリケーション ソースコード内で検出され
た問題点を解決します。Linux STK のファイルスキャナには、次の種類があります。
● uxscansummary - ソースコードツリー内で、特定の影響がどの程度検出されるかを調べるのに使用します。これは
全体的な作業量の見積もりに役立ちます。
● uxscandetail - 各ソースコード行で発生する影響について、行単位のレポートが生成されます。デフォルトでは
HTML ファイルが生成され、このファイル内の各インスタンスは、それぞれの影響の説明と、その影響が発生して
いるソースコード行にリンクしています。このレポートを基に、ソースコード内の個々の行を修正できます。
uxscansummary() とuxscandetail() のオンラインマンページは、次の場所にあります。
uxscandetail(1)
Linux アプリケーションの構成
Linux アプリケーションでconfigure を使用しているかどうかの確認
Linux アプリケーションの中には、特定のプラットフォームに合わせてアプリケーションをカスタマイズするため
のconfigure と呼ばれるツールを使用しているものがあります。configure は、Linux アプリケーションに必要な各種機能が
存在しているかどうかをテストするスクリプトです。このconfigure スクリプトは、Linux アプリケーションの開発者
が、autoconf と呼ばれるツールを使用して生成します。configure スクリプトの実行中は、テスト中の機能を示すメッセー
ジが出力されます。configure スクリプトによる機能テストの結果、通常は次に示す処理が行われます。
1. Makefile が作成されます。
2. configure の再実行に備えて、結果がキャッシュファイル (config.cache) に保存されます。
3. 結果がログファイル (config.log) に出力されます。
Linux アプリケーションでconfigure を使用しているかどうかは、configure という名前のファイルがあるかどうかで判断で
きます。Linux アプリケーションにおけるconfigure 使用の有無は、以下の作業で適切な手順を選択するうえで重要になり
ます。
一般的なconfigure オプション
Linux アプリケーションでconfigure の使用が確認された場合は、以下に示すオプションの指定が必要になることがありま
す。
configure オプション
オプションの説明
--help
configure オプションの一覧が出力されます。
--prefix=[ install_directory]
--prefix を指定しなかった場合: 現在作業中のディレクトリにインストールさ
れます。
● --prefix のみを指定した場合: /usr/local にインストールされます。
● --prefix= install_directory と指定した場合: 指定したinstall_directory にインス
トールされます。
--host= architecture- vendor- release
場合によっては、configure が適切なホスト属性 (使用中のプラットフォーム) を
判断できないことがあります。次に、HP-UX 11i バージョン 1.5 用の--host オプ
ションの指定方法を示します。
--host=ia64-hp-hpux11.20
その他の例を以下に示します。
--host=hppa1.1-hp-hpux10.20
--host=hppa2.0-hp-hpux11.00
--host=hppa2.0w-hp-hpux11.0
●
最新の GNU config.guessスクリプトは、以下のサイトから入手可能です (毎日更新)。
ftp://ftp.gnu.org/gnu/config/config.guess
ftp://ftp.gnu.org/gnu/config/config.sub
configure/autoconf の詳細については、以下の URL を参照してください。
http://www.gnu.org/manual/autoconf/html_mono/autoconf.html
http://www.gnu.org/software/autoconf/autoconf.html
Linux 互換 API ライブラリlibhplx の自動使用
以下では、移植する Linux アプリケーションに最も適した Linux 互換ライブラリを自動的に使用するための手順を示しま
す。Linux STK ファイルスキャナを実行した結果、移植に必要な API を含むlibhplx を使用するよう推奨された場合は、
以下の手順を実行することにより makefile を変更せずに済みます。
注記: libhplx の使用に伴い、次に示す動作上の相違が生じます。
1. libhplx は、現在の HP-UX libc には含まれていない GNU libc API のサブセットを含むライブラリです。なおlibhplx
はglibc の全機能を提供するわけではないため、__GLIBC__マクロと__GNU_LIBRARY__マクロをテストすることに
よって、glibcの全機能が利用可能であることをテストしている Linux アプリケーションビルドでは、__HPLX マク
ロが定義されていないことも確認する必要があります。
2. 従来 HP-UX 上では使用できなかった API が、libhplx では使用可能になりました。これにより、アプリケーション
で使用できる名前空間が拡張され、HP-UX 上でのビルドや実行時に新しいパスフローが提供されます。
GNU コンパイラを使用する場合 (Linux との互換性を最大限にするにはこちらを推奨)
以下の手順を実行すると、libhplx Linux 互換 API ライブラリおよびヘッダファイルにアクセスするため、makefile を変更
する面倒な手間が軽減されます。以下の 2 つのタイプのlibhplx の自動使用のうち、各自の環境に適した方を選択してく
ださい。
グローバル - この設定は、システム上で GNU コンパイラを使用する すべての
ユーザーのすべてのビルドに影響を与えます。
制限範囲内 - この設定は、以下に示す形でシェルに CC が定義されている環境に
のみ影響を与えます。
警告: g++を使用してアプリケーションをビルドした場合は、HP aCC オブジェクトとはリンクできません。
グローバルなlibhplx の自動使用
1. スーパーユーザーとして、libhplx の自動使用を有効化するための次のスクリプトを実行します。
# /usr/local/hplx/bin/hplxGccSpecFile
注記: GNU コンパイラツール群を更新またはインストールしたときは、このスク
リプトを必ず再実行してください。
このスクリプトを実行しておくと、GNU コンパイラツール群に対して、libhplx ヘッダファイルとlibhplx ライブラ
リを使用するよう自動的に指示されます。特に、オープンソースアプリケーションや、移植時の作業量を軽減する
ためにconfigure を使用しているアプリケーションを移植する場合は、このスクリプトを実行してください。なお元
の GCC スペックファイルについては、[gcc_spec_file].[timestamp] という名前でバックアップコピーが保存されま
す。
GNU コンパイラを使用する一部のビルドでlibhplx を使用したくない場合は、次のスクリプトを実行して、libhplx
の自動使用を解除します。
# /usr/local/hplx/bin/hplxGccSpecFile -d
2. 前述の手順により、Linux アプリケーションでconfigure が使われていることを確認できた場合は、次のように
configure スクリプトを実行します。「一般的なconfigure オプション」の項で説明したように、追加の configure オ
プションの指定が必要になる場合もあります。
$ configure
制限範囲内でのlibhplx の自動使用
1. Linux アプリケーションの makefile 内でlibhplx の使用を有効化するには、次の操作を行います。
Linux アプリケーションでconfigure が使われていることを確認できた場合は、次のコマンドを実行します。「一般
的なconfigure オプション」の項で説明したように、追加の configure オプションの指定が必要になる場合もありま
す。なお各セットの 2 番目のコマンドは、Itanium システム対応の HP-UX 11i V1.5 の場合にのみ使用してくださ
い。
C アプリケーションの場合:
$ CC=`gcc -mlinuxapi` configure
$ CC=`gcc -mlinuxapi -mlp64` configure (64 ビット版の HP-UX 11i v1.5 の場合のみ)
C++アプリケーションの場合:
$ CXX=`g++ -mlinuxapi` configure
$ CXX=`g++ -mlinuxapi -mlp64` configure (64 ビット版の HP-UX 11i v1.5 の場合のみ)
前述の手順により、Linux アプリケーションでconfigure が使われていないことを確認できた場合は、次のコマンド
を実行します。
C アプリケーションの場合:
% export CC=`gcc -mlinuxapi`
% export CC=`gcc -mlinuxapi -mlp64` (64 ビット版の HP-UX 11i v1.5 の場合のみ)
C++アプリケーションの場合:
% export CC=`g++ -mlinuxapi`
% export CC=`g++ -mlinuxapi -mlp64` (64 ビット版の HP-UX 11i v1.5 の場合のみ)
HP コンパイラを使用する場合 (アプリケーションで HP-UX コンパイラの最適化機能等を利用するにはこちらを推奨)
1. 次の内容を Linux アプリケーションの makefile に追加します。
-D__HPLX -I/usr/local/hplx/include
-L/usr/local/hplx/lib
-lhplx -lsec
説明:
-D__HPLXは、libhplx ヘッダファイル内の libhplx 定義を有効化するための指定です。
-I/usr/local/hplx/includeは、 liphplx と共に使用する必要があるlibhplx ヘッダファイルをインクルードしています。 注
記: このフラグは、その他すべての-I指令よりも前に指定しなければなりません。
-L/usr/local/hplx/libは、 libhplx ライブラリの検索パスを定義しています。
-lhplxを指定することにより、 libhplx ライブラリにリンクします。
-lsecを指定することにより、 libsec ライブラリにリンクします。Linux 上ではこれらの API の多くがlibc 内にあるた
め、リンク指令は不要です。
libhplx.a アーカイブとのリンク
上記の手順は、共有ライブラリlibhplx.sl (Itanium システム上ではlibhplx.so) を使用したビルド方法を示したもので
す。libhplx.sl を使用すると、ライブラリにパッチを適用した時点でアプリケーションが自動的に修正される他、アプリ
ケーションのサイズも軽減されるため、可能であれば共有のlibhplx.sl を使用してください。ただし、libhplx.sl とアプリ
ケーションをバンドルしたくない場合や、アプリケーションのユーザーに Linux 移植キットもインストールするよう要求
したくない場合などは、libhplx.a アーカイブを使用しても構いません。なお HP-UX 11i バージョン 1.5 にはlibhplx.so が
付属しているため、共有ライブラリをバンドルしたり、アーカイブライブラリを使用する必要はありません。GNU コン
パイラまたは HP C コンパイラで、libhplx.a アーカイブを使用してアプリケーションをビルドするには、コンパイル行に
次の内容を追加します。
-I /usr/local/hplx/include
さらに次の内容を、リンク行のオブジェクトファイル一覧よりも後で、かつ共有ライブラリよりも前に指定してくださ
い。
/usr/local/hplx/lib/libhplx.a
Linux アプリケーションの移植とビルド
大部分の Linux アプリケーションは、プログラムコンポーネントのコンパイルにmake ユーティリティを使用していま
す。Linux 移植キットに付属する GNU make を使用すると、Makefile の互換性が最大限になります。HP-UX の make を使
用することも可能ですが、この場合は Linux アプリケーションの Makefile を手作業で変更しなければなりません。
移植する Linux アプリケーションをビルドするには、クリーンなビルドが作成されるまで、以下の手順を繰り返してくだ
さい。
1. ソースコード、スクリプト、および Makefile について、必要なコード変更を手作業で行います。
2. 必要に応じて Linux STK ツールuxscandetail を再実行します。
3. アプリケーションをビルドするには、make コマンドを実行します。
Linux アプリケーションのインストール
次に、ここまでの段階で HP-UX 11.x への移植が終了した Linux アプリケーションをインストールします。Linux アプリ
ケーションを、すべてのシステムユーザーがアクセスできる場所 (/usr/localなど) にインストールする場合は、HP-UX プ
ロンプトで次のコマンドを実行してください。Linux アプリケーションをプライベートなディレクトリ内で使用する場合
は、この手順は省略して構いません。
$ su root
# make install
Linux アプリケーションのテストと実行
HP-UX 11.x 上で Linux アプリケーションをテストして実行します。このときアプリケーションのシェルスクリプトか
ら、Linux 移植キットに含まれているオープンソースパッケージの使用を要求されることがあります (bash シェル、perl
など)。これらのオープンソースツールは/usr/local/bin/にインストールされるため、場合によってはパスの調整が必要にな
ります。アプリケーションを実行するには、HP-UX プロンプトでアプリケーションの実行可能ファイル名を入力しま
す。
アプリケーションのビルドおよびテストを行うために、Makefile 内に次の内容が記述されている場合もあります。
$ make check
または
$ make test
アプリケーションを実行するには、次のコマンドを実行します。
$ [executable name]
Linux アプリケーションのデバッグ
HP-UX に移植した Linux アプリケーションが異常終了したり、正しく実行されなかった場合は、アプリケーションをデ
バッグして、予想外の動作の原因を突き止める必要があります。
Linux 移植キットに付属するgdb デバッガは、g++、gcc、および HP C コンパイラでコンパイルしたコードをデバッグで
きます。HP aCC コンパイラでコンパイルしたコードのデバッグには、gdb は使用できません。
wdb デバッガは、gdb をベースに HP が HP-UX 向けに改良した GUI を持つデバッガで、gcc、HP C、および HP aCC コ
ンパイラでコンパイルしたコードをデバッグできます。現時点では、g++コンパイラでコンパイルしたコードのデバッグ
には、wdb は使用できません。wdb デバッガは次のサイトからダウンロード可能です。
http://www.devresource.hp.com/devresource/Tools/ToolLibrary.html#ctools
オープンソースツールのビルドに使用されたすべてのソースコードおよびlibhplx は、Linux 移植キット内にそれぞれ個別
のソースデポの形で含まれています。そのため必要に応じて各自のスケジュールに従って、製品を自由にカスタマイズ
したり、問題点を修正したり、拡張することが可能です。
Linux アプリケーションのチューニング
以下に示すアプリケーション性能測定ツールを使用すると、HP-UX に移植した Linux アプリケーションを HP-UX 上で
チューニングできます。
Cxperf - 対話型の実行時性能アナライザで、メッセージパッシング MPI、複数プロセスのアプリケーション、共有/アー
カイブライブラリ、共有メモリ、pthread アプリケーションなどをサポートしています。このツールは、GNU コンパイラ
ツール群を使用してビルドしたアプリケーションには使用できません。このツールは次のサイトからダウンロード可能
です。
http://devresource.hp.com/devresource/Tools/cxperf/index.html
gprof、prof - プログラムの実行プロファイルを生成するためのプロファイリングユーティリティです。これらのツールで
生成されるプログラム性能統計を調べると、実行時間がどこで消費されているかがわかります。これらのツール
は、HP-UX オペレーティングシステムに付属しています。
HP-UX 向けのアプリケーション チューニング方法については、次のサイトをご覧ください。
http://devresource.hp.com/devresource/Topics/Optimization/Perf.html
アプリケーションの配置
アプリケーションのバンドル
通常この時点でアプリケーションには、libhplx.so ライブラリ、またはオープンソース開発者ツールキット内のその他の
共有ライブラリへの依存性があるはずです。アプリケーションがlibhplx またはその他のオープンソース共有ライブラリ
を使用しているかどうかを調べるには、次の手順を実行します。
1. chatr application_binary_filename
2. 共有ライブラリの一覧内で、libhplx.*またはその他のオープンソースライブラリを検索します。
アプリケーションがlibhplx.sl またはその他のオープンソース共有ライブラリを必要としている場合は、次のいずれかを
実行してください。
● 必要なライブラリをアプリケーションにバンドルします。詳細はGNU Lesser General Public Licenseを参照してくだ
さい。なお HP-UX 11i バージョン 1.5 にはlibhplx.so が付属しているため、このライブラリをアプリケーションにバ
ンドルする必要はありません。
● アプリケーションユーザーへの指示として、Linux 移植キットライブラリまたはオープンソースライブラリをダウ
ンロードする必要があることを文書に明記します。
● オープンソースライブラリのアーカイブバージョンを使用してアプリケーションをビルドすることにより、共有ラ
イブラリへの依存性が排除されます。ただし互換性を確保するために、できる限り共有ライブラリを使用したビル
ドをお勧めします。
詳細は、「libhplx.a アーカイブとのリンク」を参照してください。
移植例
次に、イメージングアプリケーションである Electric Eyes を HP-UX に移植する場合の手順例を示します。
1. tar ファイルをアンパックします。
$ tar -C ee-0.3.12.tar.gz -zxvf
2. Electric Eyes ディレクトリに移動します。
$ cd ee-0.3.12/
3. プラットフォームに合わせて configure をセットアップします。
$ CC=`gcc configure`
4. アプリケーションをビルドし、ログファイルをlog/ディレクトリに保存します。
$ make
5. 3 つの API が見つからないため、リンクステップ中にビルドが失敗します。
6. Linux STK を実行して、コード内で移植上の問題点を探します。
$ /opt/STKU/bin/uxscandetail -y -u -r ./ -p ee-0.3.12
-r は、スキャン対象のルートディレクトリを指定し、サブディレクトリを再帰的にスキャンするよう指定します。
-y は、シンボリックリンク先のディレクトリ内もスキャンするよう指定します。
-u は、未知のタイプのファイルはスキャンしないよう指定します。
-p は、結果ファイルのプレフィックスを指定します。
サフィックスによりファイルタイプを指定する方法については、/etc/opt/STKU/config/clientを参照してください。
7. uxscandetail レポートに示されているアドバイスをチェックします。
ここでは、libhplx 内の API が必要であるため、-mlinuxapi スイッチを使用するよう指示されています。
8. ビルド時にlibhplx API が使用されるように設定します。
$ CC=`gcc -mlinuxapi -mlp64 ` configure
9. 今回は make が成功し、実行可能ファイルee が作成されます。
$ make
10. ee をインストールします。
$ make install
11. ee を実行します。
$ ee images [directory of images] &
成功です! 以上で作業は完了です。
libhplxのカスタマイズ (省略可)
ほとんどの場合、以下の手順は必要ありません。この手順は、libhplx をカスタマイズまたは変更する場合にのみ必要に
なります。
1. Linux 移植キットに含まれているすべてのオープンソースツールを、手順に従ってインストールします (gcc、make
など)。ソースから libhplx.1 をビルドするには、GNU コンパイラツール群が必要です。
2. Linux 移植キット Web サイトから入手した SD-UX 形式の HPLX 製品をインストールします。このとき HPLX.src
ファイルセットを指定してソースファイルセットもインストールするか、あるいは HPLX 製品を指定することによ
り両方のファイルセットをインストールするようにし、バイナリファイルセットである HPLX.bin のみをインス
トールしないように注意してください。
3. su - root
4. cd /usr/local/hplx/src/
5. configure --enable-hplx
6. make
7. make hplx-install - このホスト上に新しいライブラリをインストールします。
8. make hplx-depot - 他のホストにもインストールするための SD-UX デポを作成します。
Linux からの移植を妨げる要因
Linux から HP-UX への移植を妨げる要因は、以下のように分類できます。
ライブラリや API の位置の相違
特殊な状況
メモリ管理
動的リンク機能
カーネル内参照/アーキテクチャ固有
入出力
スレッド
コンパイラツール群
数学演算
UNIX 98
ネットワーク機能
エンディアン
グラフィックス/GUI
コマンド
国際化
その他
HP-UX から Linux への移植
ライブラリや API の位置の相違
ライブラリの説明
Linux
HP-UX
動的リンク機能
libdl dl*() API
11i SOM PA32 以前: libc
shl_*()
● 11i ELF PA64 以前: libdl dl*()
● 11.i と新しい ELF: libdl dl*()
Curse
lib[n]curses
libxcurses
データベース API
libdb
libc、libdbm
●
セキュリティ API getspent、getspnam、setspent、endspent
libc
libsec
UNIX95/98 ソケット API
libc
libxnet
isinf、isnan
libc
math.h
libc
libnsl
copysign、copysignf、ldexp、modf、scalbn
libc
libm
リモートプロシージャコール用 XDR
API
● 外部データ表現/ストリーム用 API
● サーバー登録用 API
libc
librpcsvc
ホストバイト順とネットワークバイト順
の間で値を変換するための各種 API
libc
#include <netinet/in.h> または
_XOPEN_SOURCE_EXTENDED
のみ
#include <arpa/inet.h>
compile、step、advance
libc
regexp.h
authnone_create
libc
librpcsoc.so
●
●
●
廃止された RPC API
CLIENT ハンドルの作成と操作
保護されたリモートプロシージャコー
ル
公開鍵または秘密鍵の取得
● RPC サーバー API
● サーバー側のリモートプロシージャ
コールエラー
●
●
特殊な状況
状況
HP-UX 移行時の推奨手法
Linux のオブジェクトファイル形式
(ELF32) またはデバッグファイル形式
(DWARF) に依存
HP-UX に移植します。PA32 の場
合のオブジェクトファイル形式は
SOM、PA64 の場合は ELF です。
また IPF の場合も ELF になりま
す。デバッグ形式は PA の場合が
SOM、IPF の場合が DWARF で
す。
永続的システムファイル (utmpx、wtmpx な
ど) の直接操作
適切なアクセス API を介してデー
タにアクセスするよう変更しま
す。
カーネル内参照型の処理 (/dev/kmem の読
み取り、標準外のカーネル機能 /proc への
依存など)
HP-UX カーネルに移植します。
アーキテクチャへの依存 (グラフィックス
フレームバッファやバッキングストアの直
接操作など)
HP-UX に移植します。
1.9GB を超える大容量プロセスデータ空
間、2.75GB を超える共有メモリ
64 ビットアプリケーションに変換
します。その他のソリューション
も開発中です。
メモリ管理
mmap() によるメモリマッピング
以下の動作は Linux と HP-UX 11i バージョン 1.5 ではサポートされていますが、HP-UX 11.0/11i ではサポートされてい
ません。
● 重複するページをmmap() する。
● 2 つのスレッド/プロセスから同一の固定アドレスにmmap() する。
● 匿名メモリ領域にアクセスするために、/dev/zero にmmap() する。
● 2 つの異なるスレッドから同一ページにmmap() する。
● MAP_SHARED ページを複数回mmap() する。これはマルチスレッドプログラムや、呼び出し元でmmap() される内
容が不明な関数などについては、MAP_PRIVATE を指定したマッピングが必要なことを意味していま
す。MAP_SHARED を指定してマッピングすると、プロセス間でのデータセグメントの共有が非常に容易になりま
す。
● 要求に応じて、特定の固定アドレスにある同一ファイルをmmap() する。アプリケーションによって、例えばデー
タベースポインタをディスク上に保存しておき後から再読み取りするアプリケーションや、インメモリデータベー
ス アプリケーションなどでは、別のアドレスにアドレス指定する機能 (MAP_FIXED アドレスエイリアシング) が必
要になります 。
以下の動作は Linux ではサポートされていますが、HP-UX ではすべてのバージョンでサポートされていません。
● HP-UX では、複数のテキストセグメントやデータセグメントはサポートされていません。
● 要求に応じて、特定の固定アドレスにある同一ファイルを、MAP_FIXED を使って別のアドレスにmmap() する。
● 共有オブジェクトのmmap() 時に、システムで自動的に選択されるアドレスではなく、プロセスで選択したアドレ
スにアタッチされるようにする。HP-UX では、MAP_FIXED か MAP_SHARED のいずれかを選択しなければなり
ません。
以下の標準外のmmap() フラグは、HP-UX ではサポートされていません。
● MAP_LOCKED
● MAP_DENYWRITE
● MAP_EXECUTE
● MAP_GROWSDOWN
統合バッファキャッシュ
HP-UX では、 mmap() アクセスで使用されるキャッシュと、バッファキャッシュは異なっています。そのためファイル
へのアクセス時に、ファイルシステムに対するread()/write() システムコールとmmap() の両方を使用すると、整合性に問
題が生じます。この問題を回避するためファイルアクセス時には、read()/write() システムコールまたはmmap() のいずれ
か一方のみを使用するようにしてください。これは推奨されるプログラマ手法ではありませんが、Linux 上ではこの動作
が許可されているため、将来的には HP-UX 上でもサポートされる予定です。
メモリロック
Linux 上ではmlockall() により、呼び出し元プロセスのアドレス空間に割り当てられているすべてのページについて、
ページングが無効化されます。この中にはコード、データ、スタックセグメントなどのページの他に、共有ライブラリ
やユーザースペースカーネルデータ、共有メモリ、メモリマップファイルなどのページも含まれます。
HP-UX 上ではこの代わりに、呼び出し元プロセスでシステムコール plock() を使用することにより、メモリ内にある自身
のテキストセグメントをロックしたり (テキストロック)、データセグメントをロックしたり (データロック)、あるいはテ
キストセグメントとデータセグメントの両方をロックする (プロセスロック) ことが可能です。
メモリ割り当て
Linux では、サードパーティ製の malloc パッケージを、Linux libc 内の malloc の代わりに使用することは許可されていま
せん。一方 HP-UX では、HP-UX libc 内の malloc() の代わりにサードパーティ製のmalloc() パッケージを使用できます。
libhplx 内の Linux 互換 API もこの点に関して HP-UX libc と方針が一致しており、HP-UX libc 内の malloc の代わりに
サードパーティ製のmalloc() パッケージを使用できます。
新しいメモリ機能
以下の Linux malloc() API は、HP-UX 11i (PA) および 11iv1.5 (IPF) の libc 内に含まれています。
void *memalign()
Linux と同様の仕様に加えて、要望の高かった 2 の累乗値でない整列形式に対するエラーチェック機能も追加され
ています。
HP-UX 上では機能しないメモリ API
以下のmalloc() ファミリ API は、HP-UX 上のlibhplx内の Linux 互換 API に含まれていますが、HP-UX の malloc() と統合
できないため、実際の機能は提供されません。
void ptmalloc_init()
スレッドアプリケーションの malloc ミューテックスを初期化します。malloc (およびすべてのスレッドセーフ API)
に対するスレッドサポートは HP-UX libc 内で管理されるため、この関数は不要です。このコールを自動実行する
ように GNC を構築できますが、スレッドアプリケーションで、最初のmalloc() コールに先だってこの API をコー
ルしても問題はありません。
int malloc_trim(size_t pad)
パッドバイトを除く空いている最上位メモリをすべて解放し、システムに返します。成功した場合は 1、失敗した
場合は 0 が返されます。
void malloc_stats()
文書化されていない Linux 関数です。すべての領域について、システムから取得した個々のスペースサイズと、ス
ペースサイズの合計値を stderr に出力します。この関数は HP-UX の malloc() では必要なく、libhplx 内では常に 1 が
返されます。
void * malloc_get_state()
文書化されていない Linux 関数です。Linux では malloc_state 構造体へのポインタが返されますが、libhplx 内では
NULL が返されます。malloc_state 構造体情報は、Linux のmalloc() 実装に固有のものです。
struct malloc_state {
long
magic;
long
version;
mbinptr
av[NAV * 2 + 2];
char*
sbrk_base;
int
sbrked_mem_bytes;
unsigned long trim_threshold;
unsigned long top_pad;
unsigned int n_mmaps_max;
unsigned long mmap_threshold;
int
check_action;
unsigned long max_sbrked_mem;
unsigned long max_total_mem;
unsigned int n_mmaps;
unsigned int max_n_mmaps;
unsigned long mmapped_mem;
unsigned long max_mmapped_mem;
int
using_malloc_checking;
};
int malloc_set_state(void *)
文書化されていない関数です。malloc_state 構造体を引き数として受け取り、それに応じて Linux malloc() パラメー
タを設定します。libhplx 内では無条件に 0 が返されます。
void mtrace(void)
Linux 内でmalloc() トレースを有効化します。HP-UX malloc() では、malloc() トレース機能は提供されていません。
ただしコンパイル時にアプリケーションに組み込み可能な、ユーザーレベルのmalloc() トレースパッケージは存在
しています。
void muntrace(void)
Linux 内でmalloc() トレースを無効化します。
int mcheck()
文書化されていない Linux 関数で、malloc() チェックを制御します。malloc() チェックが有効化されていれば 0 が、
無効化されていれば-1 が返されます。HP-UX libhplx 上では、常に-1 が返されます。
HP-UX の malloc() には、ユーザーが構成可能な整合性チェック機能はありません。デバッグモードでmalloc() を組
み込んで、同じようなヒープ整合性チェックを行うことは可能ですが、これは保守管理者のみが使用できる機能で
す。Purify のようなサードパーティ製ツールを使用すると、HP-UX malloc() に対するほとんどのユーザーデバッグ
を実行できます。
enum mcheck_status mprobe(__ptr_t ptr)
文書化されていない関数で、ptr に対する malloc() チェックを実行します。malloc() チェックが無効化されていれ
ば、MCHECK_DISABLED が返されます。HP-UX 上では、常に MCHECK_DISABLED が返されます。
以下の非 SVID mallopt() オプションは、HP-UX malloc() で使用することは可能ですが、実際の効果はありません。
M_TRIM_THRESHOLD
M_TOP_PAD
M_MMAP_THRESHOLD
M_MMAP_MAX
M_CHECK_ACTION
HP-UX 上では使用できないメモリ API
次の API は HP-UX 上では使用できません。
size_t malloc_usable_size(Void_t* p)
文書化されていない関数です。次にコードコメントを示します。
"このルーチンは、割り当てられているチャンク内で実際に使用できるバイト数を返します。場合によっては、要
求した値よりも大きい値が返されることもあります (稀なケースです)。このバイト分の領域を使用すれば、割り当
て済みの他のオブジェクトが上書きされるおそれがありません。これは特に重要なプログラミング作法ではありま
せんが、場合によっては有益です。"
この API は基本的には HP-UX 実装と同じですが、メモリが整列されたブロックについては、ユーザーが本来要求
した (整列された) サイズしか報告されません。通常のブロックおよび小さいブロックについては、ユーザー領域の
サイズが報告されます。
動的リンク機能
HP-UX 10. x、または 32 ビット版 11i 以前のバージョンの場合
動的リンク API であるdlclose()、dlerror()、dlopen()、dlsym()、dladdr() は、HP-UX 11i バージョン 1.5、32 ビット版および
64 ビット版の HP-UX 11i、および 64 ビット版の HP-UX 11.0 上でのみ使用可能です。ただし 適切なパッチを適用すれ
ば、32 ビット版の HP-UX 11.0 上でも使用できます。また 32 ビット版の HP-UX 11.0 上ではdlopen()、dlclose()、dlsym()
の代わりに、それぞれshl_load()、shl_unload()、shl_findsym() を使用でき、この場合パッチは不要です。 詳細は「 HP-UX
パッチのインストール」の項を参照してください。
共有ライブラリ名
動的リンク API は共有ライブラリに対して動作するため、共有ライブラリ名体系が Linux 上ではlib*.soであるのに対
し、HP-UX 11i バージョン 1.5 の場合は PA 版がlib*.sl、IPF 版がlib*.soである点にも注意が必要です。また HP-UX
11.0/11i の共有ライブラリ名体系は、lib*.sl です。さらに Linux と HP-UX では、API が存在しているライブラリファイル
が異なっている場合もあるため、異なる共有ライブラリを動的にロードしなければならない可能性もあります。
カーネル内参照/アーキテクチャ固有
Linux のカーネル API
Linux 上で/procまたは/dev/[k]mem を使用しているアプリケーションは、HP-UX 上では pstat() を使用するようコードを変
更する必要があります。カーネルドライバおよび動的にロードされるカーネルモジュールについては、これらのいずれ
の領域においてもカーネルとインタフェースをとるための標準が確立されていないため、HP-UX への移植が必要になり
ます。
Linux カーネル固有の API であ
る、_newselect、adjtimex、bdflush、capget、capset、clone、idle、ipc、prctl、sigreturn、personality などは、HP-UX 上では
サポートされていません。
また、以下の動的にロードされるカーネルモジュール用 API は、HP-UX 上でサポートされる予定はありません。
● create_module、delete_module、init_module、query_module
以下のアーキテクチャ固有の Linux API についても、HP-UX 上でサポートされる予定はありません。
● x86 固有: ioctl_list、ioperm、iopl、modify_ldt、vm86
● DOS 固有: outb
● その他:
_newselect、adjtimex、bdflush、capget、capset、clone、idle、ipc、prctl、sigreturn、personality、flock、wait4、mremap
wait()
子プロセスのステータス情報を取得するためにunion wait を使用すると、コンパイル時エラーまたは警告を引き起こす可
能性があります。解決方法として、union wait の代わりにint を使用してください。
シグナル
sigaction() システムコールは、特殊なシグナルを受け取ったプロセスの動作を変更するために使用します。SA_SIGINFO
フラグを指定すると、シグナルハンドラでパラメータを 1 つではなく 3 つ受け取れるようになります。この 3 つのパラ
メータのサポートは Linux 固有のものであり、HP-UX 上ではサポートされていません。
リアルタイム
HP-UX 上では rtprio(2) システムコールにより、プロセスのリアルタイム優先順位を設定または取得できます。一方 Linux
上では、この機能は pthreads ライブラリを介して実行されます。
ストレージデバイスの検出
Linux 上では、ストレージデバイスの検出は/procファイルシステムを介して実行されます。一方 HP-UX 上では、この情
報へのアクセスは libIO ライブラリまたは LVM ライブラリを介して実行されます。
入出力
ioctl() は非常に柔軟性の高い API で、キャラクタ型特殊ファイル (デバイス)、通常のファイル、およびディレクトリを制
御する働きをします。ioctl() は、キャラクタ型特殊ファイル/端末のさまざまな操作特性の制御にしばしば使用されま
す。サポートされるioctl() コマンドは、個々のデバイスドライバによって異なるため、すべてのioctl() コールについ
て、HP-UX への移植性をチェックする必要があります。
POSIX.1 で指定されている以外の termios 機能についても、移植が必要になる場合があります。
ストリーム I/O バッファリング
Linux と HP-UX では、ストリーム I/O バッファリングの動作に違いがあります。 setbuffer()、setbuf()、およびsetlinebuf()
はすべてsetvbuf() をベースに実装されているため、いずれもsetvbuf() のストリーム I/O バッファリングを継承していま
す。
Linux 上では、バッファリングポリシーを変更するために、任意のオープンストリームに対して任意の時点でsetvbuf() 関
数を使用できます。これはファイルからのデータ読み取りまたは書き込みの後であっても可能です。バッファリングポ
リシーの変更時に、バッファの現在の内容は初期化されません。
HP-UX 上では setvbuf() 関数は、ストリームがオープンされた後で、かつ読み取りまたは書き込みが行われる前の時点で
使用されるものと想定されています。
注記: ストリームにアクセスした後のsetvbuf() コールについてはサポート対象外です。ただしこのような処理を行った場
合は、文書化されていない動作として、バッファリングポリシーが変更され、バッファの現在の内容は破棄されます。
次のコードセグメントは、Linux と HP-UX での動作の違いを説明したものです。
FILE *stream;
char readbuf[15];
int fd;
stream = fopen("testfile1", "w+");
fwrite("12345", 1, 5, stream);
setlinebuf(stream);
fwrite("abcdefghi n", 1, 10, stream);
read(fd, readbuf, 15);
readbuf の内容は、Linux 上では12345abcdefghi\n、HP-UX 上ではabcdefghi\nとなります。
スレッド
次に、HP-UX の pthread 実装には存在しない Linux pthread 実装に関する制限事項および問題点の一覧を示します。
● Linux の場合は、各スレッドは独立した Unix プロセスであり、新しいシステムコールclone() を使用して他のスレッ
ドとアドレス空間を共有します。Linux のスレッドは、高速切り替えが可能でプロセスパーツを共有できますが、
クローンフラグを使用して共有されている内容を識別したり、execve() で実行することも可能です。スレッド間の
スケジューリングは、Unix プロセス間のスケジューリングと同様に、カーネルスケジューラによって制御されま
す。プロセスのスケジューリング、キャンセル、一時停止などの動作の制御にはシグナルが使われます。
● *_r() API は、HP-UX では廃止予定となっていますが、Linux では廃止される予定はありません。
● Linux の各スレッドは 1 つのプロセスとして実装されるため、スレッド/スレッドスタック実装上の制約に伴って、
デフォルトの Linux スレッド数は非常に制限されたものとなっています。デフォルトでは、各 Linux スレッドは自
身のスタック用に 2MB の仮想メモリ空間を予約します。ただし、スタック用の実メモリは要求された時点で初め
て割り当てられます。
● Linux のスレッドスタックはgrow on demand (必要時に拡張) フラグ付きで割り当てられますが、スレッドスタック
用に予約された領域に対してユーザーがmmap() を実行することを防止する機構はないため、後でスレッドスタッ
クの拡張に失敗する可能性があります。
● pthreads を使用する場合は、固定アドレスに対するmmap() は避けてください。
Linux スレッドは以下のような点において、POSIX 1003.1c から逸脱しています。
● 各スレッドは、シグナルを個別に受信できる独立した処理動作であるため、総体としてのプロセスにシグナルを送
信することはできません。あるスレッドの PID に送信されたシグナルは、そのスレッドでのみ処理が可能です。シ
グナルをブロックしているスレッドがない場合は、POSIX 1003.1c に準拠した動作が行われます。(つまりプログラ
ム内の 1 つの任意のスレッドによってシグナルが処理されます)。ただしシグナルを受信したスレッドがシグナル
をブロックしている場合は、他のスレッドがシグナルをブロックしていなくても、シグナルは最初のスレッドの待
ち行列に入れられて、シグナルブロックが解除された時点で初めてスレッドハンドラが実行されます。この場合、
シグナルをブロックしていない他のスレッド内のハンドラが直ちに実行されるのではない点に注意してください。
● スレッドは標準に従って、メモリ空間、ファイル記述子、シグナルハンドラ、現在の作業ディレクトリなど、共有
する必要がある大部分のリソースを共有します。ただし各自の PID と親 PID は共有されません。
● 現在の実装では 2 つのシグナル SIGUSR1 と SIGUSR2 が使用されるため、ユーザーレベルのコードはどちらのシグ
ナルも使用できません。このライブラリ用に 2 つのシグナルを予約しておくことが理想的です。一方のシグナルは
ミューテックスまたは条件によりブロックされているスレッドの再開に、もう一方はスレッドのキャンセルに使用
します。
● シグナル処理は POSIX 1003.1c に完全には準拠していませんが、これは各スレッドがシグナルを個別に受信できる
独立したプロセスであり、すべてのスレッドの総体としてのプロセス にシグナルを送信することはできないためで
す。
● 非同期シグナルは、プログラム内のスレッドのうち、シグナルをブロックしていない任意のスレッドに渡されます
(どのスレッドかは指定されません)。そしてシグナルは、スレッドの PID に基づいて、送信先のスレッドに渡され
ます。そのスレッドが現在シグナルをブロックしている場合は、シグナルは保留状態のままになります。
また以下に示すのは、POSIX 1003.1c に準拠した Linux 実装固有の動作の概要です。
● スレッド実行 (SIGFPE など) により生成された同期シグナルは、それを生成したスレッドに渡されます。
●
●
致命的な非同期シグナルを受け取った場合は、プロセス内の全スレッドが終了します。シグナルによりスレッドが
強制終了された場合は、スレッドマネージャがこれを検出し、同一シグナルを使用して他のすべてのスレッドを終
了させます。
シグナルは通常、最大でも 1 つのスレッドにのみ渡されます。ただし端末から生成されたシグナルやプロセスグ
ループに送信されたシグナルは、すべてのスレッドに渡されます。
pthread の相違点
次に、Linux と HP-UX における pthread 実装の相違点を示します。
pthread_self - Linux では 0 が返されますが、HP-UX では 1 が返されます。1 はスレッドアプリケーション内のメインプ
ログラムスレッド id であり、例えばスレッドは作成しないが libpthread とリンクするアプリケーションの場合
は、pthread_self() から値 1 が返されます。
pthread_equal(arg1, arg2) - Linux では 1 が返されますが、HP-UX では (arg1 == arg2) が返されます。この点については業
界標準がないため、この実装で間違いではありません。
pthread_create() は特殊なケースです。前述したように、この関数は Linux 内ではスタブを持ちませんが、HP-UX バー
ジョン 10.20 以降ではスタブを持っています。HP-UX スタブからは ENOSYS が返されます。
もう一つの特殊なケースが、pthread_getspecific() API ファミリです。HP-UX スタブ上では、これらの関数は非スレッド
型のケースでは完全に機能します。クリーンアップ関数を登録して、pthread_exit() がコールされた時点でコールされる
ようにすることも可能です。ただし非スレッドプログラムの正常終了時に、pthread_exit() が自動的にコールされること
はありません。
その他の POSIX.1c 関数は、HP-UX と Linux のいずれの場合もスタブを持っており、セマンティクスも同一です。
HP-UX には POSIX.1c には含まれていない pthread 関数も多数存在し、これらの関数はいずれもスタブを持ちません。
コンパイラツール群の相違点
HP-UX コンパイラツール群と GNU コンパイラツール群には多くの相違点があるため、ビルドスクリプトの移植性を高
めるには、Linux アプリケーションのビルドに GNU コンパイラツール群を使用するようお勧めします。ただし、HP-UX
の最適化機能や性能を活用したいアプリケーションについては、HP-UX コンパイラツール群を使用してください。
ビルドスクリプトの移植性の他に、次の点にも注意が必要です。
● Linux のGNU コンパイラツール群は NULL ポインタのディリファレンス(dereferences)に厳格ですが、HP-UX では
一定範囲内で許容されます。
● HP-UX では文字列リテラル値の変更が許容されますが、Linux ではこれらを定数とみなすため、適切なコンパイラ
フラグを指定しなければ、警告なしに処理が中止されます。
GNU make と HP-UX make
HP-UX make と GNU gmake の違いの詳細については、以下のサイトをご覧ください。
http://devresource.hp.com/devresource/Docs/Refs/SunPort/OtherTools.html#make
HP-UX makefile と GNU makefile の類似点
HP-UX Make と GNU Make で定義される基本的なサフィックスセットや暗黙の規則は同一です。以下のマクロおよび変
数は共通しています。
● マクロ: .DEFAULT .PRECIOUS .SILENT .IGNORE ...SUFFIXES
● 動的マクロ: $@ $% $* $< $?
● 変数: CC CFLAGS CPPFLAGS FC FFLAGS LEX LFLAGS YACC YFLAGS LD LDFLAGS
HP-UX makefile と GNU makefile の相違点
次に、GNU Make ツールと HP-UX Make ツールの主な相違点について概説します。
● GNU Make では、libname((symbol)) 形式のライブラリ依存指定はサポートされていません。このように記述されて
いる箇所は、libname(file.o) 形式に置き換えてください。ここでfile.oはsymbolを含んでいるファイルです。
● GNU Make では、依存リスト内の現在のターゲットを参照する場合は、次のように指定します。
$(targets): %: %.o lib.a
●
また GNU Make で空のサフィックス規則を指定するには、依存指定の直後にセミコロンを記述します。例え
ば、.c.a: ;と指定します。
:= シンボルを使用する式の処理はまったく異なります。HP-UX Make はこのシンボルを条件付きマクロとして取り
扱います。次の例について考えてみましょう。
$(debug_targets) := special_flags = -g
この場合、$(debug_targets) 内のターゲットが処理されたときに、$(special_flags) に-gが設定されます。一方 GNU
Make は、この式を単純に拡張された変数とみなします。:= 代入では、右側にある変数は代入時に 1 回のみ評価さ
れます。次の例について考えてみましょう。
targetlist := $(filename) $(targetlist)
●
この場合、$(targetlist) には代入時に、$(filename) と$(targetlist) を加算した値が設定されます。その後$(filename) の
値を変更しても、$(targetlist) への影響はありません。
GNU Make を使用して条件付きマクロを作成するには、ターゲット固有の変数を使用します。条件付きマクロを
ターゲット固有の変数に変更するには、次に示すように、シンボル:= を...に変更してください。
$(debug_targets) := special_flags = -g /* HP-UX */
●
$(debug_targets) ... : special_flags = -g
/* GNU Make */
GNU Make のサフィックス規則では、' ~ ' で終わるサフィックスはサポートされていません。これは、GNU Make
では組み込みの規則を使用して SCCS ファイルを処理するため、このような規則が必要ないためです。
GNU make への変換の概要
種類
HP-UX make
GNU make
ライブラリ依存
libname((symbol))
libname(file.o)
現在のターゲッ
ト
$(targets): [email protected]
$(targets): %: %.o
条件付きマクロ
$(targets) := c_flags = -g
$(targets) ...... : c_flags = -g
空の規則
.c.a:
.c.a: ;
~ サフィックス
規則
.c~.o:
GNU Make に組み込まれているた
め不要
gcc による共有ライブラリの作成
gcc -shared を使用して共有ライブラリをビルドする場合は、オプション-fpic または-fPIC を使用してください。
数学演算
ロング倍精度の動作は、HP C と gcc で異なっています。例えば次の文について考えてみましょう。
long double x = 0.0 / 0.0;
gcc では x に "Not a Number" (数値でない値) が代入されますが、HP C では "Infinity" (無限大) が代入されます。ゼロによ
る除算の結果として NaN を想定している場合は、HP C コンパイラを使用するのであれば、コードの変更が必要になりま
す。
UNIX 98
UNIX 98 API 実装は、HP-UX 11i 上で初めて使用可能になりました。
gcc を使用する場合:
UNIX 98 を取得するには、次のコンパイラマクロ定義を使用してください。
-D_OPEN_SOURCE=500
またリンク行にも次の内容を追加する必要があります。
unix98.o
さらに、それぞれの環境に合わせてUNIX_STD変数を以下のように定義してください。
Korn、POSIX、および bash シェルの場合:
$ UNIX_STD=98; export UNIX_STD
C シェルの場合:
% setenv UNIX_STD 98
Bourne シェルの場合:
$ UNIX_STD=98
HP C を使用する場合:
この機能を使用するには、HP92453-01 A.11.01.20 以降の HP C コンパイラが必要です。
前述したようにUNIX_STD環境変数を設定してください。明示的に-D_XOPEN_SOURCE=500を定義したり、unix98.o と
リンクする必要はありません。これらは、UNIX_STD設定に基づいてコンパイラにより自動設定されます。
新しい UNIX 98 API
以下の UNIX 98 API は、HP-UX 11i 以降のlibcには含まれていますが、HP-UX 11.0 のlibc内にはありません。
● btowc() - 指定されたシングルバイトキャラクタに対応するワイドキャラクタ表現を返します。
● fwide() - ストリームの入出力単位を設定します。
● fwprintf、swprintf、wprintf() - フォーマットされたワイドキャラクタ出力をプリントします。
● mbrlen() - マルチバイト文字がワイド文字に変換された場合の使用バイト数を返します。
● mbrtowc() - バイトのストリームをワイドキャラクタコードに変換します。
● mbsinit() - シフト状態情報を含んだ最初の引き数でポイントされるオブジェクトが、初期変換状態を表すかどうか
を判断します。
● mbsrtowcs() - キャラクタ文字列をワイドキャラクタ文字列に変換します。
● towctrans() - キャラクタ変換機能を提供します。
● vfwprintf、vswprintf、vwprintf() - stdarg 引き数について、ワイドキャラクタでフォーマットされた出力をプリント
します。
● wcrtomb() - ワイドキャラクタをマルチバイトキャラクタ表現に変換します。また 2 番目の引き数に指定されたワイ
ドキャラクタコードに対応するキャラクタを表現するのに必要なバイト数を返します。
● wcsrtombs() - ワイドキャラクタ文字列をキャラクタ文字列に変換します。
● wcsstr() - ワイドキャラクタ文字列内のサブ文字列を検索します。
● wctob() - ワイドキャラクタをシングルバイト表現に変換します。
● wctrans() - 現在のロケールにおけるキャラクタマッピングを返します。
● wmemchr、wmemcmp、wmemcpy、wmemmove、wmemset() - メモリ領域内のワイドキャラクタを操作します。
● wmemchr() - メモリ配列内のワイドキャラクタを検索します。
● wmemcmp() - メモリ内のワイドキャラクタを比較します。
● wmemcpy() - メモリ内にワイドキャラクタをコピーします。
● wmemmove() - メモリ内の重複する領域にワイドキャラクタをコピーします。
● wmemset() - メモリ内にワイドキャラクタを設定します。
変更された UNIX 98 API
以下の API は動作またはパラメータ型が変更されているため、既存の HP-UX コードを UNIX 98 動作に変更した場合
に、影響が生じる可能性があります。
● fprintf、printf、snprintf、sprintf、fscanf、scanf、sscanf() - ワイドキャラクタ変換を選択するための新しい l (エル) 修
飾子がサポートされています。入力ストリームから取得したデータが有効なワイドキャラクタを形成しない場合
●
●
●
は、errno に EILSEQ が設定されます。
fputwc、putwc、putwchar() - 最初の引き数の型が wint_t から wchar_t に変更されています。
freopen() - ストリームの入出力単位がクリアされ、関連する mbstate_t オブジェクトは初期変換状態を表すように設
定されます。
wcschr、wcsrchr() - 2 番目の引き数の型が wint_t から wchar_t に変更されています。
ネットワーク機能
次に、HP-UX と Linux のネットワーク機能の違いについて説明します。 「エンディアン」の項も参照してください。
ソケットの選択
HP-UX では 2 種類のソケット、つまりlibc内の BSD 4.2 スタイルのソケットと、libxnet内の UNIX95/98 スタイルのソ
ケットがサポートされています。Linux のソケットは UNIX98 スタイルであるため、移行時の負荷を軽くするに
は、HP-UX でも UNIX95/98 スタイルのソケットを使用してください。ただし、Linux では socklen_t が int 型に typedef 宣
言されるのに対し、HP-UX では size_t 型に typedef 宣言されるため、この場合もなんらかの調整が必要になる可能性があ
ります。"len" オブジェクトが定義されている箇所では、socklen_t が使われていることに注意してください。以下に使用
例を示します。
HP-UX で UNIX95/98 スタイルのソケットを使用するには、リンク行に libxnet ライブラリを追加する必要があります。
また_XOPEN_SOURCE マクロを定義し、_XOPEN_SOURCE_EXTENDED マクロに 1 を定義しなければなりません。詳細
は HP-UX のマンページ xopen_networking(7) を参照してください。
accept()
HP-UX BSD 4.2 ソケット
int accept(int s, void *addr, int *addrlen);
HP-UX UNIX95
int accept(int s, struct sockaddr *addr,
size_t *addrlen);
HP-UX UNIX98
int accept(int s, struct sockaddr *addr,
socklen_t *addrlen);
Linux UNIX98
int accept(int s, struct sockaddr *addr,
socklen_t *addrlen);
ソケットタイプ
SOCK_STREAM と SOCK_DGRAM
HP-UX では、ストリームソケットとデータグラムソケットがサポートされています。
SOCK_RAW
通常 raw ソケットは、トランスポート層、TCP、UDP などをバイパスして、ネットワークとの間で IP パケットを直接送
受信するために使用されます。
一般的なネットワークアプリケーションでは raw ソケットではなく、ストリームソケットまたはデータグラムソケット
が使用されます。raw ソケットを使用するアプリケーションの代表例は、ping、arp、traceroute、route デーモンなどの
ネットワークユーティリティです。
raw ソケットインタフェースはネットワークセキュリティを脅かす可能性があるため、HP-UX はこのインタフェースを
正式にはサポートしていません。raw ソケットアプリケーションの動作に問題があると、ネットワークに甚大な被害を及
ぼすおそれがあります。ただし実際には raw ソケットインタフェースは、HP-UX 内に存在しています。このインタ
フェースを使用するには、有効なユーザー ID がスーパーユーザーでなければなりません。
その他のソケットタイプ
HP-UX では SOCK_RDM、SOCK_SEQPACKET、および SOCK_PACKET はサポートされていません。
プロトコルファミリ
PF_UNIX、PF_INET
これらのプロトコルはコア HP-UX 内でサポートされています。
PF_LOCAL
このプロトコルは PF_UNIX と同じものですが、PF_LOCAL 定義は HP-UX のヘッダファイルに追加されていませ
ん。そのため現時点では各自のソースファイル内で、これを PF_UNIX に typedef する必要があります。
PF_INET6
IPv6 プロトコルは、開発者キットの形でのみ提供されています。開発者キットは、http://www.software.hp.comから
ダウンロード可能です。HP-UX 11i よりも後の将来のリリースでは、このプロトコルはコア HP-UX に含まれる予
定です。
PF_X25
このプロトコルは X25/9000 製品の一部として提供されています。
その他のプロトコルファミリ
HP-UX 上では PF_IPX、PF_NETLINK、PF_AX25、PF_ATMPVC、PF_APPLETALK、および PF_PACKET はサポー
トされていません。
API
recv、recvfrom、recvmsg、send、sendto、sendmsg
フラグパラメータ
HP-UX では、フラグパラメータ内の以下のフラグはサポートされていません。
MSG_NOSIGNAL
MSG_ERRQUEUE
MSG_DONTROUTE
MSG_DONTWAIT
MSG_FIN
MSG_SYN
MSG_RST
MSG_PROXY
MSG_EOR
補助的データオブジェクト
ソケットアプリケーションと補助データをサポートするプロトコルスタック間の追加情報の受け渡しには、補助データ
バッファが使用されます。補助データバッファへのポインタには、msghdr 構造体内の msg_control が使用されます。
補助データバッファに格納される次の補助的なデータオブジェクトは、サポートされていません。
SCM_CREDENTIALS
__SCM_CONNECT
ソケットオプション
HP-UX では、以下のソケットオプションはサポートされていません。
ソケットレベルのオプション
SO_PASSCRED
SO_PEERCRED
SO_BINDTODEVICE
SO_PRIORITY
TCP レベルのオプション
TCP_CORK
IP レベルのオプション
IP_PKTINFO
IP_RECVTOS
IP_RECVTTL
IP_RECVOPTS
IP_RETOPTS
IP_RECVERR
IP_PMTU_DISCOVER
IP_MTU
IP_ROUTER_ALERT
Ioctl
HP-UX では、TIOCOUTQはサポートされていません。
sendfile()
sendfile() は移植性のないインタフェースで、バージョンの異なる Unix では、構文もセマンティクスも異なっていま
す。HP-UX バージョンの sendfile() は、ソケットインタフェースを通して行うネットワークを介したファイル送信に最大
限の性能を発揮できるように設計されています。一方 Linux のsendfile() はより広範囲をカバーしており、ターゲット
ファイル記述子はソケットに限定されていません。ただし、そのためソケットを使用する場合の性能は多少劣ります。
ソケットに対してsendfile() を使用している場合は、HP-UX における sendfile() 構文の違いに対応する以上の修正はほとん
ど必要ありません。またヘッダー情報やトレーラ情報も送信している場合は、HP-UX の sendfile() では性能を向上するた
めに、ポインタ引き数であるhdtrl ポインタを使用できます。
その他のタイプのファイル記述子についてsendfile() を使用している場合は、通常のread() 関数やwrite() 関数を使用して、
代替関数を記述する必要があります。
Linux の場合:
#include <unistd.h>
int sendfile(int out_fd, int in_fd,
off_t *offset, size_t count);
HP-UX の場合:
#include <sys/socket.h>
ssize_t sendfile(int s, int fd, off_t offset,
size_t nbytes, const struct iovec *hdtrl,
int flags);
select(2)
HP-UX と Linux では、 select() のセマンティクスにも違いがあります。Linux ではselect() からの復帰時に、スリープして
いない時間を反映して timeout が修正されます。一方 HP-UX では、その他ほとんどの Unix 実装の場合と同様
に、timeout は修正されません。移植性を実現するにはselect() からの復帰後は、timeout は未定義であると想定する必要が
あります。
Linux の場合:
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int n, fd_set *readfds,
fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout);
HP-UX の場合:
#include <sys/time.h>
int select(int nfds, fd_set *readfds,
fd_set *writefds, fd_set *errorfds,
struct timeval *timeout);
IPv6
HP-UX では、IPv6 API は、開発者キットの形でのみ提供されています。 "IPv6 Developer's Kit バージョン 1.1"
は、http://www.software.hp.comからダウンロード可能です。HP-UX 11i よりも後の将来のリリースでは、IPv6 はコア
HP-UX 内でサポートされる予定です。IPv6 API には以下のものが含まれています。
gethostbyname2
if_freenameindex
if_nametoindex
if_indextoname
if_nameindex
inet_ntop
inet_pton
inet_ntopとinet_ptonは、HP-UX 11i バージョン 1.5 でサポートされています。
RPC と XDR
RPC 関数と XDR 関数は、Linux と HP-UX で互換性があります。
ネットワークホストエントリ
ネットワークホストエントリを取得/設定するためのendaliasent() API とsetaliasent() API は、HP-UX 11.x のいずれのバー
ジョンにもありません。これらのホストエントリのライブラリルーチンは、名前サービススイッチを内部的にコールす
ることにより、/etc/nsswitch.conf ファイル内に構成されている "hosts" データベース検索ポリシーにアクセスします。
解決策としてはgethostent() およびsenthostent() を使用します。Linux の場合と同様に、endaliasent() はgethostent() 用のマク
ロ、setaliasent() はsenthostent() 用のマクロです。
エンディアン
各コンピュータアーキテクチャは、バイトのアドレス指定順序がそれぞれ異なっています。ビッグエンディアン アーキ
テクチャでは、最上位のバイトが先頭にアドレス指定され、一方リトルエンディアン アーキテクチャでは、最下位のバ
イトが先頭にアドレス指定されます。Linux はリトルエンディアン、HP-UX はビッグエンディアンのオペレーティング
システムです。そのため、Linux から HP-UX に移植するソフトウェアは、エンディアンクリーンである必要がありま
す。
ビッグエンディアン (BE)
最上位
の
バイト
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
再下位
の
バイト
.
.
.
.
.
.
.
.
.
最上位
の
バイト
リトルエンディアン (LE)
再下位
の
バイト
.
.
.
.
.
.
潜在的なソースコード内の問題点
アプリケーション内では、どのデータ構造体がネットワーク順で、どのデータ構造体がホスト順であるかに注意する必
要があります。ネットワーク順は BE です。
long 型とポインタのサイズは 64 ビット長に拡張されているため、int 型、long 型、およびポインタを含む共用体について
は、データの整列形式が適正かどうかを確認する必要があります。必要に応じて、int 型および long 型は int32_t 型に変
換してください。
例 1: 共用体
システムがビッグエンディアンかリトルエンディアンかの確認に、共用体が使用される場合があります。この場合は、
共用体を使用して予想されるビット順をチェックします。次の例は、共用体を使用するアプリケーションの実行結果
が、ビッグエンディアンの場合とリトルエンディアンの場合で異なる可能性があることを示したものです。この例は、n
と s のサイズが等しい場合にのみ機能します。
union {
int32_t n;
char s[4];
} endian;
/*
* hex
* b =
* i =
* g =
* 0=
*/
values for "big"
0x62
0x69
0x67
0x00
#define BIG_ENDIAN 0x62696700
endian.s[0]
endian.s[1]
endian.s[2]
endian.s[3]
=
=
=
=
'b';
'i';
'g';
' 0';
if (endian.n == BIG_ENDIAN) {
/* big endian */
} else {
/* little endian */
}
例 2: キャストのトリック
次の文では、char の範囲が 0 ∼ 127 であるため、128 による有効な剰余演算を実行することを目的としています。ただ
し、このコードでは最低位のアドレスに最下位バイトが入っていると想定しているため、リトルエンディアン アーキテ
クチャ上でしか正しく機能しません。ビッグエンディアン アーキテクチャ上では、最高位バイトをアドレス指定するこ
とになるため、結果は常に 0 になります。
int result;
result = *(char *)&result;
これを移植可能なコードに変更するには、マスクを使用して目的の結果を得るようにします。
#define CHAR_MASK 0x7F
result = result & CHAR_MASK;
BE と LE 間のデータ相互運用性
ネットワーク機能、テキストファイル、および一般的なプロセス間制御 (IPC) 機能を介して BE と LE 間でテキストデー
タを共有する場合は、特に問題はありません。ただし、バイナリデータを共有するアプリケーション同士は、データの
エンディアン (BE/LE) やデータモデル (32/64 ビット) をはじめとする一般/正規化形式が一致していなければなりませ
ん。
グラフィックス/GUI
注記: HP-UX 11i バージョン 1.5 はローカルグラフィックスをサポートしていませんが、ネットワークプロトコルを介し
てリモートグラフィックスデバイスに表示することは可能です。
Mesa
移植するアプリケーションで 3-D グラフィックス Mesa パッケージを使用している場合は、HP-UX に移植済みの同パッ
ケージを、HP-UX Porting and Archive Centre ( http://hpux.cae.wisc.edu) からダウンロードしてください。また HP が提供す
る、標準に完全に準拠した、この製品のサポート対象バージョンを使用するには、Mesa の代わりに OpenGL を、lesstiff
の代わりに Motif を使用してください。
LessTif
移植するアプリケーションで、OSF/Motif® 1.2 とソース互換性がある、LessTif フリーウェアLGPLバージョンの
OSF/Motif®を使用している場合は、HP-UX に移植済みの同パッケージを HP-UX Porting and Archive Centre
(http://hpux.cae.wisc.edu) からダウンロードしてください。また HP が提供する、標準に完全に準拠した、この製品のサ
ポート対象バージョンを使用するには、LessTif の代わりに HP-UX Motif を使用してください。 注記: OpenGroup は
OpenMotif のソースを公開しています。
curse
HP-UX 上の curse ライブラリの名前は libxcursesであるのに対し、Linux 上の同ライブラリ名はlibncursesです。libncurses
は Linux 移植キットに含まれており、HP-UX Porting and Archive Centre ( http://hpux.cae.wisc.edu) からも入手可能です。ま
た標準に完全に準拠した、この製品の HP-UX サポート対象バージョンを使用するには、HP-UX 上では libxcursesを使用
してください。
以下の項では、libncurses と HP-UX libxcurses の違いについて説明します。
デバッグ API
デバッグルーチンは Linux のlibncurses_g.a に含まれています。ncurses に含まれているデバッグ関連 API のうち、HP-UX
libxcurses に含まれていないものは、以下のとおりです。
_nc_tracebits
_traceattr
_traceattr2
_tracechar
_tracechtype
_tracechtype2
_tracedump
_tracef
_tracemouse
trace
マウス関連 API
ここではマウス関連 API の相違点について説明します。同等の API は libxcurses にも存在しますが、これらはマンページ
には記載されておらず、またプロトタイプも curses.h 内に定義されていません。ただしこれらの API 用のプロトタイプ
は、/usr/include/curses_colr/curses.h内に定義されています。
マウス関連 API
Linux
HP-UX
getmouse
getmouse
mouse_trafo
getbmap
mouseinterval
map_button
mousemask
mouse_on
ungetmouse
mouse_off
wmouse_trafo
mouse_set
--
request_mouse_pos
--
wmouse_position
カーソル関連 API
以下のカーソル関連 API については、libxcurses 内にほぼ一致する API が存在しています。
カーソル関連 API
Linux
HP-UX
getbegyx
__getbegx
getmaxyx
__getbegy
getparyx
__getcurx
getyx
__getcury
--
__getmaxx
--
__getmaxy
--
__getparx
--
__getpary
--
__getsyx
その他の API
以下の API については、HP-UX libxcurses 内に対応する API がありません。
define_key
has_key
keyok
mcprint
resizeterm
use_default_colors
wenclose
wresize
コマンド
Linux 上のコマンドセットは、標準に指定されている以外にさまざまな有用な機能で拡張されています。またコマンドオ
プションはしばしば、1 文字の短いフラグと、内容がわかりやすいフルワードフラグの両方の形で提供されます。これら
は Linux 固有の機能であり、HP-UX 上にはありません。シェルスクリプトや実行可能ファイルファイル内のコマンド実
行個所 (system()、exec*()、fork() ) がこれらの Linux 拡張機能に依存している場合は、コードの変更が必要です。
HP-UX 向けの追加のオープンソースコマンドおよびユーティリティは、HP-UX Porting and Archive Center
(http://hpux.cae.wisc.edu) からダウンロード可能です。
国際化
ロケールファイルには、言語、地域、およびコードセットに固有な情報 (照合/並べ替え順序や日時仕様など) が含まれて
います。Linux および HP-UX のロケール名は、いずれも ISO の標準ロケール名形式である LL_TT.codeset に準拠してお
り、LL 部分は 2 文字で言語、TT 部分は 2 文字で地域を表します。ただし、それぞれのシステムで使用可能なロケール
やロケールの内容は異なっています。プラットフォーム上にインストールされているすべてのロケールを調べるには、
次のコマンドを実行してください。
locale -a
Linux 上では、ロケール名用のデコーダは/usr/share/locale/locale.alias 内にあります。一方 HP-UX 上では、デコーダファ
イルは/usr/lib/nls/config 内にあります。これを基に両者の対応付けを行うと、HP-UX 上にある類似したロケールを調べ
ることができます。Linux の場合と同様の動作を HP-UX 上でも実現するには、新しいロケールの作成または既存ロケー
ルの変更が必要になる場合もあります。詳細についてはlocaledef(1M)、および/usr/lib/nls/loc/src 内の HP-UX
locale/charmap ソースを参照してください。
Linux および HP-UX は、いずれも UTF-8、ISO 8859/15 および UTF-8 のユーロ通貨、および ISO 8859*コードセットを
サポートしています。
その他
ユーザー特権
setegid()
setegid() は、現在のプロセスの実効グループ ID を設定します。Linux 移植キット内の Linux 互換 API ライブラリであ
るlibhplxが提供するsetegid() API のセマンティクスは Linux 実装と多少異なっており、libhplx実装の場合は実効グループ
ID のみが設定され、Linux の場合のような保存グループ ID の設定は行われません。
getresuid()、getresgid()
実ユーザー ID/実効ユーザー ID を設定または取得するための次の API は、HP-UX 11i バージョン 1.5 (IPF) および 11i
(PA) 上では使用できますが、HP-UX 11.0 上では使用できません。
getresuid()、getresgid()
解決策として、11.0 ではこの機能を次のような形で実装してください。
/* macro to check the field we want is valid */
#define PST_STATUS_CONTAINS_FIELD(_field)
(offsetof(struct pst_status, _field) <=
offsetof(struct pst_status, pst_text_size))
int getresuid (uid_t *, uid_t *, uid_t *);
int getresgid (gid_t *, gid_t *, gid_t *);
int
getresuid(uid_t *ruid, uid_t *euid, uid_t *suid)
{
struct pst_status pst;
size_t offset = offsetof(struct pst_status,
pst_text_size);
int proc = (int)getpid();
/* save in case we need to fix up later */
int save_errno = errno;
if (pstat_getproc(&pst, offset, (size_t)0, proc)
!= -1) {
/* IMPORTANT ! */
assert(PST_STATUS_CONTAINS_FIELD(pst_uid));
*ruid = pst.pst_uid;
assert(PST_STATUS_CONTAINS_FIELD(pst_euid));
*euid = pst.pst_euid;
assert(PST_STATUS_CONTAINS_FIELD(pst_suid));
*suid = pst.pst_suid;
return 0;
} else {
/* set the bits we don't care about */
assert(PST_STATUS_CONTAINS_FIELD(pst_valid));
pst.pst_valid = pst.pst_valid │ PST_ADDR │
PST_WCHAN │ PST_MAXRSS;
if (pst.pst_valid == -1) { /* bad return? */
perror("getresuid");
return -1;
/* yes, report error */
} else {
/* get rid of EOVERFLOW */
errno = save_errno;
assert(PST_STATUS_CONTAINS_FIELD(pst_uid));
*ruid = pst.pst_uid;
assert(PST_STATUS_CONTAINS_FIELD(pst_euid));
*euid = pst.pst_euid;
assert(PST_STATUS_CONTAINS_FIELD(pst_suid));
*suid = pst.pst_suid;
return 0;
}
}
}
int
getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid)
{
struct pst_status pst;
size_t offset = offsetof(struct pst_status,
pst_text_size);
int proc = (int)getpid();
/* save in case we need to fix up later */
int save_errno = errno;
if (pstat_getproc(&pst, offset, (size_t)0, proc)
!= -1) {
assert(PST_STATUS_CONTAINS_FIELD(pst_gid));
*rgid = pst.pst_gid;
assert(PST_STATUS_CONTAINS_FIELD(pst_egid));
*egid = pst.pst_egid;
assert(PST_STATUS_CONTAINS_FIELD(pst_sgid));
*sgid = pst.pst_sgid;
return 0;
} else {
/* set the bits we don't care about */
assert(PST_STATUS_CONTAINS_FIELD(pst_valid));
pst.pst_valid = pst.pst_valid │ PST_ADDR │
PST_WCHAN │ PST_MAXRSS;
if (pst.pst_valid == -1) { /* bad return? */
perror("getresgid");
return -1;
/* yes, report error */
} else {
/* get rid of EOVERFLOW */
errno = save_errno;
assert(PST_STATUS_CONTAINS_FIELD(pst_gid));
*rgid = pst.pst_gid;
assert(PST_STATUS_CONTAINS_FIELD(pst_egid));
*egid = pst.pst_egid;
assert(PST_STATUS_CONTAINS_FIELD(pst_sgid));
*sgid = pst.pst_sgid;
return 0;
}
}
}
パッケージング
rpm (Red Hat Package Manager) は広く使われている強力なパッケージマネージャで、個々のソフトウェアパッケージのビ
ルド、インストール、照会、検証、更新、アンインストールなどに使用できます。一般にrpm はオープンソースや Linux
アプリケーションで使用されますが、その他多くのプラットフォームにも移植されており、HP-UX 対応バージョンも
HP-UX Porting and Archive Centre ( http://hpux.cae.wisc.edu) から入手可能です。
Software Distributor (SD) は、HP-UX 上で使用されるパッケージマネージャです。詳細については、 swinstall(1M) を参照
してください。
プログラムの終了
HP-UX 上では on_exit() はサポートされておらず、atexit() が同等の機能を提供します。指定時の書式は、int atexit
(void(*func)(void)) です。このatexit() API は、プログラムの正常終了時にコールされる関数としてfuncを登録します。ここ
でfuncには引き数はありません。atexit() の戻り値は成功した場合が 0、funcを登録できなかった場合は 0 以外の値になり
ます。
バイナリツリーの管理
バイナリツリー管理 API については、Linux と HP-UX でいずれも事実上同等のシグネチャが使用されます。
HP-UX 上の API シグネチャは次のとおりです。
extern void twalk(const void *,
void(*action)(const void *, VISIT, int));
extern void *tsearch(const void *, void **,
int(*compar)(const void *, const void *));
extern void *tfind(const void *key, void * const *,
int(*compar)(const void *,
const void *));
extern void *tdelete(const void *, void **,
int(*compar)(const void *,
const void *));
LINUX 上の API シグネチャは次のとおりです。
extern void *tsearch __PMT ((__const void *__key,
void **__rootp,
__compar_fn_t __compar));
extern void *tfind __PMT ((__const void *__key,
void *__const *__rootp, __compar_fn_t __compar));
extern void *tdelete __PMT ((__const void *__key,
void **__rootp,
__compar_fn_t__compar));
extern void twalk __PMT ((__const void *__root,
__action_fn_t __action));
一見すると HP では 4 個/3 個のパラメータがあるのに対し、Linux では 3 個/2 個のパラメータしかないように見えます
が、実際には__compare_fn_tは
typedef int (*__compar_fn_t) __PMT ((__const __ptr_t,
__const__ptr_t));
と typedef 宣言されたものであるため、シグネチャは同一であることがわかります。
HP-UX から Linux への移植
HP-UX から Linux への移植に関する情報は、本ドキュメントの各所で述べられていますが、特に重要な点を次に示しま
す。
● Linux には、nlist()、pstat() はありません。
● 一部のコマンドに対する引き数が異なっています (mkfs、ping など)。
● remsh と rsh、bash と sh-posix の違いに注意が必要です。
● Linux 上では、ディスクの raw デバイス名とブロックデバイス名という考え方はなく、ディスク (すべてのデバイ
ス) の命名方式が異なります。
● Linux は NULL ポインタのディリファレンスに厳格ですが、HP-UX では一定範囲内で許容されます。
ストリーム
ストリームは HP-UX から Linux への移植時に、問題となる点の一つです。Linux では、System V Release 4 Streams や
Streams/UX はサポートされていません。この中にはgetmsg()、getpmsg()、fattach()、fdetach()、isastream()、ioctl() I_* フラ
グ、putmsg()、putpmsg() などが含まれています。
その他の情報
HP-UX 向けの移植およびアプリケーション開発の詳細については、Developer's Resource Portal: http://devresource.hp.com
をご覧ください。
Linux 移植キットについてのフィードバック、HP-UX 向けオープンソース パッケージに対する追加リクエスト、実際の
移植体験などを、[email protected] までぜひお寄せください。恐れ入りますが英語でお願いいたします。
付録 a: 用語集
API
Application Programming Interface の略。システムまたは製品インタフェースが提供する一連のサービスについての
ソースレベルの仕様です。これらのサービスは、その使用方法が文書化されています。サービスの具体例として
は、プロシージャコール、ヘッダファイル内に定義されている内容 (グローバル変数、記号定数など)、コマンド構
文と出力形式、ファイル形式、環境変数設定、システム構成パラメータ、ファイルシステム レイアウト、言語構文
などが挙げられます。
autoconf
autoconf は、ソフトウェアのソースコードパッケージを自動的に構成するシェルスクリプトを生成するための、拡
張可能パッケージです。詳細は http://www.gnu.org/software/autoconf/ を参照してください。
GNU
GNU は、GNU's Not Unix (GNU は Unix ではない) の略で、略語の展開形に略語自身が含まれる形になっています。
詳細は Web サイト http://www.gnu.org/ を参照してください。
GNU コンパイラツール群
バイナリ生成に使用される各種 GNU ツールの集まりであり、コンパイラ、アセンブラ、make、デバッガなどを含
みます。
HP-UX コンパイラツール群
バイナリ生成に使用される各種 HP-UX ツールの集まりであり、コンパイラ、アセンブラ、make、デバッガなどを
含みます。
ILP32
データモデルの 1 つで、int型、long型、およびポインタは 32 ビット長になります。
LP64
データモデルの 1 つで、long型、ポインタは 64 ビット長になります。
LGPL
GNU Lesser General Public License の略。GNU Library General Public License の後継にあたり、ソースの使用、配布、
および変更の自由を定義したものです。
OS
HP-UX や Linux などのオペレーティングシステムです。
オープンソース
オープンソースとは、自由な再配布およびソースコードの使用を許可する GNU General Public Licence GPL などの
法的ライセンスの下で配布されるソフトウェアです。定義の詳細については、Web サイ
トhttp://www.opensource.org/osd...html を参照してください。
フリーソフトウェア
フリーソフトウェアとは、ユーザーによる実行、コピー、配布、研究、変更、および改良の自由が認められている
ソフトウェアを指します。詳細はGNU定義http://www.gnu.org/philosophy/free-sw.html を参照してください。
付録 b: オープンソース開発者ツールキット
ソフトウェア開発
GNUPro
GCC
binutils
gdb
gmake 3.78.1
ncurses 5.1
autoconf 2.13
automake 1.4
ddd 3.2
dejagnu 20000714
diffutils 2.7
expect 5.32.1
gettext 0.10.35
imake R6.3
patch 2.5.4
readline 4.1
lclint 2.5m
プログラミング言語
Bison 1.28
Flex 2.5.4a
Perl 5.005_03
Python 1.6
TCL 8.2.3
gawk 3.0.4
m4 1.4
sed 3.02
マルチメディア
Tk 8.2.3
libgd 1.7.3
libpng 1.0.5
zlib 1.1.3
GTK+ 1.2.6
GhostScript 5.10
Xaw3d 1.5
enscript 1.6.1
glib 1.2.6
gv 3.5.8
jpeg 6b
libtiff 3.5.4
xpm 3.4
生産性向上のためのツール
Xemacs 21.1.8
bash 2.04
emacs 20.7
less 340
tcsh 6.09
texinfo 4.0
vim 5.7
XML
Xalan 0.40.0
Xerces 1.2.0a
市販製品
Motif Dev Kit (Xaw & Xmu) 11.00 AR
crt0.o 11.00 AR
その他
grep 2.4.2
gzip 1.2.4a
tar 1.13
bzip2 1.0.0
fileutils 4.0
tcp_wrappers 7.6
unzip 5.40
zip 2.3
GDBM 1.8.2
textutils 2.0
付録 c: libhplx 内の Linux 互換 API
argp_error
argp_failure
argp_fmtstream_free
argp_fmtstream_point
argp_fmtstream_printf
argp_fmtstream_putc
argp_fmtstream_puts
argp_fmtstream_set_lmargin
argp_fmtstream_set_rmargin
argp_fmtstream_set_wmargin
argp_fmtstream_write
argp_help
argp_make_fmtstream
argp_parse
argp_state_help
argp_usage
argz_add
argz_add_sep
argz_append
argz_count
argz_create
argz_create_sep
argz_delete
argz_extract
argz_insert
argz_next
argz_replace
argz_stringify
asprintf
atoll
bindtextdomain
canonicalize_file_name
cfmakeraw
cfsetspeed
chflags
copysignl (この API は HP-UX 11.00 および 11i でのみ利用可能)
daemon
dcgettext
dgettext
dirfd
dprintf
dysize
endttyent
envz_add
envz_entry
envz_get
envz_merge
envz_remove
envz_strip
err
error
error_at_line
errx
ether_aton
ether_aton_r
ether_line
ether_ntoa
ether_ntoa_r
euidaccess
fchflags
fcloseall
fexecve
ffsl
ffsll
finitef
frexpf (この API は HP-UX 11.00 および 11i でのみ利用可能)
fts_children
fts_close
fts_open
fts_read
fts_set
gai_strerror
getdelim
getline
getopt_long
getopt_long_only
getpt
gettext
getttyent
getttynam
glob_pattern_p
group_member
hstrerror
imaxabs
imaxdiv
inet_nsap_addr
inet_nsap_ntoa
iruserok
isfdtype
isinff
isnanf
isnanl
ldexpf (この API は HP-UX 11.00 および 11i でのみ利用可能)
llabs
lldiv
malloc_get_state
malloc_set_state
malloc_stats
malloc_trim
mcheck
memmem
mempcpy
modff (この API は HP-UX 11.00 および 11i でのみ利用可能)
mprobe
mtrace
muntrace
obstack_free
pselect
psignal
ptmalloc_init
pvalloc
qecvt
qecvt_r
qfcvt
qfcvt_r
qgcvt
rawmemchr
revoke
scalbln (この API は HP-UX 11.00 および 11i でのみ利用可能)
scalblnf (この API は HP-UX 11.00 および 11i でのみ利用可能)
scalbnf (この API は HP-UX 11.00 および 11i でのみ利用可能)
setbuffer
setenv
setlinebuf
setlogin
setttyent
sigandset
sigisemptyset
sigorset
stpcpy
stpncpy
strcasestr
strchrnul
strfry
strndup
strnlen
strsep
strsignal
strtof (この API は HP-UX 11.00 および 11i でのみ利用可能)
strtoll
strtoq (この API は HP-UX 11.00 および 11i でのみ利用可能)
strtoull
strtouq
strverscmp
sysv_signal
tdestroy
textdomain
timegm
timelocal
tr_break
unsetenv
vasprintf
vdprintf
verr
verrx
versionsort
vlimit
vsyslog
vtimes
vwarn
vwarnx
warn
warnx
wcpcpy
wcpncpy
wcscasecmp
wcsdup
wcsncasecmp
wcsnlen
wcstof
wcstoll
wcstoq
wcstoull
wcstouq
付録 d: Linux 移植キットの使用許諾条件
licensing and warranty information for hp software
ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE HP SOFTWARE WARRANTY STATEMENT AND THE HP
SOFTWARE LICENSE TERMS SET FORTH BELOW. BY DOWNLOADING AND INSTALLING THE SOFTWARE, YOU ARE
AGREEING TO BE BOUND BY THESE TERMS. IF YOU DO NOT AGREE TO ALL OF THESE TERMS, DO NOT
DOWNLOAD AND INSTALL THE SOFTWARE ON YOUR SYSTEM.
DISCLAIMER. TO THE EXTENT ALLOWED BY LOCAL LAW, THIS SOFTWARE ("SOFTWARE") IS PROVIDED TO
YOU "AS IS" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, WHETHER ORAL OR WRITTEN, EXPRESS OR
IMPLIED. HP SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OR CONDITIONS OF MERCHANTABILITY,
SATISFACTORY QUALITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. Some countries, states
and provinces do not allow exclusions of implied warranties or conditions, so the above exclusion may not apply to you. You may
have other rights that vary from country to country, state to state, or province to province.
LIMITATION OF LIABILITY. EXCEPT TO THE EXTENT PROHIBITED BY LOCAL LAW, IN NO EVENT WILL HP OR
ITS SUBSIDIARIES, AFFILIATES OR SUPPLIERS BE LIABLE FOR DIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL
OR OTHER DAMAGES (INCLUDING LOST PROFIT, LOST DATA, OR DOWNTIME COSTS), ARISING OUTOF THE USE,
INABILITY TO USE, OR THE RESULTS OF USE OF THE SOFTWARE, WHETHER BASED IN WARRANTY, CONTRACT,
TORT OR OTHER LEGAL THEORY, AND WHETHER OR NOT ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Your use of the Software is entirely at your own risk. Should the Software prove defective, you assume the entire cost of all s ervice,
repair or correction.
Some countries, states and provinces do not allow the exclusion or limitation of liability for incidenta
l or
consequential damages, so the above limitation may not apply to you.
NOTE. EXCEPT TO THE EXTENT ALLOWED BY LOCAL LAW, THESE WARRANTY TERMS DO NOT EXCLUDE,
RESTRICT OR MODIFY, AND ARE IN ADDITION TO, THE MANDATORY STATUTORY RIGHTS APPLICABLE TO THE
LICENSE OF THE SOFTWARE TO YOU.
licensing and warranty information for Open Source software
All of the Open Source Tools on CD2 of the Linux Porting Kit have existing license and warranty agreements. Use of the software is
bound by each particular agreement. The license for each tool is included with the source for each tool in the /SD_CDROM/src
directory.
The following warranty is provided for vim and unzip:
ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE HP SOFTWARE WARRANTY STATEMENT SET FORTH
BELOW. BY DOWNLOADING AND INSTALLING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THESE
TERMS. IF YOU DO NOT AGREE TO ALL OF THESE TERMS, DO NOT DOWNLOAD AND INSTALL THE SOFTWARE
ON YOUR SYSTEM.
GNU Lesser General Public License
●
●
●
See http://www.gnu.org/philosophy/why-not-lgpl.html to learn "Why you shouldn't use the Lesser GPL for your next library"
See http://www.gnu.org/copyleft/gpl-violation.html to find out "What to do if you see a possible LGPL violation"
The GNU Lesser General Public License as a textfile is available at http://www.gnu.org/copyleft/lesser.txt
This GNU Lesser General Public License counts as the successor of the GNU Library General Public License. For an explaination of
why this change was necessary, read the article at http://www.gnu.org/philosophy/why-not-lgpl.html"Why you shouldn't use the
Library GPL for your next library".
table of contents
GNU LESSER GENERAL PUBLIC LICENSE
Preamble
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
How to Apply These Terms to Your New Libraries
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim
copies of this license document, but changing it is
not allowed.
[This is the first released version of the Lesser GPL.
It also counts as the successor of the GNU Library
Public License, version 2, hence the version number
2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about
whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the
explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure
that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code
or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that
you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them with the library after making changes to the library and
recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified
by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's
reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any
patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These
disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides
advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it
becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a
free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free lib rary to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large bo dy of
free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole
GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter
must be combined with the library in order to run.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation
is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code
means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control
compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work
based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library
does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all
the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for
a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed
the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties
under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied
by an application program that uses the facility, other than as an argument passed when
the facility is invoked, then you must make a good faith effort to ensure that, in the event
an application does not supply such function or table, the facility still operates, and
performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely
well-defined independent of the application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must be optional: if the
application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that
work are not derived from the Library, and can be reasonably considered independent and
separate works in themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you distribute the same
sections as part of a whole which is a work based on the Library, the distribution of the
whole must be on the terms of this License, whose permissions for other licensees extend
to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work
written entirely by you; rather, the intent is to exercise the right to control the distribution
of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library
(or with a work based on the Library) on a volume of a storage or distribution medium
does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library.
To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License,
version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared,
then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under
the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code,
which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to
copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore
falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered
by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include
the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must
do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code
for the Library including whatever changes were used in the work (which must be
distributed under Sections 1 and 2 above); and, if the work is an executable linked with the
Library, with the complete machine-readable "work that uses the Library", as object code
and/or source code, so that the user can modify the Library and then relink to produce a
modified executable containing the modified Library. (It is understood that the user who
changes the contents of definitions files in the Library will not necessarily be able to
recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable
mechanism is one that (1) uses at run time a copy of the library already present on the
user's computer system, rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if the user installs one, as long
as the modified version is interface-compatible with the version that the work was made
with.
c) Accompany the work with a written offer, valid for at least three years, to give the same
user the materials specified in Subsection 6a, above, for a charge no more than the cost of
performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place,
offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have
already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system
on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany
the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other libr ary
facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based
on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library,
uncombined with any other library facilities. This must be distributed under the terms of
the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work
based on the Library, and explaining where to find the accompanying uncombined form of
the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights
under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any
further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third
parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do
not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly throu gh you,
then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended
to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented
by public license practices. Many people have made generous contributions to the wide range of software distributed through that
system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute
software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it
and "any later version", you have the option of following the terms and conditions either of that version or of any later version
published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version
ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free
status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE
EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT
HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED
ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT
NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
--END OF TERMS AND CONDITIONS--
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software
that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the
terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most
effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full
notice is found.
one line to give the library's name
and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute
it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free
Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser
General Public License along with this library;
if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the
library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright
interest in the library `Frob' (a library for tweaking
knobs) written by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
GNU's home page is at http://www.gnu.org/home.html.
Direct FSF & GNU inquiries & questions to [email protected].
See http://www.gnu.org/home.html#ContactInfo for ways to contact the FSF.
Copyright notice above.
Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111, USA
Updated:18 Jun 2000 mhatta