2013-09-19

LGPLに対する動的リンクの誤解

Categories: オープンソース
lgpl-free-license.png

[ PR ]


(注意:バージョンにより違いがあるため、必ずご自身でLGPLをお読みください。)

LGPLに関する噂

LGPLライブラリとアプリケーションの配布について、例えばGoogle検索すると様々な意見がヒットします。

  • 動的リンクすればLGPLに従う必要はない
  • 動的リンクであれば、リバースエンジニアリングを禁止してもよい
  • 動的リンクであれば、アプリケーションと一緒にLGPLライブラリを配布しても何も問題ない

しかし、それらの意見の多くが根拠のない、意見だけを述べたものになっています。実際はどうなのか、調べてみました。

検証

このような噂が本当かどうか、検証してみることにしました。

これらに関する根拠の多くは、LGPLv2:第6条(b)や、LGPLv3:第4条(d)(1)に書かれています。

リバースエンジニアリングの許可

LGPLv2.1によると(今後LGPLv2.1で説明を進めます)、

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.

とあります。つまり第6条はそれまでの規定の例外であり、以下の選択肢のいずれか1つに準拠すれば、"LGPLライブラリを使用しているアプリケーション"は、自由なライセンスで配布できるということになります。ただし、顧客自身のためのアプリケーションの改変や、そのためのリバースエンジニアリングを許可しなければならないという規定があります。

つまり、リバースエンジニアリングは禁止できないものの、その結果を公表したり配布することは禁止できると思われます。

動的リンクと静的リンク

第6条(b)がにおいて、下記のようにあります。

  • 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.

つまり、適切な共有ライブラリを利用して配布し、ライブラリが変更が同じインターフェイスである場合にアプリケーションが正しく動くようにすれば、自由なライセンスで配布できるということになります。

ただ、この"適切な共有ライブラリ"という表現が曖昧でわかりにくいのですが、(1)で、

ユーザのコンピュータに既に存在しているライブラリを利用する

とあることはわかります。ということは、単に動的リンクすればいいということではないのでしょうか。

GNUによる回答

実は、GNU Q&Aにその答えがあります。

(LGPLの)及ぶ作品に対し、静的 vs 動的にリンクされたモジュールについて、LGPLには異なる要求がありますか? (#LGPLStaticVsDynamic)


LGPL (現存のどのバージョンでも: v2, v2.1, or v3)に適合する目的では:

  • (1) LGPLのライブラリに対し静的にリンクする場合、ユーザがライブラリを改変してアプリケーションと再リンクできる機会のために、あなたは、あなたのアプリケーションを、オブジェクト(ソースの必要は必ずしもありません)フォーマットでも提供する必要があります。

  • (2) ユーザのコンピュータに既に存在するLGPLのライブラリに対し動的にリンクする場合、あなたは、ライブラリのソースを運搬する必要はありません。一方、あなたのアプリケーションと一緒にLGPLのライブラリの実行形式をあなた自身が運搬する場合、それが静的、あるいは動的にリンクされているかによらず、LGPLが提供する方法の一つでライブラリのソースを運搬する必要があります。

つまり、最初に紹介した見解は、正確ではないという事がわかります。わかりやすくまとめると、

  • A. 静的リンクでアプリケーションを配布する場合は、アプリケーションのオブジェクトコードまたはソースコードを配布する

  • B. 動的リンクで、かつコンピュータに存在するライブラリを利用する場合は、特に制約はない

  • C. 動的リンクで、かつアプリケーションと一緒にライブラリを配布する場合は、ライブラリのソースを配布あるいはリンクなどを公開する必要がある。

ということになります。これでよくわかりました。

アプリケーションのライセンス

ではこの場合、自分の作成したアプリケーションのライセンスはどうなるのでしょうか。

まず、A.の根拠となっているのは、第6条(a)です。

  • 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.)

Q&Aの通り、ユーザの再リンクの機会を与えるためにアプリケーションのオブジェクトコード(ソースである必要はない)を配布する、となっています。

この条項は第6条による例外事項の1つなので、Aの場合は自由なライセンスで配布できることになります。

次にB.の根拠になっているのは、前述のとおり第6条(b)です。

最後にC.の根拠になっているのは、第6条(d)、(e)および第4条であると考えられます。

  • 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.

第6条(d) は、アクセス手段の提供についての例外条項です。例えばダウンロードを例に取ると、ダウンロードによるアプリケーションの配布を行う場合、同じ場所において、指定された必要なものをダウンロードできるようにするという内容です。

第6条(e) は、ユーザが指定された必要なものを受け取ったこと、あるいは自分自身がユーザにコピーを送ったことを確認するという内容です。

この中で、指定された必要なものというのを規定するのが第1条から第5条になるわけですが、今回関わってくるのは第4条です。

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.

これによると、完全なソースコードを添付すれば、第1条および第2条にしたがってライブラリ(全体・一部・第2条における派生物)をオブジェクトコードないし実行形式で配布することができる旨が書かれています。

第1条や第2条についてはあまり深く触れませんが、つまりC.についても自由なライセンスで配布できるということになります。

まとめ

長くなりましたが、以上の考察により、次のことがわかりました。

  • A. 静的リンクでアプリケーションを配布する場合は、アプリケーションのオブジェクトコードまたはソースコードを配布する

  • B. 動的リンクで、かつコンピュータに存在するライブラリを利用する場合は、特に制約はない

  • C. 動的リンクで、かつアプリケーションと一緒にライブラリを配布する場合は、ライブラリのソースを配布あるいはリンクなどを公開する必要がある。

なおいずれの場合でも、アプリケーションは自由なライセンスで配布できます。ただし、ユーザ自身のためのアプリケーションの改変や、そのためのリバースエンジニアリングを許可しなければなりません。

補足

これらの注意として、以上の例はあくまでライブラリをそのままコピーして配布する場合に適用される内容であって、ライブラリを改変した場合はさらに制限が加えられます。

さらに、今回の検証はあくまでLGPLv2.1での場合であり、LGPLv2やLGPLv3では異なった規定が適用される場合があります必ずご自身でご確認ください。

もし間違いがありましたら、ご指摘ください。

Code Reading―オープンソースから学ぶソフトウェア開発技法
トップスタジオ まつもと ゆきひろ 平林 俊一 鵜飼 文敏
毎日コミュニケーションズ
売り上げランキング: 34,999

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.