GCC 執行時期函式庫例外條款理由與常見問答
簡介
在 2007 年 6 月 29 日,自由軟體基金會發布了 GPLv3。它立即被十五個 GNU 專案採用,並且在接下來的幾個月內有更多專案進行了轉換。大部分 GCC 程式碼庫在 4.2.2 版本中遷移到新的授權條款,而現在我們正準備完成這個過程。
與 GCC 一起發行的一些函式庫的授權條款尚未更改。這些函式庫會自動被 GCC 產生的目標碼使用。因此,如果這些函式庫僅僅根據 GPL 條款發行,那麼 GCC 產生的所有目標碼都必須根據相同的條款發行。然而,FSF 早在很久以前就決定允許開發人員使用 GCC 的函式庫來編譯任何程式,無論其授權條款為何。開發非自由軟體對社會並不好,我們沒有義務使其更容易。我們決定允許這樣做,因為禁止它似乎可能會適得其反,而且因為使用小型函式庫來限制 GCC 的使用似乎是本末倒置。
因此,這些函式庫一直都有授權條款例外,允許人們根據任何授權條款發行 GCC 產生的目標碼。我們現在正在將這些函式庫遷移到 GPLv3 並更新其例外條款。我們的基本政策沒有改變;新的授權條款旨在允許所有以前允許的 GCC 用途。然而,我們已決定利用這個機會更新例外條款,以實現三個目標
利用 GPLv3 的新條款。GPLv3 具有許多惠及所有軟體的新條款。這些條款包括第 7 節,其中建立了一個提供授權條款例外的框架。為了讓 GCC 從 GPLv3 中獲得最大利益,我們需要更新例外條款以將這些新條款納入考量,並在第 7 節的參數範圍內運作。
為 GCC 中的外掛程式基礎架構奠定基礎。長期以來,GCC 開發人員一直在考慮向編譯器新增外掛程式框架。這將使其他人更容易為專案做出貢獻,並加速 GCC 新編譯技術的開發。然而,也有人擔心,不擇手段的開發人員可能會編寫外掛程式,呼叫專有軟體來轉換已編譯的程式碼——實際上是建立 GCC 的專有擴充功能,並破壞 GPL 的目的。更新後的例外條款防止了這種濫用,使 GCC 團隊能夠期待外掛程式的發展。
使整個 GCC 程式碼庫中的例外條款保持一致。多年來,隨著需要攜帶此授權條款例外的新檔案被新增到 GCC 中,我們審查並更新了語言,以幫助澄清它並解決新的疑慮。因此,現在 GCC 中有許多不同的例外條款文字,它們提供相同的基本權限。現在,所有這些檔案都將能夠使用我們準備的單一新例外條款文字,從而更容易對程式碼執行法律審查。
與 GPLv3 一樣,我們在起草本文時努力傾聽各種使用者的疑慮,並適當地解決這些疑慮。總而言之,我們在這個過程中花費了一年多的時間。自由軟體基金會和 GCC 指導委員會要感謝軟體自由法律中心的 Richard Fontana、Bradley Kuhn 和 Karen Sandler,感謝他們在例外條款方面付出的辛勤工作和協助。這裡的變更將加強 GCC 社群,我們期待它將促成的編譯器發展。
由於 GCC 在開發人員的生活中扮演著如此關鍵的角色,我們預計會收到許多關於這些變更的問題,並且我們希望確保這些問題得到解答。以下我們解決了我們預期使用者會有的特定疑慮。如果您對此處未提及的新例外條款有疑問,請隨時透過 <licensing@fsf.org> 與我們聯絡。
例外條款如何運作
您需要的許可——根據您自己專案的授權條款傳達來自這些 GCC 函式庫的目標碼——主要包含在第 1 節中
您有權傳播透過將執行時期函式庫與獨立模組結合而形成的目標碼作品,即使此類傳播在其他情況下會違反 GPLv3 的條款,前提是所有目標碼都是由合格的編譯過程產生的。然後,您可以根據您選擇的條款傳達此類組合,但須與獨立模組的授權條款一致。
本節使用了許多定義的術語,它們的具體含義對於例外條款的運作方式至關重要。本節探討這些術語如何與常見情境相關。
當您編寫軟體時,它由一組原始碼檔案組成。每個檔案都是一個「獨立模組」,只要它不包含來自 GCC 函式庫的任何原始碼。
當您編譯這些原始碼檔案時,它們通常會經過一系列步驟:原始碼產生、前處理、編譯為低階程式碼、組譯和連結。並非所有專案都遵循所有這些步驟,具體取決於您使用的語言及其編寫方式,但它們始終會按照此順序進行,並且每個使用 GCC 的人都會經歷將高階程式碼編譯為某些低階語言(例如組合語言或 Java 位元組碼)的過程。此階段是 GCC 將您自己的程式碼與來自 GCC 函式庫的程式碼結合或連結的階段。我們稱之為「編譯過程」。從中獲得的輸出稱為「目標碼」,只要該輸出不用作編譯器中繼表示法,或用於建立此類中繼表示法。
為了利用此許可,您用於建立目標碼的編譯過程必須是「合格的」,這表示它不涉及 GCC 和 GPL 不相容的軟體。重要的是要記住,編譯過程在您將任何高階程式碼饋送給 GCC 時開始,並在它產生任何可以被視為目標碼的東西時結束。因此,只要 GCC 沒有寫出中繼表示法,即使您將 GCC 與 GPL 不相容的組譯器、連結器或高階原始碼產生器結合使用,您的編譯過程仍然可以是合格的:這些程式未參與此處定義的編譯過程。您不能將 GPL 不相容的軟體與 GCC 一起使用的唯一地方是當它執行核心編譯工作時。
因此,如果您使用 GCC,無論是否具有 GPL 相容的增強功能,那都將是一個合格的編譯過程。如果您僅使用 GPL 不相容的編譯器工具,那也將是一個合格的編譯過程。(對於為 GNU/Linux 建構軟體的人來說,即使他們使用不同的編譯器,連結到 GCC 函式庫也很常見。)但是,如果您在高階程式碼轉換為低階程式碼的過程中,將 GCC 與 GPL 不相容的軟體結合使用,那將不是一個合格的編譯過程。例如,如果您將 GCC 與專有外掛程式一起使用,就會發生這種情況。
只要您使用合格的編譯過程,那麼您就有權根據「您選擇的條款」取得 GCC 產生的目標碼並傳播它。
如果您在編譯過程中確實將 GPL 不相容的軟體與 GCC 結合使用,您將無法利用此許可。由於 GCC 產生的所有目標碼都源自這些 GPL 授權的函式庫,這表示當您傳播任何這些目標碼時,您將需要遵循 GPL 的條款。您不能使用 GCC 來開發您自己的 GPL 不相容的軟體。
常見問題
- 我正在使用標準版本的 GCC(例如 FSF 提供的版本,或我的作業系統附帶的版本)來編譯 GPL 不相容的軟體。這個變更會如何影響我?
它應該完全不會影響您。除非您已將 GCC 配置為輸出中繼表示法(這很少見),否則新的例外條款旨在確保您在執行此操作時沒有授權義務,就像舊的例外條款一樣。
- 這個變更會影響誰?
目前正在使用 GCC 的任何人都不應受到此變更的影響。政策的唯一變更是為了防止開發人員對 GCC 進行某些修改,這些修改在未來將變得可行。FSF 一直與 GCC 開發人員密切合作,以了解更多關於人們今天使用 GCC 的許多不同方式,並確保他們都將能夠在新例外條款下繼續這些活動。
- 我將 GCC 與專有的前處理器和/或原始碼產生器結合使用來編譯我的程式。我仍然可以利用例外條款嗎?
是的。「編譯過程」可以從任何「完全以高階、非中繼語言表示的程式碼」開始。這包括由前處理器或其他專有軟體產生的程式碼。因此,在這種情況下,編譯過程不涉及任何專有軟體;它符合合格條件,並且此程式可以使用例外條款。
- 我將 GCC 與專有的組譯器和/或連結器結合使用來編譯我的程式。我仍然可以利用例外條款嗎?
是的。「編譯過程」在編譯器產生目標碼時結束,其中包括「適用於輸入到組譯器、載入器、連結器和/或執行階段」的輸出。換句話說,在這種情況下,當您擁有來自 GCC 的組合語言程式碼或未連結的目標檔案時,編譯過程就結束了,因此它不涉及任何專有軟體。它符合合格條件,因此此程式可以使用例外條款。
- 我使用 GCC 編譯程式的某些部分,並使用專有的編譯器編譯其他部分。這些部分在之後的組譯或連結階段組合在一起。我仍然可以利用例外條款嗎?
是的。在這種情況下,每個獨立模組都透過合格的編譯過程轉換為目標碼。即使不同的模組將經歷不同的過程,此程式仍然可以使用例外條款。
- 我使用不包含任何 GCC 部分的專有編譯器工具鏈來編譯我的程式,並將其與 libstdc++ 連結。我的程式本身不包含任何執行時期函式庫程式碼,就像 GCC 編譯的程式包含 libgcc 一樣。我仍然可以利用例外條款嗎?
是的。雖然將 libgcc 與 GCC 編譯的目標碼結合使用可能是使用例外條款最常見的方式,但 GPL 和 GCC 執行時期函式庫例外條款在其條件中都沒有區分靜態連結、動態連結和其他組合程式碼的方法。無論您使用哪種方法,您都可以在相同的條款下獲得相同的權限。
請注意,如果您將 libstdc++ 作為獨立函式庫發行,則在這樣做時需要遵循 GPL 的條款。例如,如果您以目標碼形式發行函式庫本身,則需要使用 GPLv3 第 6 節中列出的方法之一向您的接收者提供原始碼。但是,只要您有資格為您自己的程式利用 GCC 執行時期函式庫例外條款的權限,GPL 的條款就不會擴展到它。
- 為什麼編譯器中繼表示法被排除在「目標碼」的定義之外?
當我們最初考慮向 GCC 新增外掛程式基礎架構時,我們非常擔心有人會編寫一個外掛程式,該外掛程式只會將 GCC 的內部、低階編譯資料結構儲存到磁碟。完成此操作後,其他軟體將能夠最佳化或以其他方式改進該程式碼,而無需直接連接到 GCC。我們可能很難爭辯說這些程式應該受 GPL 著作權保護的約束,因此我們想阻止這種類型的安排。
我們透過將此類輸出排除在目標碼的定義之外來做到這一點。因此,即使有人編寫一個將此資訊儲存到磁碟的外掛程式,在 GCC 寫出目標碼之前更改結構的任何程式都將參與編譯過程。如果該程式是專有的,則例外條款將不適用於使用它編譯的任何軟體;GCC 最終建立的目標碼將必須根據 GPL 的條款發行。
- 如果我用組合語言編寫一些程式碼,我可以將其與其他正常編譯的目標碼結合,並且仍然可以利用例外條款嗎?
是的,只要所有目標碼都是透過合格的編譯過程編譯的。透過組譯器執行手寫組合語言的過程是一個編譯過程,因為它「將完全以 [一種] 非中繼語言 [] 表示的程式碼轉換為目標碼,該語言專為人工編寫的程式碼而設計...」。
- GCC 執行時期函式庫例外條款涵蓋哪些函式庫?
GCC 執行時期函式庫例外條款涵蓋任何在其授權條款標頭中註明該例外條款適用的檔案。這包括 libgcc、libstdc++、libfortran、libgomp、libdecnumber、libgcov 以及與 GCC 一起發行的其他函式庫。
- Classpath 會使用這個新的例外條款嗎?
即使 Classpath 目前的例外條款具有類似的目的,我們目前也沒有更新它。由於自由軟體 Java 社群的最新發展,Classpath 授權政策的優先順序與其他 GCC 函式庫不同,我們正在單獨評估它。