The Man Who Fell From The Wrong Side Of The Sky:2013年11月29日分

[最新版] [一覧] [前月] [今月] [翌月]

2013/11/29(Fri)

[386BSD(の子孫)ソースコードシリーズ (334)][な阪関無] sys/cdefs.hとは何ですか? (その14)

@ 前回まで

人生 Abend Calendar 2013 14日目です。

@ 【補足】BSDL第2項と__COPYRIGHT()について【触手】

BSDLは「バイナリ配布するなら(ソースと違ってライセンス文面を埋め込めないから)添付文書とかに書いてあるcopyright noticeを残しておいてね」って言ってるんだと思ってたけど……

— ℕℂ (@ttakah) November 28, 2013

ワイのFUD(ゲス顔)が総スルーされる…だと…?と涙目になってたところなので、ツッコみありがとうございます、ありがとうございます( ベビクイワシのキックちゃんに蹴られた時のような声で)。

いま商用でBSDLの成果物を使ってる企業は全部これですやね、つまり Redistributionsから復元できる(binary formから復元できるとは言っていない)という解釈です。

OSG-JPの訳もその解釈よりさらに意図的に超訳されてます。

2. バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。

原文の「must reproduce(=再現可能であること)」がそもそも添付文書にそぐわない文言だし、what(1) でバイナリから著作権者表示が出力可能になってる実装を考えると、オリジナルの意図はどう考えてもバイナリ埋込だと思うんですよね。 そもそもこの訳って「copyright notice(=著作権者表示)」が「conditions(=利用条件)、disclaimer(=免責事項)」と等価列挙になってますが、原文はいったん前者と後者で文章切れてるし。

JNUGの日本語訳も「再現」をとても苦しい使い方しております。

2. バイナリー形式の再配布においては、上記の著作権表示、この条件の列挙、
     下記の注意書きを、配布物に附属した文書および/または他のものに再現
     させること。

ワイが訳するならこう?

2. バイナリ形式での再配布すんならこの著作権表示を(バイナリから)再生可能にしとかんとあかんのやで、それと
利用条件と免責事項の一覧もドキュメントか何かの形式で配布物に添付しとくんやで。

ただ現実問題さっきのOSG-JPの超訳通りの運用でいいんじゃねーのと。当時は

という 1:N の単純な図式で、今みたいに著作権者だけで 延々とスクロールしなきゃならないような人数ではなかったわけで、元々あのライセンスは将来的に世界中で真似されることなんかこれっぽっちも考えてないですし *1

実際に OpenBSD では copyright in binary form 消してますやね。はえーすっごい。

ちなみに NetBSD ライセンスの テンプレも基本的には 著作権者:貢献者 を 1:N のに保つよう

/*-
 * Copyright (c) 2008 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by 
 *

著作権者は TNF で、コード作者は TNF にコードを寄贈することになってます。

といってもこれは別に強制ではないし、いまや 3rd Partyだらけでもう「Berkeley Software Distribution」ではなく「Borrowed Software Distribution」なので 従う理由もありませんが *2

つーことで第2項はもっと現代的に書き直されるべきなんですが、ライセンスの厳密性考える人は GPLv334 とか CDDDDDDDDDDDL とかで遊んでるのだろう。

結論: __COPYRIGHT(), __KERNEL_COPYRIGHT() も消してしまおう(提案) *3

@ NetBSD 1.3 → 1.4

さて前回でやっと1.3までの説明終わったんで1.4へなんだけど、実は新しい機能はこのリリースではありません。

_C_LABEL()マクロの説明でも軽く触れましたが、binutilsがa.out形式のサポートを終了するのでELF形式への切替作業が開始されます。当初はsys/cdefs.hの中で

#ifdef __ELF__
# define _C_LABEL(x)	x
#else
# define _C_LABEL(x)	__CONCAT(_,x)
#endif

ifdefされてたのですが、可読性の及び将来的にa.outサポートを消す時の手間の為にヘッダは分割され

  1. machine/cdefs.h … 機種依存のマクロ
  2. sys/cdefs_elf.h … ELF形式を扱う〃
    #define	_C_LABEL(x)	x
    
  3. sys/cdefs_aout.h … a.out形式を扱う〃
    #define	_C_LABEL(x)	__CONCAT(_,x)
    
  4. sys/cdefs.h … 機種非依存〃

という構成になりました *4。とはいっても使用する側は sys/cdefs.h だけをincludeすればOKです(1〜3はマクロが自動で判定して必要なものをincludeしてくれます)、 ここ

#include <machine/cdefs.h>
#ifdef __ELF__
#include <sys/cdefs_elf.h>
#else
#include <sys/cdefs_aout.h>
#endif

NetBSD では MD/MI といって機種依存部(Machine Dependent)/機種非依存部(Machine Independent)のコードを分離しますが、こういうobjformatの違いも同様に分離することでコードの見通しを良くするわけです。

@ 次回予告

いよいよNetBSD-1.5でELF化されるわけですが、a.out vs ELFの話ができたらなーと。


*1:ライセンスの本来の意図としては「著作権表示を削って(あたかも自分のもののように振る舞って)はならない」なので、BSDLは悪文なんだよな、再生できるようにしたきゃ自分で puts(copyright) でもしとけという話
*2:ワイも Copyright は Citrus にcontribしたコード以外は、自分の名前でNにつっこんどります。
*3:init_main()で出す TNFの著作権表示だけで十分ですよ。
*4:execve(2) が読む込むための a.out形式 あるいは ELF形式のフォーマット(構造体)情報は別途 sys/exec_{elf,aout}.h にあります、そっちの話は関係ないので省略


[ホームへ] [ページトップへ]