English [en]   Deutsch [de]   fran?ais [fr]   日本語 [ja]   português do Brasil [pt-br]   русский [ru]   簡體中文 [zh-cn]  

這是針對英文原版頁面的中文翻譯。

GCC運行庫例外的理由和常見問題解答

引言

2007年6月29日,自由軟件基金會發布了GPLv3。它馬上被15個GNU項目采納,在隨后的幾個月內有更多的項目切換到了該許可證。GCC的大多數代碼在4.2.2版本發布時都采用了新的許可證,現在我們正在對此進行收尾。

有些伴隨GCC的軟件庫的許可證還沒有變更。這些軟件庫自動被GCC產生的目標代碼使用。因此,如果只簡單允許這些庫按照GPL發布,那么GCC產生的所有目標代碼都將需要按照同樣的條款發布。然而,FSF很久以前就決定允許開發者使用GCC的軟件庫編譯任何程序,無論該程序使用何種許可證。開發非自由軟件對社會不利,而且我們也沒有義務使之更容易。我們允許這樣做是因為禁止它看來是適得其反,另外的原因是因為使用了其他小軟件庫而限制GCC的使用看來是抓了芝麻丟了西瓜。

所以,這些軟件庫一直是許可證例外,該例外允許人們將使用GCC產生的目標代碼用任何許可證發布。我們現在將這些軟件庫的許可證改到GPLv3,并更新這些例外。我們的基本政策沒有變化;新的許可證還是允許按照以前的方式使用GCC。不過,我們決定利用這個機會更新例外達成3個目的:

正如GPLv3,我們草擬此文時努力聽取了多方用戶的意見,并對這些意見做出了適當的處理。總而言之,我們為此花費了超過一年的時間。自由軟件基金會和GCC執行委員會感謝軟件自由法律中心的Richard Fontana、Bradley Kuhn和Karen Sandler,感謝他們對此例外所做的所有辛勤努力和協助。這些更新會強化GCC社區,我們期待它為編譯器的開發打開新的篇章。

GCC對開發者是如此關鍵,我們料想他們對此更改會有問題,我們希望這些問題都有應對。下面,我們列舉了用戶可能會有的擔憂。如果你關于此例外的問題沒有列出,請隨時通過<[email protected]>聯系我們。

例外是怎么回事

你需要的許可—用GCC庫把代碼轉換成按照你的許可證發布的目標代碼—主要在第1節中:

你有權傳播由獨立模塊和運行庫組合而成的目標代碼作品,即使該傳播從其他方面來看可能違反了GPLv3的條款,前提是所有的目標代碼都是經由合法的編譯過程產生的。那么你可以為該組合使用你選擇的許可證條款,只要它和獨立模塊的許可證一致。

本節使用了很多術語,這些術語的特定含義和例外如何操作不可分割。本節詳解這些術語和常見場景的關系。

當你編寫軟件時,軟件就包含了一系列源代碼文件。如果一個文件不包含GCC庫里的源代碼,那么這個文件就是一個“獨立模塊”。

當你編譯這些源代碼文件時,它們通常會經歷一系列步驟:源代碼生成、預處理、編譯成低級代碼、匯編和連接。根據所用的語言和軟件編寫的方式,有些項目可能沒有以上所有的步驟,但是它們總會按照這個順序執行,使用GCC的人會按照這個步驟從高級語言編譯到諸如匯編或Java bytecode1。在這個階段,GCC把你的代碼和GCC庫合并或連接起來。我們稱之為“編譯過程。只要此時的輸出不是編譯器還要用的過渡代碼,也不是編譯器要輸出的過渡代碼,”此時的輸出就叫做“目標代碼。”

要想利用本許可,產生目標代碼的編譯過程必須“合法”,就是說其中沒有引入和GCC以及GPL不兼容的軟件。重要的一點是編譯過程從你把任何高級語言代碼輸入給GCC就開始,一旦輸出了目標代碼就結束。因此,只要GCC沒有輸出過渡代碼,即使你用其他GPL不兼容的匯編器、連接器或者高級語言產生工具和GCC一起工作,你的編譯過程還可以是合法的:這些GPL不兼容工具按照我們的定義不算參與編譯過程。只有一個地方你不能使用這些GPL不兼容的軟件,這就是當GCC在進行核心編譯工作的時候。

所以,如果你用了GCC,不管有沒有GPL不兼容的軟件,編譯過程都可以是合法的。如果你只用了GPL兼容的編譯工具,編譯過程也是合法的。(即使使用不同的編譯器,人們也常常會為GNU/Linux軟件連接GCC庫。)不過,如果你在把高級語言代碼轉換成低級語言代碼的過程中用了GCC加上GPL不兼容的工具,那么這就不是一個合法的編譯過程。比如,你使用GCC加上一個專有的插件就是這么一個非法編譯過程。

只要編譯過程是合法的,那么你有權為GCC產生的目標代碼的發布“選擇你的條款。”

如果你在編譯過程中使用了GPL不兼容的工具,那么你不能使用這項權利。由于GCC產生的目標代碼都來自GPL軟件庫,所以如果要發布這些目標代碼就要遵循GPL的條款。你不能使用GCC開發你自己的GPL不兼容軟件。

常見問題解答

我使用的是GCC的標準發布版(比如由FSF提供的,或者是操作系統自帶的),我用它編譯GPL不兼容軟件。例外的更改對我有什么影響?

