<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>markusbe.de</title>
	<atom:link href="http://www.markusbe.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.markusbe.de</link>
	<description>Klar, knapp, komplett, korrekt</description>
	<lastBuildDate>Wed, 01 Dec 2010 13:38:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Wie man einen Patch anwendet und &#8220;hunk FAILED&#8221;, &#8220;can&#8217;t find file to patch&#8221; und andere löst</title>
		<link>http://www.markusbe.de/2009/12/wie-man-einen-patch-anwendet-und-hunk-failed-cant-find-file-to-patch-und-andere-loest/</link>
		<comments>http://www.markusbe.de/2009/12/wie-man-einen-patch-anwendet-und-hunk-failed-cant-find-file-to-patch-und-andere-loest/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 11:06:13 +0000</pubDate>
		<dc:creator>Markus Bertheau</dc:creator>
				<category><![CDATA[praktisch]]></category>

		<guid isPermaLink="false">http://www.markusbe.de/?p=79</guid>
		<description><![CDATA[English Hi Nachdem du diesen Artikel gelesen hast, kannst du Patches/Diffs anwenden und mit auftretenden Fehlern umgehen. Nehmen wir an, dass der Patch in der Datei fix-bug.patch ist (die Erweiterung hat keinen Einfluß). Das Verzeichnis software-1.0 enthält die Dateien, die gepatcht werden sollen. Ein Patch/Diff wird dann wiefolgt angewandt: Erstelle ein Backup. Auf Linux kannst [...]]]></description>
			<content:encoded><![CDATA[<div class="language">
<a href="http://www.markusbe.com/2009/11/how-to-apply-a-patch-and-solve-hunk-failed-cant-find-file-to-patch-and-others/"><img src="/wp-content/themes/violet-park-2/img/us.png" width="20" height="11" alt="en" title="English"/> English</a>
</div>
<p>Hi <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nachdem du diesen Artikel gelesen hast, kannst du Patches/Diffs anwenden und mit auftretenden Fehlern umgehen.</p>
<p>Nehmen wir an, dass der Patch in der Datei <tt>fix-bug.patch</tt> ist (die Erweiterung hat keinen Einfluß). Das Verzeichnis <tt>software-1.0</tt> enthält die Dateien, die gepatcht werden sollen. Ein Patch/Diff wird dann wiefolgt angewandt:</p>
<ol style="clear: both">
<li>Erstelle ein Backup. Auf Linux kannst du das folgende Kommando verwenden:
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>cp -a software-1.0 software-1.0.before-patch</strong></pre>
</li>
<li id="patch-command-line">Rufe patch (für Windows: <a href="http://gnuwin32.sourceforge.net/downlinks/patch.php">patch.exe</a>) wiefolgt auf:
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>patch -Np1 -d software-1.0 &lt; fix-bug.patch</strong></pre>
</li>
</ol>
<p>Vorsicht: nach patch kommt <em>minus N p <strong>Eins</strong> &#8230;</em>, nicht minus N p kleines L!<br />
<span id="more-79"></span></p>
<p>Falls das Ergebnis in etwa so aussieht:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>patch -Np1 -d software-1.0 &lt; fix-bug.patch</strong>
patching file bar.h
patching file quux.c
patching file foo.txt
<span class="prompt">markus@ubuntu:~$</span></pre>
<p>dann hat es funktioniert und der Patch wurde sauber angewandt.</p>
<p>Falls du andere Ausgaben erhalten hast, können das Warnungen sein, oder Fehlermeldungen. In jedem Fall ist es möglich, dass der Patch nicht richtig oder nur teilweise angewandt wurde. Um sicher zu gehen, stell am besten das Backup wieder her. Danach kümmern wir uns um Warnungen und Fehlermeldungen. Um das Backup unter Linux wieder herzustellen:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>rm -rf software-1.0</strong>
<span class="prompt">markus@ubuntu:~$</span> <strong>cp -a software-1.0.before-patch software-1.0</strong>
</pre>
<h5 id="error-message-list">Fehler und wie man sie beseitigt</h5>
<p>Hier ist eine Liste von Fehlermeldungen die erscheinen können. Jede Fehlermeldung ist ein Link zu einem Absatz, der beschreibt, wie man den Fehler beseitigt.</p>
<ul>
<li>
<pre><strong><a href="#no-file-to-patch">can't find file to patch at input line <em>nnn</em>. File to patch:</a></strong></pre>
</li>
<li>
<pre><strong><a href="#no-file-to-patch">No file to patch. Skipping patch. <em>n</em> out of <em>n</em> hunks ignored.</a></strong></pre>
</li>
<li>
<pre><strong><a href="#hunk-failed">Hunk <em>#n</em> FAILED at <em>nnn</em>. <em>n</em> out of <em>n</em> hunks FAILED -- saving rejects to file <em>file.rej</em></a></strong></pre>
</li>
<li>
<pre><strong><a href="#hunk-succeeded">Hunk <em>#n</em> succeeded at <em>nnn</em> (offset <em>n</em> lines).</a></strong></pre>
</li>
<li>
<pre><strong><a href="#hunk-succeeded">Hunk <em>#n</em> succeeded at <em>nnn</em> with fuzz <em>n</em>.</a></strong></pre>
</li>
<li>
<pre><strong><a href="#malformed-patch">malformed patch at line <em>nnn</em></a></strong></pre>
</li>
<li><!--
<pre><strong><a href="#broken">missing header for unified diff at line <em>nnn</em> of patch</a></strong>
    </li>
<li>
<pre><strong><a href="#broken">patch: **** only garbage was found in the patch input</a></strong></pre>
</li>
<li>-->
<pre><strong><a href="#reversed-patch">Reversed (or previously applied) patch detected!  Skipping patch.</a></strong></pre>
</li>
<li>
<pre><strong><a href="#reversed-patch">Reversed (or previously applied) patch detected!  Assume -R? [n]</a></strong></pre>
</li>
<li>
<pre><strong><a href="#stripping-trailing-crs">(Stripping trailing CRs from patch.)</a></strong></pre>
</li>
<li><strong><a href="#error-message-not-listed">Fehlermeldung ist hier nicht aufgeführt</a></strong></li>
</ul>
<h6 id="no-file-to-patch">can&#8217;t find file to patch at input line <em>nnn</em>. File to patch: or<br />
No file to patch. Skipping patch. <em>n</em> out of <em>n</em> hunks ignored.</h6>
<p>Überzeuge dich zuerst, dass du den <a href="#patch-command-line">richtigen patch-Befehl</a> benutzt hast, wie oben angegeben.</p>
<p>Falls es trotzdem nicht geht, probiere es mit einem höheren <tt><strong>n</strong></tt> in <tt>-p<strong><em>n</em></strong></tt>, bis zu etwa 6 (du kannst auch noch höhere Zahlen probieren, aber die Wahrscheinlichkeit, dass das Problem eine falsche Zahl für <tt>-p</tt> ist, wird immer kleiner <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Zum Probieren gib noch <tt>--dry-run</tt> auf der Kommandozeile an. Damit wird der Patch nicht wirklich eingebaut, aber du bekommst alle Warnungen und Fehlermeldungen angezeigt. So kannst du herausfinden ob Fehler auftreten würden, ohne jedes Mal vom Backup wiederherstellen zu müssen. Hier ein Beispiel mit <tt>-p2</tt> und <tt>--dry-run</tt>:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>patch --dry-run -Np2 -d software-1.0 &lt; fix-bug.patch</strong></pre>
<p><tt>-p0</tt> ist fast immer falsch. Es bewirkt, dass <tt>patch</tt> Unterverzeichnisse ignoriert und annimmt, dass sich alle Dateien, die gepatcht werden sollen, im gleichen Verzeichnis befinden.</p>
<p>Wenn du keine Fehlermeldungen mit <em>can&#8217;t find file to patch</em> oder <em>No file to patch.</em> mehr bekommst, hast du die richtige <tt>-p</tt>-Zahl gefunden. Falls andere Fehlermeldungen erscheinen, schlage sie in der <a href="#error-message-list">Liste der Fehlermeldungen</a> nach. Wenn du einen sauberen Durchlauf ohne Fehlermeldungen hast, dann führe den Befehl noch einmal ohne <tt>--dry-run</tt> aus, um den Patch auch tatsächlich anzuwenden.</p>
<p>Falls das ganze Rumgemache mit <tt>-p</tt> nicht geholfen hat, und du immernoch die gleiche Fehlermeldung bekommst, schreib einen Kommentar <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h6 id="hunk-failed">Hunk <em>#n</em> FAILED at <em>nnn</em>. <em>n</em> out of <em>n</em> hunks FAILED &#8212; saving rejects to file <em>file.rej</em></h6>
<p>Das bedeutet, dass eine oder mehrere Änderungen, genannt Hunks, nicht in die Datei eingebaut werden konnten. Es gibt einen eher seltenen Grund, der aber am einfachsten zu überprüfen ist: Gib zusätzlich <tt>--ignore-whitespace</tt> auf der Kommandozeile an, etwa so:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>patch -Np1 --ignore-whitespace -d software-1.0 &lt; fix-bug.patch</strong>
</pre>
<p>Falls der Fehler dadurch nicht verschwindet, ist der Grund wahrscheinlich ein anderer: Der Patch wurde für eine andere Softwareversion gemacht, als du benutzt. Es gibt zwei Lösungsmöglichkeiten:</p>
<ul>
<li>Besorge einen Patch für die von dir benutzte Softwareversion, oder benutze die Softwareversion, für die der Patch erstellt wurde.</li>
<li>Lasse <tt>patch</tt> den Kontext einer Änderung ignorieren. Das führt dazu, dass <tt>patch</tt> eine Änderung eher an einer falschen Stelle einbaut, als einen Fehler auszugeben. Es kann sein, dass die Software dadurch nach dem Patchen nicht richtig funktioniert. Um den Kontext zu ignorieren, benutze zusätzlich <tt>-F3</tt>:
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>patch -Np1 -F3 -d software-1.0 &lt; fix-bug.patch</strong>
</pre>
</li>
<li>Versuche, die Änderungen im Patch von Hand einzubauen.</li>
</ul>
<h6 id="hunk-succeeded">Hunk <em>#n</em> succeeded at <em>nnn</em> (offset <em>n</em> lines) and<br />
Hunk <em>#n</em> succeeded at <em>nnn</em> with fuzz <em>n</em>.</h6>
<p>Normalerweise ist das kein Problem und der Patch wurde komplett eingebaut. Die Nachricht bedeutet, dass der Patch ursprünglich für eine andere Version der Software erstellt wurde, als du benutzt. Es ist aber trotzdem möglich, dass <tt>patch</tt> eine Änderung falsch eingebaut hat. Falls irgendetwas nicht funktioniert und du denkst, dass der Patch falsch eingebaut sein worden könnte, kannst du die gleiche Softwareversion benutzen, die auch zum Erstellen des Patches benutzt wurde, oder du kannst versuchen, einen Patch für deine Softwareversion zu bekommen.</p>
<p>Du kannst auch die Änderungen im Patch von Hand einbauen und dabei deine einmaligen menschlichen Fertigkeiten einsetzen, um sicherzustellen, dass das Ergebnis Sinn ergibt &#8211; etwas, was <tt>patch</tt> nicht kann <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h6 id="malformed-patch">malformed patch at line <em>nnn</em></h6>
<p>Der Patch ist kaputt. Falls du den Patch von irgendwoher kopiert und eingefügt hast, kann es sein, dass der Patch dabei Schaden genommen hat. Eine Patchdatei enthält unter anderem Leerzeichen am Anfang der Zeile &#8211; die gehen beim Kopieren über die Zwischenablage oft verloren. Am sichersten ist es, den Patch als Datei herunterzuladen. Falls der Browser den Patch nicht herunterlädt, sondern anzeigt, benutze Datei -> Speichern.</p>
<p>Falls du einen Patch erstellen willst, brauchst du das nicht von Hand zu tun. Das Programm <tt>diff</tt> tut das automatisch. Eine kurze Anleitung:</p>
<ol>
<li>Erstelle eine Kopie der originalen, unveränderten Softwareversion. Auf Linux:
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>cp -a software-1.0 software-1.0.orig</strong></pre>
</li>
<li>Mache die Änderungen in <tt>software-1.0</tt>.</li>
<li>Erstelle den Patch mit <tt>diff</tt>:
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>diff -Naur software-1.0.orig software-1.0 &gt; fix-bug.patch</strong></pre>
</li>
</ol>
<h6 id="reversed-patch">Reversed (or previously applied) patch detected!  Skipping patch.<br />
Reversed (or previously applied) patch detected!  Assume -R? [n]</h6>
<p>Das bedeutet, dass eine oder mehrere Änderungen des Patches bereits eingebaut sind. Das kann mehrere Gründe haben:</p>
<ul>
<li>Der Ersteller des Patches hat Original und geänderte Version verwechselt. Der Patch ist jetzt rückwärtz &#8211; er enthält Änderungen, um aus der neuen Version die Originalversion zu erstellen. Wenn die Änderungen jetzt in die Originalversion eingebaut werden sollen, stellt <tt>patch</tt> fest, dass alle Änderungen bereits da sind. Netterweise kann ein Patch aber auch rückwärts angewandt werden. Dazu benutzt man <tt>-R</tt>. Hier ist ein Beispiel:
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>patch -RNp1 -d software-1.0 &lt; fix-bug.patch</strong></pre>
</li>
<li>Deine Softwareversion hat tatsächlich bereits alle Änderungen des Patches eingebaut. Vielleicht haben die Ersteller der Software ihrerseits den Patch bereits eingebaut, und die Version, die du heruntergeladen hast, enthält bereits alle Änderungen des Patches.</li>
</ul>
<h6 id="stripping-trailing-crs">(Stripping trailing CRs from patch.)</h6>
<p>Hier gibt es nichts, worüber man sich Sorgen machen muss. Der Patch wurde sauber eingebaut und alles wird funktionieren. Der wahrscheinlichste Grund für diese Warnung ist, dass der Patch auf Windows erstellt wurde, und du ihn auf Linux anwenden möchtest. Windows und Linux legen Zeilenenden unterschiedlich ab &#8211; Windows-Zeilenenden haben ein zusätzliches <a href="http://de.wikipedia.org/wiki/Wagenr%C3%BCcklauf">CR</a>. Die Warnung bedeutet lediglich, dass Windows-Zeilenenden in Linux-Zeilenenden umgewandelt wurden. Hacker benutzen nur für gewöhnlich ihre eigene Sprache, wenn sie Fehlertexte formulieren <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h6 id="error-message-not-listed">Fehlermeldung ist hier nicht aufgeführt</h6>
<p>Bitte erstelle ein Kommentar mit dem Fehlertext und, falls möglich, einem Link zu dem Patch und einem zu der Software, in die du den Patch einbauen willst. Ich füge dann die Fehlermeldung und eine Erklärung zu dieser Liste hinzu.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.markusbe.de%2F2009%2F12%2Fwie-man-einen-patch-anwendet-und-hunk-failed-cant-find-file-to-patch-und-andere-loest%2F&amp;title=Wie%20man%20einen%20Patch%20anwendet%20und%20%26%238220%3Bhunk%20FAILED%26%238221%3B%2C%20%26%238220%3Bcan%26%238217%3Bt%20find%20file%20to%20patch%26%238221%3B%20und%20andere%20l%C3%B6st"><img src="http://www.markusbe.de/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.markusbe.de/2009/12/wie-man-einen-patch-anwendet-und-hunk-failed-cant-find-file-to-patch-und-andere-loest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Über 32-Bit-Programme auf 64-Bit-Ubuntu und gemeinsam genutzte Bibliotheken</title>
		<link>http://www.markusbe.de/2009/09/ueber-32-bit-programme-auf-64-bit-ubuntu-und-gemeinsam-genutzte-bibliotheken/</link>
		<comments>http://www.markusbe.de/2009/09/ueber-32-bit-programme-auf-64-bit-ubuntu-und-gemeinsam-genutzte-bibliotheken/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 19:45:45 +0000</pubDate>
		<dc:creator>Markus Bertheau</dc:creator>
				<category><![CDATA[Hintergrund]]></category>

		<guid isPermaLink="false">http://www.markusbe.de/?p=46</guid>
		<description><![CDATA[English Русский Schnelle Antwort Um 32-Bit-Programme auf 64-Bit-Installationen von Ubuntu auszuführen, installiere das Paket ia32-libs: markus@ubuntu:~$ sudo apt-get install ia32-libs Lange Geschichte Ich habe diesen Artikel geschrieben, um deine Kenntnisse und dein Verständnis davon, wie Linux funktioniert, zu erweitern. Diese Kenntnisse sollen deine Fähigkeiten zur Problemlösung im Bereich Serveradministration und Benutzung der Kommandozeile verbessern. Ich [...]]]></description>
			<content:encoded><![CDATA[<div class="language">
<a href="http://www.markusbe.com/2009/09/about-running-32-bit-programs-on-64-bit-ubuntu-and-shared-libraries/"><img src="/wp-content/themes/violet-park-2/img/us.png" width="20" height="11" alt="en" title="English"/> English</a> <a href="http://www.markusbe.ru/2009/10/%d0%ba%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d1%82%d0%b8%d1%82%d1%8c-32-%d0%b1%d0%b8%d1%82%d0%bd%d1%8b%d0%b5-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d1%8b-%d0%bd%d0%b0-64-%d0%b1%d0%b8/"><img src="/wp-content/themes/violet-park-2/img/ru.png" width="20" height="14" alt="ru" title="Русский"/> Русский</a>
</div>
<h5>Schnelle Antwort</h5>
<p>Um 32-Bit-Programme auf 64-Bit-Installationen von Ubuntu auszuführen, installiere das Paket <tt>ia32-libs</tt>:</p>
<pre style="clear: both;"><span class="prompt">markus@ubuntu:~$</span> <strong>sudo apt-get install ia32-libs</strong>
</pre>
<h4>Lange Geschichte</h4>
<p>Ich habe diesen Artikel geschrieben, um deine Kenntnisse und dein Verständnis davon, wie Linux funktioniert, zu erweitern. Diese Kenntnisse sollen deine Fähigkeiten zur Problemlösung im Bereich Serveradministration und Benutzung der Kommandozeile verbessern. Ich zeige, wie ich ein Shell-Skript zur Installation eines kommerziellen Softwarepakets, Flash<sup>®</sup> Media Server, das für RedHat Linux geschrieben wurde, an 64-Bit Ubuntu Linux angepasst habe. Für jedes Symptom, das dabei aufgetaucht ist, erkläre ich das Problem und wie man es löst. Das Endergebnis kann man im Artikel <a href="http://www.markusbe.de/2009/09/flash-media-server-auf-ubuntu-linux-installieren/">Flash<sup>®</sup> Media Server auf Ubuntu Linux installieren</a> sehen.</p>
<p>Dieser Artikel ist der erste Teil einer Serie zu diesem Thema. Ich schreibe in ihm darüber, wie 32-Bit-Programme auf 64-Bit-Betriebssystemen ausgeführt werden und über das Konzept der gemeinsam genutzen Bibliotheken (shared libraries).</p>
<p><span id="more-46"></span></p>
<p>Die genauen Versionen der Software, die ich hier im Folgenden benutze, sind <a href="http://www.ubuntu.com/getubuntu/releasenotes/804overview">Ubuntu 8.04 LTS 64-Bit Server</a> und <a href="http://download.macromedia.com/pub/flashmediaserver/updates/3_5_2/Linux/FlashMediaServer3.5.tar.gz">Flash<sup>®</sup> Media Server 3.5.2</a>, falls du den Artikel direkt nachvollziehen möchtest.</p>
<h5>32 Bit auf 64 Bit</h5>
<p>Wenn du den unveränderten Installer ausführst, bekommst du eine Fehlermeldung darüber, dass die Datei <tt>fmsini</tt> nicht gefunden wurde:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>tar xfz <a href="http://download.macromedia.com/pub/flashmediaserver/updates/3_5_2/Linux/FlashMediaServer3.5.tar.gz">FlashMediaServer3.5.tar.gz</a></strong>
<span class="prompt">markus@ubuntu:~$</span> <strong>sudo FMS_3_5_2_r654/installFMS</strong>
FMS_3_5_2_r654/installFMS: 172: FMS_3_5_2_r654/fmsini: not found</pre>
<p>Diese Fehlermeldung ist ziemlich irreführend. Die Datei <tt>fmsini</tt> existiert und es ist eine ausführbare Datei für 32 Bit:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>file FMS_3_5_2_r654/fmsini </strong>
fmsini: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux
2.2.5, dynamically linked (uses shared libs), stripped</pre>
<p>Warum dann die Fehlermeldung &#8220;<tt>not found</tt>&#8220;?</p>
<p>Die Meldung bezieht sich nicht auf die Datei <tt>fmsini</tt>, sondern auf ein spezielles Hilfsprogramm, das benötigt wird, um die 32-Bit dynamisch gelinkte ausführbare Datei <tt>fmsini</tt> auszuführen.</p>
<h6>Statisches und dynamisches Linken</h6>
<p>Es gibt zwei Typen von binären ausführbaren Dateien: statisch gelinkte und dynamisch gelinkte. Zuerst über die <em>statisch gelinkten</em>: Wenn ein Programm eine Bibliotheksfunktion aufrufen will, tut es das über ihren Namen. Wenn das Programm aus dem Quellcode erstellt wird, werden alle Bibliotheksfunktionen, die in dem Programm benutzt werden, von der Bibliothek ins Programm kopiert. Das Programm enthält dann seinen eigenen Code sowie den Code der Bibliotheksfunktionen, die es benutzt. Danach wird an den Stellen, an denen eine Bibliotheksfunktion aufgerufen wird, der Name der Bibliotheksfunktion mit ihrer Adresse im Programm ersetzt. Diesen Vorgang nennt man <em>Linken</em>, weil er die Namen der Funktionen mit der Funktion selber, ihrer Implementation, verknüpft (linkt). Der Vorgang heißt <em>statisch</em>, weil die Verbindung nicht mehr geändert werden kann, nachdem das Programm aus dem Quellcode erstellt wurde.</p>
<p>Dynamisch gelinkte Programme funktionieren anders: Das Programm bezieht sich auf Bibliotheksfunktionen genauso mit ihren Namen. Wenn das Programm aus dem Quellcode erstellt wird, werden zwei Listen erstellt: eine Liste darüber, welche Bibliotheksfunktionen an welchen Stellen im Programm benutzt werden, und eine Liste der Bibliotheken, die die benutzten Funktionen enthalten. Damit ist das Programm fertig.</p>
<p>Später, wenn das Programm <em>ausgeführt</em> wird, sucht ein Hilfsprogramm, der sogenannte dynamische Linker, an bestimmten Stellen im Dateisystem nach jeder Bibliothek in der Liste und lädt sie in den Arbeitsspeicher. Jetzt weiß der dynamische Linker an welcher Speicheradresse die Bibliotheksfunktionen zur Verfügung stehen. Er benutzt die erste Liste um im Programm die richtigen Adressen an die Stellen zu schreiben, an denen Bibliotheksfunktionen aufgerufen werden. Dann kann das dynamisch gelinkte Programm ausgeführt werden.</p>
<h6>Vor- und Nachteile</h6>
<p>Der größte Nachteil von statisch gelinkten ausführbaren Dateien liegt im nicht realisierten Potenzial zur gemeinsamen Benutzung durch mehrere Programme. Als Folge sind Programme erstens größer und brauchen mehr Platz auf der Festplatte und im Arbeitsspeicher. Dieser zusätzliche Platz ist oft mit wieder und wieder den selben Bibliotheksfunktionen belegt, weil sie in einer Menge von Programmen benutzt werden. Zweitens muss nach einem Sicherheits- oder Fehlerbehebungsupdate der Bibliothek das Programm neu aus dem Quellcode erstellt und zum Anwender gebracht werden, was sehr aufwendig sein kann.</p>
<p>Dynamisch gelinkte ausführbare Dateien lösen diese Probleme: Gemeinsam genutzte Bibliotheken existieren ein Mal auf der Festplatte und ein Mal im Arbeitsspeicher. Die Programme selbst sind kleiner, weil sie keinen Bibliothekscode enthalten. Bibliotheken können unabhängig von den Programmen, die sie benutzen, aktualisiert werden. Die Programme selber müssen nicht verändert werden, sondern nur neu gestartet.</p>
<p>Dynamisches Linken bringt aber auch Nachteile: Es ist mehr Infrastrutktur nötig um gemeinsam genutzte Bibliotheken zu unterstützen: die Bibliotheken selbst in der richtigen Version und ein komplizierterer Programmlader. In einigen Situationen wiegen diese Nachteile zu schwer, so dass statisch gelinkte Programme benutzt werden. Diese brauchen nur sich selbst um ausgeführt zu werden und haben keine Abhängigkeiten und Kompatibilitätsprobleme.</p>
<h6>Der dynamische Linker</h6>
<p>Der dynamische Linker hat eine man-Seite: <a href="http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html"><tt>ld.so(8)</tt></a>. Bis 1995/96 hieß der dynamische Linker in Linux <tt>ld.so</tt>. Jetzt ist die 32-Bit-Version in <tt>/lib/ld-linux.so.2</tt>, und die 64-Bit-Version in <tt>/lib64/ld-linux-x86-64.so.2</tt>. Die man-Seite hat den alten Namen beibehalten.</p>
<p>Die 64-Bit-Version von Ubuntu Linux kann ab Werk <em>statisch gelinkte</em> 32-Bit-Programme ausführen. Der dynamische Linker für 32-Bit-Programme ist aber standardmäßig nicht installiert. Er ist im Paket <tt>libc6-i386</tt>. Nach man dieses Paket installiert hat, existiert die Datei <tt>/lib/ld-linux.so.2</tt>, und der erste Schritt hin zu funktionierenden 32-Bit dynamisch gelinkten Programmen ist getan.</p>
<h6>Gemeinsam genutzte Bibliotheken (shared libraries)</h6>
<p>Nachdem du <tt>libc6-i386</tt> installiert hast, bekommst du eine andere Fehlermeldung, wenn du versuchst, <tt>fmsini</tt> auszuführen:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>FMS_3_5_2_r654/fmsini</strong>
FMS_3_5_2_r654/fmsini: error while loading shared libraries: libstdc++.so.6:
cannot open shared object file: No such file or directory
</pre>
<p>Die Meldung kommt vom dynamischen Linker, der versucht hat, alle Bibliotheken in der Liste zu laden, und dabei eine nicht finden konnte.</p>
<p>Bibliotheken, die von dynamisch gelinkten Programmen benutzt werden, heißen gemeinsam genutzte Bibliotheken (shared libraries). Wenn der dynamische Linker feststellt, dass eine bestimmte Bibliothek bereits geladen wurde, kann er das neue Programm darauf verweisen, anstatt die Bibliothek ein zweites Mal zu laden. So wird eine Bibliothek, die einmal geladen wurde, von mehreren Programmen gemeinsam genutzt.</p>
<p>Gemeinsam genutzte Bibliotheken befinden sich in Dateien, die <tt>.so</tt> in ihrem Namen haben. <tt>so</tt> steht für <em>shared object</em> (gemeinsam genutztes Objekt). &#8220;Objekt&#8221; meint dabei einfach kompilierten, binären Code.</p>
<p><a href="http://www.kernel.org/doc/man-pages/online/pages/man1/ldd.1.html"><tt>ldd(1)</tt></a> zeigt an, welche gemeinsam genutzten Bibliotheken ein Programm benötigt, und wo der dynamische Linker sie gefunden hat, falls er das hat:</p>
<pre><span class="prompt">markus@ubuntu:~$</span> <strong>ldd FMS_3_5_2_r654/fmsini</strong>
	linux-gate.so.1 =>  (0xf7fc8000)
	libpthread.so.0 => /lib32/libpthread.so.0 (0xf7fa0000)
	libdl.so.2 => /lib32/libdl.so.2 (0xf7f9c000)
	libstdc++.so.6 => not found
	libm.so.6 => /lib32/libm.so.6 (0xf7f75000)
	libgcc_s.so.1 => not found
	libc.so.6 => /lib32/libc.so.6 (0xf7e12000)
	/lib/ld-linux.so.2 (0xf7fc9000)
</pre>
<p>Der dynamische Linker sucht in einer Reihe von Verzeichnissen nach Bibliotheken &#8211; die <a href="http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html">man-Seite</a> geht darauf detailliert ein. Die beiden fehlenden Bibliotheken sind in den Paketen <tt>lib32stdc++6</tt> und <tt>lib32gcc1</tt>.</p>
<p><tt>ldd</tt> ist übrigens nur ein Shell-Skript, das den dynamischen Linker aufruft. Wenn man ihm nichts anderes sagt, lädt der dynamische Linker alle Bibliotheken und führt das Programm aus. <tt>ldd</tt> ruft den dynamischen Linker mit Argumenten auf, die ihn anweisen, Informationen über die vom Programm benötigten gemeinsam genutzten Bibliotheken auszugeben.</p>
<p>Heutzutage ist die Mehrheit der Programme dynamisch gelinkt und benutzt gemeinsam genutzte Bibliotheken. Die Installation von Ubuntu hat über 400 gemeinsam genutzte 64-Bit-Bibliotheken. Das Paket <tt>ia32-libs</tt> in Ubuntus Universe-Repository enthält die am häufigsten gebrauchten gemeinsam genutzten Bibliotheken als 32-Bit-Version. Wenn dieses Paket installiert ist, läuft eine Menge 32-Bit-Programme auf 64-Bit-Ubuntu. Insbesondere läuft auch der Installer des Flash<sup>®</sup> Media Server durch (aus anderen Gründen funktioniert er aber noch nicht richtig). Der Flash<sup>®</sup> Media Server selbst braucht allerdings noch Bibliotheken, die nicht in dem Paket enthalten sind. Wie dieses Problem gelöst wird, ist ein Thema eines späteren Teils dieser Serie.</p>
<h5>Feedback</h5>
<p>Feedback ist extrem wichtig für mich, weil es mir Hinweise darauf gibt, was ich anders machen muss und was ich beibehalten sollte um mein Ziel zu erreichen. Mein Ziel ist, dass dieser Artikel für dich interessant und nützlich ist, wie im ersten Absatz beschrieben. Zögere nicht, einen Kommentar dazu zu hinterlassen, welche Abschnitte schwer verständlich geschrieben sind, was hätte weggelassen werden können und was gefehlt hat. Ich würde auch gern von dir hören, falls es in diesem Artikel etwas gab, was du als besonders gelungen bezeichnen könntest. Danke <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.markusbe.de%2F2009%2F09%2Fueber-32-bit-programme-auf-64-bit-ubuntu-und-gemeinsam-genutzte-bibliotheken%2F&amp;title=%C3%9Cber%2032-Bit-Programme%20auf%2064-Bit-Ubuntu%20und%20gemeinsam%20genutzte%20Bibliotheken"><img src="http://www.markusbe.de/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.markusbe.de/2009/09/ueber-32-bit-programme-auf-64-bit-ubuntu-und-gemeinsam-genutzte-bibliotheken/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Flash® Media Server auf Ubuntu Linux installieren</title>
		<link>http://www.markusbe.de/2009/09/flash-media-server-auf-ubuntu-linux-installieren/</link>
		<comments>http://www.markusbe.de/2009/09/flash-media-server-auf-ubuntu-linux-installieren/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 04:49:43 +0000</pubDate>
		<dc:creator>Markus Bertheau</dc:creator>
				<category><![CDATA[praktisch]]></category>

		<guid isPermaLink="false">http://www.markusbe.de/?p=19</guid>
		<description><![CDATA[English Русский Führe die folgenden Befehle aus, um Flash® Media Server auf Ubuntu zu installieren: markus@ubuntu:~$ wget markusbe.com/ifu markus@ubuntu:~$ bash ./install-fms-3.5.3-ubuntu Die Befehle laden das Install-Skript herunter und führen es aus. Unterstützte Ubuntu-Versionen Ubuntu-Version 32 Bit 64 Bit 10.04 LTS Server Unterstützt Unterstützt Desktop Unterstützt Unterstützt 9.10 Server Unterstützt Unterstützt Desktop Unterstützt Unterstützt 9.04 Server [...]]]></description>
			<content:encoded><![CDATA[<p><a id="2009-09-install-fms-ubuntu-top"></a></p>
<div class="language">
<a href="http://www.markusbe.com/2009/09/installing-flash-media-server-on-ubuntu-linux/"><img src="/wp-content/themes/violet-park-2/img/us.png" width="20" height="11" alt="us" title="English"/> English</a> <a href="http://www.markusbe.ru/2009/09/%d1%83%d1%81%d1%82%d0%b0%d0%bd%d0%be%d0%b2%d0%ba%d0%b0-flash-media-server-%d0%bd%d0%b0-ubuntu/"><img src="/wp-content/themes/violet-park-2/img/ru.png" width="20" height="12" alt="ru" title="Русский"/> Русский</a>
</div>
<p>Führe die folgenden Befehle aus, um Flash<sup>®</sup> Media Server auf Ubuntu zu installieren:</p>
<pre style="clear: both;"><span class="prompt">markus@ubuntu:~$</span> <strong>wget <a href="http://www.markusbe.com/ifu">markusbe.com/ifu</a></strong>
<span class="prompt">markus@ubuntu:~$</span> <strong>bash ./install-fms-3.5.3-ubuntu</strong></pre>
<p>Die Befehle laden das <a href="http://www.markusbe.com/wp-content/uploads/2009/09/install-fms-3.5.3-ubuntu">Install-Skript</a> herunter und führen es aus.</p>
<h4>Unterstützte Ubuntu-Versionen</h4>
<table border="0">
<thead>
<tr>
<th colspan="2">Ubuntu-Version</th>
<th>32 Bit</th>
<th>64 Bit</th>
</tr>
</thead>
<tbody>
<tr>
<th class="line" rowspan="2">10.04 LTS</th>
<th class="line">Server</th>
<td>Unterstützt</td>
<td>Unterstützt</td>
</tr>
<tr>
<th>Desktop</th>
<td>Unterstützt</td>
<td>Unterstützt</td>
</tr>
<tr>
<th class="line" rowspan="2">9.10</th>
<th class="line">Server</th>
<td>Unterstützt</td>
<td>Unterstützt</td>
</tr>
<tr>
<th>Desktop</th>
<td>Unterstützt</td>
<td>Unterstützt</td>
</tr>
<tr>
<th class="line" rowspan="2">9.04</th>
<th class="line">Server</th>
<td>Unterstützt</td>
<td>Unterstützt</td>
</tr>
<tr>
<th>Desktop</th>
<td>Unterstützt</td>
<td>Unterstützt</td>
</tr>
<tr>
<th class="line">8.10</th>
<th class="line">Desktop</th>
<td>Unterstützt</td>
<td>Unterstützt, aber<sup>*</sup></td>
</tr>
<tr>
<th class="line" rowspan="2">8.04 LTS</th>
<th class="line">Server</th>
<td>Unterstützt</td>
<td>Unterstützt, aber<sup>*</sup></td>
</tr>
<tr>
<th>Desktop</th>
<td>Unterstützt</td>
<td>Unterstützt, aber<sup>*</sup></td>
</tr>
<tr>
<th>6.06 LTS</th>
<th>Server</th>
<td>Unterstützt</td>
<td>Unterstützt, aber<sup>*</sup></td>
</tr>
</tbody>
</table>
<p><span id="more-19"></span></p>
<p><sup>*</sup> Es werden Dateien am Paketmanager vorbei installiert. Das bedeutet, dass diese Dateien vom Paketmanager nicht aktuell gehalten werden.</p>
<h4>Was macht das Skript?</h4>
<p>Das Skript</p>
<ol>
<li>prüft, ob deine Linux-Version und Plattform (32 oder 64 Bit) unterstützt werden</li>
<li>lädt Flash<sup>®</sup> Media Server 3.5.3 von <a href="http://www.adobe.com/support/flashmediaserver/downloads_updaters.html">dieser Seite auf Adobe.com</a> herunter, falls es die Datei lokal nicht findet</li>
<li>packt das Archiv aus und überprüft seine Version</li>
<li>installiert Abhängigkeiten für die Ubuntu-Version und Platform auf der es gestartet wurde</li>
<li>lädt einen <a href="http://www.markusbe.com/wp-content/uploads/2009/09/flash-media-server-3.5.3-ubuntu.patch">Patch</a> für den Installer des Flash<sup>®</sup> Media Server herunter und wendet ihn an (der Patch passt den Installer an Ubuntu Linux an)</li>
<li>startet den Flash<sup>®</sup> Media Server Installer</li>
</ol>
<h4>Starten und stoppen, manuell und automatisch</h4>
<p>Um den Flash<sup>®</sup> Media Server neu zu starten, zu stoppen oder zu starten, benutze die Befehle:</p>
<pre>markus@ubuntu:~$ <strong>sudo /etc/init.d/fms restart</strong>
</pre>
<pre>markus@ubuntu:~$ <strong>sudo /etc/init.d/fms stop</strong>
</pre>
<pre>markus@ubuntu:~$ <strong>sudo /etc/init.d/fms start</strong>
</pre>
<p>Flash<sup>®</sup> Media Server startet automatisch beim Hochfahren. Das kann man ausschalten:</p>
<pre>markus@ubuntu:~$ <strong>sudo /usr/sbin/update-rc.d fms remove</strong>
</pre>
<p>Und auch später wieder anschalten:</p>
<pre>markus@ubuntu:~$ <strong>sudo /usr/sbin/update-rc.d fms defaults</strong>
</pre>
<h4>Deinstallation</h4>
<p>Du kannst den Flash<sup>®</sup> Media Server später deinstallieren:</p>
<pre>markus@ubuntu:~$ <strong>cd /opt/adobe/fms</strong>
markus@ubuntu:/opt/adobe/fms$ <strong>sudo ./uninstallFMS</strong></pre>
<h4>Fehlerbehebung</h4>
<p>Mögliche Fehlerquellen:</p>
<ul>
<li><strong>Virtual Server-Limits:</strong> Wenn Flash<sup>®</sup> Media Server auf einem virtuellen Server läuft, sieh mal nach der Datei <tt>/proc/user_beancounters</tt>. Diese Datei existiert wenn der Server mit Virtuozzo oder OpenVZ virtualisiert wird. Sie enthält eine Liste von Ressourcen, ihren aktuellen Wert, den maximal erlaubten Wert, und wie oft der maximale Wert erreicht wurde (<tt>failcnt</tt>). Wenn sich der <tt>failcnt</tt> für eine Ressource erhöht, während du versuchst, Flash<sup>®</sup> Media Server zu starten, muss der Maximalwert hochgesetzt werden. Das geht nur von außerhalb des virtuellen Servers.</li>
</ul>
<p>Ich ergänze hier andere Fehlerquellen sobald ich von ihnen erfahre.</p>
<h4>Symptome</h4>
<p>Wenn man versucht, Flash<sup>®</sup> Media Server ohne das Skript zu installieren, erscheinen eine Reihe von Warnungen und Fehlermeldungen. Ich führe diese hier auf, damit Leute, die nach ihnen suchen, diesen Artikel finden können.</p>
<p>Wenn du einen 64-Bit-Ubuntu benutzt und die Unterstützung für 32-Bit-Programme nicht installiert hast, kommt diese Fehlermeldung:</p>
<pre>./installFMS: 172: ./fmsini: not found
</pre>
<p>Und danach:</p>
<pre>./fmsini: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
</pre>
<p>Danach, unabhängig von der Plattform, kommt eine Warnung des Installers:</p>
<pre>WARNING: Your distribution, unknown, is not supported by this
         Adobe Flash Media Server installer.
</pre>
<p>Dann, wenn man die Standardvorgabe akzeptiert, ein Fehler dass die Gruppe nobody nicht existiert:</p>
<pre>Please enter a valid user group for the "nobody" user: Default group [nobody]: 

ERROR: "nobody" is not in the user group "nobody"
</pre>
<p>Wenn du dieses Problem gelöst hast, indem du z.B. nogroup eingegeben hast, kommt als nächstes ein Syntaxfehler:</p>
<pre>[: 1: ==: unexpected operator
</pre>
<p>oder</p>
<pre>[: 1: nobody: unexpected operator
</pre>
<p>Dann beginnt die Installation, während derer aber eine Reihe weiterer Fehler erscheinen.</p>
<pre>Proceed with the installation? (y/n/q): y

Installing Adobe Flash Media Server files...
Configuring Adobe Flash Media Server...
Adding "fms" service.
Setting default admin to "fms".
chgrp: invalid group: `nobody'
./installFMS: 1348: /sbin/chkconfig: not found
Setting autostart for "fms".
Server:fms command:start
ulimit: 30: Illegal option -u
[: 35: 32768: unexpected operator
NPTL 2.7
./server: 56: Bad substitution
Admin server:fmsadmin command:start
./adminserver: 41: Bad substitution

The Adobe Flash Media Server installation is complete.</pre>
<p>Wenn du eine dieser Fehlermeldungen bekommen hast, schau dir <a href="#2009-09-install-fms-ubuntu-top">den Anfang dieses Artikels</a> an.</p>
<h4 id="2009-09-install-fms-ubuntu-background-article">Hintergrundartikel</h4>
<p>Es gibt einen Hintergrundartikel <a href="http://www.markusbe.de/2009/09/ueber-32-bit-programme-auf-64-bit-ubuntu-und-gemeinsam-genutzte-bibliotheken/">Über 32-Bit-Programme auf 64-Bit-Ubuntu und gemeinsam genutzte Bibliotheken</a>, der detailliert erklärt, was man tun muss und warum, um Flash<sup>®</sup> Media Server auf Ubuntu zum laufen zu bringen, und wie der Patch und das Install-Skript das erreichen.</p>
<h4>Feedback</h4>
<p>Mich interessiert, ob alles geklappt hat. Besonders, wenn es nicht geklappt hat <img src='http://www.markusbe.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  , dann kann ich berichtigen, was falsch ist. Zögere nicht, einen Kommentar zu hinterlassen und deine Erfahrung zu teilen.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.markusbe.de%2F2009%2F09%2Fflash-media-server-auf-ubuntu-linux-installieren%2F&amp;title=Flash%3Csup%3E%C2%AE%3C%2Fsup%3E%20Media%20Server%20auf%20Ubuntu%20Linux%20installieren"><img src="http://www.markusbe.de/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://www.markusbe.de/2009/09/flash-media-server-auf-ubuntu-linux-installieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

