Читать книгу Praxishandbuch Open Source - Christian Galetzka - Страница 40

Оглавление

3. Juristen müssen diese Verlinkung verstehen

103

 – Für das Auslösen eines Copyleft kommt es auf die Verbindungen des FOSS Code mit eigenen Programmbestandteilen an.

 – Daher sollte die konkrete Art der Verlinkung (statisch, dynamisch oder andere Formen der Interaktion von Code) ermittelt und korrekt anhand der Lizenzvorgaben eingeordnet werden.

 – Die Art der Verlinkung von FOSS mit eigenen Programmbestandteilen ist abhängig von der verwendeten Programmiersprache, da nicht alle Programmiersprachen alle Arten der Verlinkung zulassen.

104

Zahlreiche FOSS Lizenzen – insbesondere solche mit einem beschränkten Copyleft – knüpfen unterschiedliche Anforderungen und Konsequenzen an den Einsatz der jeweiligen FOSS Komponente, je nachdem wie diese mit dem übrigen, meist proprietären Code der Software interagiert. Es kommt dabei in der Regel darauf an, wie stark die FOSS Komponente in die eigene Software eingebunden wird. Wir sprechen hier von statischer oder dynamischer Verlinkung, um zu beschreiben, wie eng die FOSS Komponente mit proprietärem Code verbunden ist. Um diese Differenzierung besser nachvollziehen zu können, möchten wir an dieser Stelle zum einen erklären, wie wir die Begriffe der statischen und dynamischen Verlinkung grundsätzlich verstehen und in diesem Buch Bezug darauf nehmen. Zum anderen soll kurz dargestellt werden, wie sich die unterschiedlichen Arten der Verlinkung in diversen Programmiersprachen manifestieren können. Denn je nachdem, in welcher Programmiersprache die jeweilige Software geschrieben wurde, kommen bereits nur bestimmte Arten der Verlinkung überhaupt in Frage bzw. wird der Begriff der Verlinkung möglicherweise anders genutzt und kann so zu Missverständnissen führen.

a) Statische vs. dynamische Verlinkung

105

Zunächst betrachten wir einmal grundsätzlich die Verlinkung von Software-Bestandteilen. Bei einer Verlinkung handelt es sich um eine Verbindung zweier Software-Bestandteile, so dass diese – ggf. noch mit mehreren anderen Software-Komponenten – ein komplettes Programm bilden. Eine solche Verbindung ist auf verschiedene Weisen möglich, je nachdem wie eng die beiden Software-Bestandteile dabei miteinander verknüpft werden. In der Regel wird hier nach statischer und dynamischer Verlinkung unterschieden.

106

Unter einer statischen Verlinkung versteht man allgemein eine feste Verbindung von zwei Software-Komponenten. Hier wird bei der Erstellung des Programms durch Kompilieren die FOSS Komponente mittels des Linkers mit dem restlichen (proprietären) Code der Software zu einer einzigen Datei zusammengefügt.22 Im Anschluss an den Kompilierprozess existiert daher nur noch ein ausführbares Programm, in dem sowohl der eigene Programmcode als auch der Code der verwendeten FOSS – oder anderer Software-Komponenten – als eine Einheit enthalten sind. Auf diese Weise ist die FOSS Komponente untrennbar mit dem restlichen Code verbunden, so dass hier im Nachhinein die FOSS Komponente weder entfernt oder ausgetauscht werden kann.

107

Eine dynamische Verlinkung ist dagegen eine lose Verbindung zwischen zwei Software-Komponenten. Die beiden Software-Komponenten werden hierbei bei der Kompilierung nicht durch den Linker zu einem einzigen gemeinsamen Programm zusammengefügt, sondern bleiben weiterhin als einzelne Bestandteile bestehen. Die proprietäre Software greift hier erst zur Laufzeit – also im Zeitpunkt der Ausführung des Programms – auf die FOSS Komponenten und deren Funktionen zu.23 Dies ermöglicht es, die FOSS Komponente auch im fertigen Programm noch zu entfernen oder zu ersetzen.

108

Backup: Für den Anfang mag ein grundsätzliches Verständnis dafür genügen, was dynamische Verlinkung bedeutet. Nämlich eine Verbindung zweier Software-Komponenten, die es ermöglicht, eine der Komponenten auch später auszutauschen (z.B. gegen eine neuere Version der Komponente oder gegen eine an die eigenen Bedürfnisse angepasste Komponente).