此次更改不會影響你。除非你把GCC配置成輸出過渡代碼—這種情況很少見—新的例外是要確保你這樣做時沒有違反許可證,正如老的例外一樣。

這個變更會影響哪些人?

目前使用GCC的人應該不會受到影響。其中唯一的政策性修改是為了防止開發者在將來對GCC的功能做出某些修改。FSF一直和GCC開發者緊密合作來了解人們目前使用GCC的方式,以確保他們在新的例外條款下仍然能夠繼續按照已有的方式使用GCC。

我使用GCC加上專有的預處理工具/源代碼生成工具來做編譯。我可以利用這個例外嗎?

是的。編譯過程開始于任何“完全由高級語言表達的代碼,而不是過渡代碼語言。”這包括由預處理工具或其他專有軟件生成的代碼。這樣,編譯過程不包含任何專有軟件;它是合法的,例外對這樣的程序適用。

我使用GCC加上專有的匯編器/連接器做編譯。我還可以利用這個例外嗎?

是的。編譯過程當編譯器產生目標代碼時結束,這個包括輸出“適用于匯編器、載入器、連接器/運行程序的輸入文件。”換句話說,在這種情況下編譯過程在GCC輸出匯編代碼或未連接的目標文件時已經結束,所以其中不包含任何專有軟件的參與。它是合法的,例外對這樣的程序適用。

我使用GCC編譯程序的一部分,使用專有軟件編譯程序的其余部分。然后這些部分在匯編或連接階段合在一起。我還能利用這個例外嗎?

是的。在這種情況下,每個獨立模塊都是按照合法的編譯過程變成目標代碼的。盡管不同模塊經歷了不同的過程,該例外還是適用于這個程序的。

我使用不包含任何GCC成分的專有編譯器編譯我的程序,然后將它和libstdc++連接起來。我的程序本身不包含任何像用GCC編譯的程序那樣的運行庫(libgcc)。我還能利用這個例外嗎?

是的。雖然該例外最常見的場景可能是用于把libgcc和GCC編譯的目標代碼合在一起,但是GPL和GCC運行庫例外都不區分靜態連接、動態連接以及其他合成方式。該例外許可你可以用,同樣的條款,無論你采用了哪一個合成方式。

請注意,如果你要發布的是獨立的libstdc++庫,那么你需要按照GPL的條款來發布。比如,如果你的庫是按照目標代碼的形式發布的,那么你需要使用由GPLv3第6節里規定的方法之一來提供源代碼。但是只要你的程序適用GCC運行庫例外,GPL條款就不會擴展到你的程序。

為什么編譯器過渡代碼不在“目標代碼”的定義之內?

當我們第一次考慮給GCC添加插件架構時,我們非常擔心有人會寫一個插件來簡單把GCC的過渡代碼、底層編譯數據格式保存到磁盤。這樣的話,其他軟件就可以不經GCC而優化或改進這些代碼。我們可能很難爭辯說這些程序應該遵循GPL的copyleft條款,所以我們想要阻止這種活動。

我們的做法是把這些輸出排除在目標代碼之外。正因為如此,即使有人寫了保存中間信息的插件,任何在GCC輸出目標代碼之前修改這些信息的程序也都參與到了編譯過程之中。如果該程序是專有軟件,那么例外就不適用于它編譯的軟件;GCC最后輸出的目標代碼就必須按照GPL的條款來發布。

如果我寫了一些匯編語言的代碼,我是否還可以把它和其他正常編譯的目標代碼合在一起,并利用該例外?

是的,只要這些目標代碼是經由合法編譯過程產生的。在匯編器里跑手寫的匯編代碼就是一個編譯過程,因為它把讓人編寫代碼的[a]非過渡性語言[]的代碼轉換成...目標代碼。”

GCC運行庫例外包含哪些庫?

GCC運行庫例外涵蓋了所有的許可證說明里陳述了例外適用的文件。這包括libgcc、libstdc++、libfortran、libgomp、libdecnumber、libgcov以及其他和GCC一起發布的庫。

Classpath會使用該例外嗎?

盡管Classpath當前的例外起著相似的作用,我們這次也還沒有更新它。因為自由軟件Java社區的最新發展,Classpath許可證政策的優先級和其他GCC庫有所不同,我們會單獨評估。

譯注

  1. Java bytecode:這是Java語言編譯后的中間語言,就像匯編是C/C++編譯后的中間語言一樣。
最頂

[FSF 標志]“自由軟件基金會(FSF)是一個非盈利組織。我們的使命是在全球范圍內促進計算機用戶的自由。我們捍衛所有軟件用戶的權利。”

加入 購物

招财蟾蜍APP 互联网投资能赚钱吗 拼多多投入大才能赚钱吗 种什么无公害菜最赚钱 蛋蛋赚真的能赚钱吗 黄陂开干洗店赚钱吗 啊尚啊尚麻辣烫赚钱么 网上兼职赚钱是否可靠 电子商务行业是如何赚钱的 怎样做公众号赚钱吗 晚上摆摊卖油炸串赚钱吗 当当链怎么赚钱 梦幻西游 大龙带d5赚钱吗 蓝科智能机器人赚钱吗 2017玩家赚钱的游戏 速停车怎样赚钱 拍那个视频可以赚钱