<?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.ru &#187; подробности</title>
	<atom:link href="http://www.markusbe.ru/category/%d0%bf%d0%be%d0%b4%d1%80%d0%be%d0%b1%d0%bd%d0%be%d1%81%d1%82%d0%b8/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.markusbe.ru</link>
	<description>ясно, коротко, правильно, исчерпывающе</description>
	<lastBuildDate>Sun, 02 May 2010 14:31:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Как запустить 32-битные программы на 64-битном Ubuntu и о библиотеках общего пользования</title>
		<link>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/</link>
		<comments>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/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 19:43:35 +0000</pubDate>
		<dc:creator>Markus Bertheau</dc:creator>
				<category><![CDATA[подробности]]></category>

		<guid isPermaLink="false">http://www.markusbe.ru/?p=28</guid>
		<description><![CDATA[
 Deutsch  English

Быстрый ответ
Чтобы запукались 32-битные программы на 64-битном Ubuntu, установи пакет ia32-libs:
markus@ubuntu:~$ sudo apt-get install ia32-libs

Длинная история
Я написал эту статью чтобы расширить твои понимание и знания о том, как функционирует Linux. Эти знания должны улучшить твое умение и скорость решать проблемы в области администрирования серверов и использования командной строки. Я покажу, как адаптировал [...]]]></description>
			<content:encoded><![CDATA[<div class="language">
<a href="http://www.markusbe.de/2009/09/ueber-32-bit-programme-auf-64-bit-ubuntu-und-gemeinsam-genutzte-bibliotheken/"><img src="/wp-content/themes/violet-park-2/img/de.png" width="20" height="12" alt="de" title="Deutsch"/> Deutsch</a> <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>
</div>
<h5>Быстрый ответ</h5>
<p>Чтобы запукались 32-битные программы на 64-битном Ubuntu, установи пакет <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>Длинная история</h4>
<p>Я написал эту статью чтобы расширить твои понимание и знания о том, как функционирует Linux. Эти знания должны улучшить твое умение и скорость решать проблемы в области администрирования серверов и использования командной строки. Я покажу, как адаптировал скрипт командной оболочки для установки коммерческого пакета Flash<sup>®</sup> Media Server, который был написан для RedHat Linux, к работе на 64-битной версии Ubuntu Linux. Для каждой ошибки, которая возникает в процессе, я объясню проблему, стоящую за ней, и как ее решить. Конечный результат можно увидеть в статье <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/">Установка Flash<sup>®</sup> Media Server на Ubuntu</a>.</p>
<p>Это первая статья в серии на эту тему. В ней я пишу о том, как запустить 32-битные программы на 64-битных операционных системах, и об идее библиотек общего пользования (shared libraries).<br />
<span id="more-28"></span></p>
<p>Точные версии ПО, используемого в статье &#8211; <a href="http://www.ubuntu.com/getubuntu/releasenotes/804overview">Ubuntu 8.04 LTS 64-Bit Server</a> и <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>, если ты хочешь попробовать и увидеть все сам на своем компьютере.</p>
<h5>32 бита на 64 битах</h5>
<p>Если запустишь неизмененный скрипт, ты получишь ошибку о не найденном файле <tt>fmsini</tt>:</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>Эта ошибка вводит в заблуждение. <tt>fmsini</tt> существует и является 32-битным выполняемым файлом:</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>Почему тогда ошибка «<tt>not found</tt>»?</p>
<p>Дело в том, что сообщение имеет в виду не файл <tt>fmsini</tt>, а специальную вспомогательную программу, которая нужна для выполнения 32-битного динамически компонованного (dynamically linked) выполняемого файла <tt>fmsini</tt>.</p>
<h6>Статическая и динамическая компоновка</h6>
<p>Есть два типа выполняемых файлов: статически компонованные и динамически компонованные. Сначала о <em>статически компонованных</em>: Когда программа хочет вызвать библиотечную функцию, она использует название функции. Когда программа собирается из исходных файлов, все библиотечные функции, используемые в программе, копируются в программу. Программа после этого содержит и свой собственный код и код используемых библиотечных функции. Затем в местах, в которых вызывается библиотечная функция, имя функции заменяется ее адресом в программе. Этот процесс по-английски называется linking (компоновка), потому что он связывает название функции с ее реализацией, с ее кодом. Он статический, потому что связь не может быть изменена после того, как программа собрана.</p>
<p>Динамически компонованные программы функционируют по-другому: Программа также использует для вызова библиотечных функции ее название. Когда программа собирается, составляются два списка и сохраняются вместе с программой: список названий используемых библиотечных функций вместе с местами их вызова, и список библиотек, содержащих функции, используемые программой. Этим сборка программы заканчивается.</p>
<p>Позже, в <em>момент запуска</em>, специальная вспомогательная программа, так называемый динамический компоновщик, ищет каждую библиотеку в первом списке в определенных местах файловой системы и загружает ее в оперативную память. Теперь динамический компоновщик знает, на каком адресе лежит каждая библиотечная функция. Он проходит по первому списку, чтобы прописать правильные адреса во всех местах, в которых вызывается библиотечная функция. Затем начинается выполнение динамически компонованной программы.</p>
<h6>Преимущества и недостатки</h6>
<p>Самый большой недостаток статической компоновки происходит от нереализованной возможности совместного использования библиотек. Во первых, из-за этого программы становятся большего размера и соответственно занимают больше места на жестком диске и в оперативной памяти. В этом занимаемом месте часто одни и те же библиотечные функции, потому что они используются во многих программах. Во вторых, когда выходит обновление библиотеки, программы нужно пересобирать и обновлять у пользователей. А это может стоить дорого.</p>
<p>Динамическая компоновка решает эти проблемы: библиотеки общего пользования существуют в единственном экземпляре на жестком диске и загружаются в оперативную память один раз. Из-за отсутствия библиотечного кода программы меньше. Библиотеки можно обновить независимо от программ, которые их используют. Сами программы обновлять не нужно, достаточно просто перезапустить их.</p>
<p>Однако поддержка динамических библиотек повышаeт требования к системе: нужна более сложная инфраструктура, а именно сами библиотеки в нужных версиях, и более сложный загрузчик. Бывают сценарии, в которых неразумно соответствовать этим требованиям, и поэтому используются статистически компонованные программы. Они самодостаточны, не зависят ни от чего и имеют при себе совместимые версии нужных им библиотек.</p>
<h6>Динамический компоновщик</h6>
<p>Есть страница руководства о динамическом компоновщике: <a href="http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html"><tt>ld.so(8)</tt></a>. <tt>ld.so</tt> &#8211; имя динамического компоновщика в Linux до 1995/96 года. Сейчас, для 32-битных программ, компоновщик в файле <tt>/lib/ld-linux.so.2</tt>, а для 64-битных в <tt>/lib64/ld-linux-x86-64.so.2</tt>. Страница руководства продолжает носить имя старого компоновщика.</p>
<p>В 64-битном Ubuntu Linux встроена возможность выполнять 32-битные <em>статически компонованные</em> программы. Однако, динамический компоновщик по умолчанию не устанавливается. Он находится в пакете <tt>libc6-i386</tt>. После его установки файл <tt>/lib/ld-linux.so.2</tt> существует, и это первый шаг к возможности выполнять 32-битные динамически компонованные программы.</p>
<h6>Библиотеки общего пользования</h6>
<p>После установки <tt>libc6-i386</tt> и при попытке запустить <tt>fmsini</tt>, ты получишь другую ошибку:</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>Это динамический компоновщик, который, пытаясь загрузить все библиотеки в списке, не может найти одну из них.</p>
<p>Библиотеки, используемые динамически компонованными программами, называются библиотеки общего пользования (shared libraries). Когда динамический компоновщик находит, что данная библиотека уже загружена, он не загружает ее второй раз, а использует уже загруженную библиотеку для новой программы. Таким образом библиотека, загруженная один раз, используется несколькими программами.</p>
<p>Файлы библиотек общего пользования имеют строку <tt>.so</tt> в своем имени. <tt>so</tt> означает shared object (объект общего пользования). &laquo;Объект&raquo; имеет в виду всего лишь компилированный, бинарный код.</p>
<p><a href="http://www.kernel.org/doc/man-pages/online/pages/man1/ldd.1.html"><tt>ldd(1)</tt></a> показывает, какие библиотеки нужны программе, и где динамический компоновщик их нашел, если нашел:</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>Динамический компоновщик ищет библиотеки в нескольких местах &#8211; на <a href="http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html">странице руководства</a> все подробности об этом. Две отсутствующие библиотеки находятся в пакетах <tt>lib32stdc++6</tt> и <tt>lib32gcc1</tt> соответственно.</p>
<p><tt>ldd</tt>, между прочим, всего лишь скрипт командной оболочки, который вызывает динамический компоновщик. Если вызвать его без аргументов, он загружает все библиотеки и запускает программу. <tt>ldd</tt> вызывает его с такими аргументами, чтобы он вывел информацию о библиотеках общего пользования, требуемых программой.</p>
<p>Сегодня большинство программ &#8211; динамически компонованные и используют библиотеки общего пользования. В стандартной установке Ubuntu более чем 400 64-битных библиотек общего пользования. Пакет <tt>ia32-libs</tt> из репозитория Ubuntu universe содержит наиболее часто используемые библиотеки в 32-битной версии. Установка этого пакета позволяет выполнить многие из 32-битных программ на 64-битном Ubuntu. В частности, установщик Flash<sup>®</sup> Media Server выполняется (но по другим причинам еще не функционирует правильно). Flash<sup>®</sup> Media Server сам, однако, нуждается в библиотеках, которых нет в этом пакете. Как эта проблема решается &#8211; тема для другой части этой серии.</p>
<h5>Обратная связь</h5>
<p>Обратная связь для меня очень важна, потому что она дает подсказки, что мне нужно делать по-другому, и что нужно оставить как есть, чтобы я достиг своей цели. Моя цель &#8211; чтобы эта статья была для тебя интересной и полезной, как я описал в первом абзаце. Пожалуйста, не стесняйся оставить комментарий о том, какие части написаны так, что понимание от этого страдает, что можно было пропустить, или чего не хватает. Если есть что-то, что тебе особенно понравилось в этой статье, я также хочу об этом услышать. Спасибо <img src='http://www.markusbe.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>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/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