Die konkreten technischen Anforderungen an eine dynamische Verlinkung – so wie sie beispielsweise auch von der LGPL-2.1 ausdrücklich vorausgesetzt werden – zu kennen, ist aber relevant, um den konkreten Einsatz einer Software auf Lizenzkonformität zu überprüfen und sicherzustellen, dass der Copyleft Effekt sich nicht auf eigene, proprietäre Bestandteile der Software auswirkt.

Im Folgenden werden daher im Überblick die konkreten technischen Anforderungen an eine dynamische Verlinkung dargestellt, so wie sie von der LGPL-2.1 vorausgesetzt wird. Dies sind auch die Kriterien, von denen wir ausgehen, wenn wir in diesem Buch auf eine dynamische Verlinkung Bezug nehmen:

 – Die FOSS Komponente bleibt als eigenständiges File im File System identifizierbar,

 – sie interagiert nur über Standardschnittstellen mit anderer (insbesondere proprietärer) Software

 – und ist zumindest theoretisch, wenn auch mit einigem Aufwand, durch den Nutzer austauschbar.

109

Die Unterscheidung der dynamischen und statischen Verlinkung für die FOSS Compliance beruht hauptsächlich auf der LGPL, da diese Lizenz spezielle Ausnahmen für eine dynamische Einbindung von unter der LGPL stehenden Programmteilen (hauptsächlich Bibliotheken) enthält. Dabei enthält die LGPL jedoch an keiner Stelle den Begriff der dynamischen Verlinkung, sondern lediglich eine Beschreibung der Voraussetzungen für eine zulässige Einbindung (siehe Rn. 108). Die LGPL hat damit zwar die Voraussetzungen der dynamischen Verlinkung, nicht aber den konkreten Begriff geprägt. Dieser wurde vielmehr durch die Anwender geprägt.

b) So linken die verschiedenen Programmiersprachen

110

Als nächstes betrachten wir nun, wie diese Arten der Verlinkung sich in der Praxis in diversen gängigen Programmiersprachen manifestieren. Denn je nachdem, welche Programmiersprache vorliegt, sind verschiedene Arten der Verlinkung möglich.

111

Programmiersprachen sind formale Sprachen, mit denen Datenstrukturen und Algorithmen, also Rechenvorschriften, formuliert werden können, die dann von einem Computer ausgeführt werden können. Sie folgen dabei einem bestimmten Regelsystem, nach dem die unterschiedlichen Anweisungen an den Computer formuliert werden können.24 Es existieren zahlreiche Programmiersprachen, die alle ihre eigenen Anwendungsgebiete haben. Hier wollen wir einige der gängigsten Sprachen vorstellen und zeigen, wie sich in diesen die Verbindung von einzelnen Programmbestandteilen unterscheiden kann.

aa) C und C++

112

Programmiersprachen, die sowohl statische als auch dynamische Verlinkungen einzelner Programmteile zulassen, sind beispielsweise C sowie die darauf aufbauende Programmiersprache C++. Die Anwendungsbereiche dieser beiden Programmiersprachen sind groß, da sowohl C als auch C++ jeweils für System- und Anwenderprogrammierung verwendet werden können. Daher tauchen diese Programmiersprachen im Bereich der FOSS auch häufig auf. In C, C++ oder anderen Programmiersprachen dieser Art, können FOSS und andere Software-Komponenten entweder mittels des Linkers bei der Kompilierung statisch mit dem restlichen Programmcode verbunden werden. Es ist aber auch möglich, mittels einer entsprechenden Schnittstelle dafür zu sorgen, dass andere, separat kompilierte FOSS und Software-Komponenten erst während der Laufzeit durch das eigene Programm aufgerufen werden.25

bb) Python

113

Eine weitere Programmiersprache, die grundsätzlich sowohl statische als auch dynamische Verlinkungen zulässt, ist Python. Ähnlich wie bei C handelt es sich hier ebenfalls um eine Programmiersprache, die sehr vielseitig einsetzbar ist, da sie mehrere Paradigmen der Programmierung unterstütz. Die meisten Python Distributionen basieren auf dynamischen Verlinkungen. Es stehen viele eigenständige Libraries zur Verfügung, auf die im eigenen Code referenziert und deren Funktionalität dann während der Laufzeit aufgerufen werden kann. Diese Libraries werden von dem System bereitgestellt, auf dem Python läuft (dies kann z.B. das Linux Betriebssystem sein). Python ermöglicht es aber auch, entsprechend benötigte Libraries statisch einzubinden. Dabei steht der Code der verwendeten Library dann nicht mehr separat auf dem System zur Verfügung, sondern wird direkt zusammen mit dem übrigen Python Code mittels des Linkers zu einer einzigen Binärdatei zusammengefügt.26

cc) Java

114

Bei der Programmiersprache Java, die für die Programmierung von Anwendungen wie Desktop-Programmen, Webanwendungen oder Apps verwendet wird, sieht dies ein wenig anders aus. Hierbei handelt es sich um eine objektorientierte Programmiersprache, bei der die einzelnen Bestandteile und Funktionen in sog. JARs bereitgestellt werden. Die JARs entsprechen dabei grundsätzlich dem, was in den meisten anderen Programmiersprachen als Library bezeichnet wird. Werden zwei oder mehr JARs miteinander verbunden, geschieht dies in Java ausschließlich über Schnittstellen, über die die JARs dann mit anderen JARs kommunizieren und so ein ganzes Programm bilden. Die Verlinkung zwischen zwei in Java programmierten Software-Bestandteilen ist daher immer als eine dynamische Verlinkung einzuordnen. Eine statische Verlinkung, bei der mehrere einzelne Bestandteile fest miteinander zu einem einzigen Programm verbunden werden, ist in dieser Programmiersprache nicht vorgesehen.27

115

Backup: Sind unter LGPL stehende Programme in Java nutzbar?

Die LGPL enthält Ausnahmen vom Copyleft für solche Programmteile, die mittels einer dynamischen Verlinkung mit dem restlichen Programmcode verbunden sind. Aufgrund der Struktur von Java, die ohnehin immer eine dynamische Verlinkung zwischen einzelnen Programmteilen und Bibliotheken vorsieht, sollte der Einsatz LGPL lizenzierter Software daher unproblematisch sein. Dennoch findet man gerade in Entwicklerforen häufig Verwirrung darüber, ob die LGPL für eine in Java programmierte Anwendung überhaupt bestimmungsgemäß eingesetzt werden kann.28

Die FSF – die Urheber und Herausgeber der LGPL – hat sich zu diesen Äußerungen klar positioniert und widerlegt, dass die LGPL für Java nicht kompatibel sei. Laut der FSF ist die LGPL mit allen bekannten Programmiersprachen anwendbar.

Die Struktur von Java sieht vor, dass eine von einer Anwendung benötigte Bibliothek (die dann z.B. unter der LGPL lizenziert ist) als separate JAR-Datei vorliegt. Die Anwendung nutzt dann eine sog. Import-Funktion, um auf die Bibliothek zuzugreifen. Beim Kompilieren der Anwendung werden daher Funktionssignaturen gegen die Bibliothek überprüft und so eine Verknüpfung hergestellt. Die Bibliothek bleibt dabei aber grundsätzlich ein eigenständiger Bestandteil, auf dessen Funktionen zugegriffen wird, der aber nicht komplett in den Code der Anwendung übernommen wird.

Die Bibliothek erfüllt daher grundsätzlich alle Anforderungen, die die LGPL an eine dynamische Verlinkung stellt, da weiterhin gewährleistet bleibt, dass ein Nutzer die Bibliothek verändern oder austauschen kann.29

22 Indiana University, About linkers and dynamic and static linking, https://kb.iu.edu/d/akqn. 23 Indiana University, About linkers and dynamic and static linking, https://kb.iu.edu/d/akqn. 24 https://de.wikipedia.org/wiki/Programmiersprache. 25 https://de.wikipedia.org/wiki/C_(Programmiersprache). 26 https://wiki.python.org/moin/BeginnersGuide/Overview; http://openbookproject.net/thinkcs/python/english3e/way_of_the_program.html. 27 Ullenboom, http://openbook.rheinwerk-verlag.de/javainsel, Kap. 1.2. 28 https://developers.slashdot.org/story/03/07/17/2257224/lgpl-is-viral-for-java. 29 Turner, https://www.gnu.org/licenses/lgpl-java.en.html.

Praxishandbuch Open Source

Подняться наверх