Как запустить 32-битные программы на 64-битном Ubuntu и о библиотеках общего пользования

от Markus Bertheau, последнее обновление 5 декабря 2009 Оставить комментарий »
Быстрый ответ

Чтобы запукались 32-битные программы на 64-битном Ubuntu, установи пакет ia32-libs:

markus@ubuntu:~$ sudo apt-get install ia32-libs

Длинная история

Я написал эту статью чтобы расширить твои понимание и знания о том, как функционирует Linux. Эти знания должны улучшить твое умение и скорость решать проблемы в области администрирования серверов и использования командной строки. Я покажу, как адаптировал скрипт командной оболочки для установки коммерческого пакета Flash® Media Server, который был написан для RedHat Linux, к работе на 64-битной версии Ubuntu Linux. Для каждой ошибки, которая возникает в процессе, я объясню проблему, стоящую за ней, и как ее решить. Конечный результат можно увидеть в статье Установка Flash® Media Server на Ubuntu.

Это первая статья в серии на эту тему. В ней я пишу о том, как запустить 32-битные программы на 64-битных операционных системах, и об идее библиотек общего пользования (shared libraries).

Точные версии ПО, используемого в статье – Ubuntu 8.04 LTS 64-Bit Server и Flash® Media Server 3.5.2, если ты хочешь попробовать и увидеть все сам на своем компьютере.

32 бита на 64 битах

Если запустишь неизмененный скрипт, ты получишь ошибку о не найденном файле fmsini:

markus@ubuntu:~$ tar xfz FlashMediaServer3.5.tar.gz
markus@ubuntu:~$ sudo FMS_3_5_2_r654/installFMS
FMS_3_5_2_r654/installFMS: 172: FMS_3_5_2_r654/fmsini: not found

Эта ошибка вводит в заблуждение. fmsini существует и является 32-битным выполняемым файлом:

markus@ubuntu:~$ file FMS_3_5_2_r654/fmsini 
fmsini: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux
2.2.5, dynamically linked (uses shared libs), stripped

Почему тогда ошибка «not found»?

Дело в том, что сообщение имеет в виду не файл fmsini, а специальную вспомогательную программу, которая нужна для выполнения 32-битного динамически компонованного (dynamically linked) выполняемого файла fmsini.

Статическая и динамическая компоновка

Есть два типа выполняемых файлов: статически компонованные и динамически компонованные. Сначала о статически компонованных: Когда программа хочет вызвать библиотечную функцию, она использует название функции. Когда программа собирается из исходных файлов, все библиотечные функции, используемые в программе, копируются в программу. Программа после этого содержит и свой собственный код и код используемых библиотечных функции. Затем в местах, в которых вызывается библиотечная функция, имя функции заменяется ее адресом в программе. Этот процесс по-английски называется linking (компоновка), потому что он связывает название функции с ее реализацией, с ее кодом. Он статический, потому что связь не может быть изменена после того, как программа собрана.

Динамически компонованные программы функционируют по-другому: Программа также использует для вызова библиотечных функции ее название. Когда программа собирается, составляются два списка и сохраняются вместе с программой: список названий используемых библиотечных функций вместе с местами их вызова, и список библиотек, содержащих функции, используемые программой. Этим сборка программы заканчивается.

Позже, в момент запуска, специальная вспомогательная программа, так называемый динамический компоновщик, ищет каждую библиотеку в первом списке в определенных местах файловой системы и загружает ее в оперативную память. Теперь динамический компоновщик знает, на каком адресе лежит каждая библиотечная функция. Он проходит по первому списку, чтобы прописать правильные адреса во всех местах, в которых вызывается библиотечная функция. Затем начинается выполнение динамически компонованной программы.

Преимущества и недостатки

Самый большой недостаток статической компоновки происходит от нереализованной возможности совместного использования библиотек. Во первых, из-за этого программы становятся большего размера и соответственно занимают больше места на жестком диске и в оперативной памяти. В этом занимаемом месте часто одни и те же библиотечные функции, потому что они используются во многих программах. Во вторых, когда выходит обновление библиотеки, программы нужно пересобирать и обновлять у пользователей. А это может стоить дорого.

Динамическая компоновка решает эти проблемы: библиотеки общего пользования существуют в единственном экземпляре на жестком диске и загружаются в оперативную память один раз. Из-за отсутствия библиотечного кода программы меньше. Библиотеки можно обновить независимо от программ, которые их используют. Сами программы обновлять не нужно, достаточно просто перезапустить их.

Однако поддержка динамических библиотек повышаeт требования к системе: нужна более сложная инфраструктура, а именно сами библиотеки в нужных версиях, и более сложный загрузчик. Бывают сценарии, в которых неразумно соответствовать этим требованиям, и поэтому используются статистически компонованные программы. Они самодостаточны, не зависят ни от чего и имеют при себе совместимые версии нужных им библиотек.

Динамический компоновщик

Есть страница руководства о динамическом компоновщике: ld.so(8). ld.so – имя динамического компоновщика в Linux до 1995/96 года. Сейчас, для 32-битных программ, компоновщик в файле /lib/ld-linux.so.2, а для 64-битных в /lib64/ld-linux-x86-64.so.2. Страница руководства продолжает носить имя старого компоновщика.

В 64-битном Ubuntu Linux встроена возможность выполнять 32-битные статически компонованные программы. Однако, динамический компоновщик по умолчанию не устанавливается. Он находится в пакете libc6-i386. После его установки файл /lib/ld-linux.so.2 существует, и это первый шаг к возможности выполнять 32-битные динамически компонованные программы.

Библиотеки общего пользования

После установки libc6-i386 и при попытке запустить fmsini, ты получишь другую ошибку:

markus@ubuntu:~$ FMS_3_5_2_r654/fmsini
FMS_3_5_2_r654/fmsini: error while loading shared libraries: libstdc++.so.6:
cannot open shared object file: No such file or directory

Это динамический компоновщик, который, пытаясь загрузить все библиотеки в списке, не может найти одну из них.

Библиотеки, используемые динамически компонованными программами, называются библиотеки общего пользования (shared libraries). Когда динамический компоновщик находит, что данная библиотека уже загружена, он не загружает ее второй раз, а использует уже загруженную библиотеку для новой программы. Таким образом библиотека, загруженная один раз, используется несколькими программами.

Файлы библиотек общего пользования имеют строку .so в своем имени. so означает shared object (объект общего пользования). «Объект» имеет в виду всего лишь компилированный, бинарный код.

ldd(1) показывает, какие библиотеки нужны программе, и где динамический компоновщик их нашел, если нашел:

markus@ubuntu:~$ ldd FMS_3_5_2_r654/fmsini
	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)

Динамический компоновщик ищет библиотеки в нескольких местах – на странице руководства все подробности об этом. Две отсутствующие библиотеки находятся в пакетах lib32stdc++6 и lib32gcc1 соответственно.

ldd, между прочим, всего лишь скрипт командной оболочки, который вызывает динамический компоновщик. Если вызвать его без аргументов, он загружает все библиотеки и запускает программу. ldd вызывает его с такими аргументами, чтобы он вывел информацию о библиотеках общего пользования, требуемых программой.

Сегодня большинство программ – динамически компонованные и используют библиотеки общего пользования. В стандартной установке Ubuntu более чем 400 64-битных библиотек общего пользования. Пакет ia32-libs из репозитория Ubuntu universe содержит наиболее часто используемые библиотеки в 32-битной версии. Установка этого пакета позволяет выполнить многие из 32-битных программ на 64-битном Ubuntu. В частности, установщик Flash® Media Server выполняется (но по другим причинам еще не функционирует правильно). Flash® Media Server сам, однако, нуждается в библиотеках, которых нет в этом пакете. Как эта проблема решается – тема для другой части этой серии.

Обратная связь

Обратная связь для меня очень важна, потому что она дает подсказки, что мне нужно делать по-другому, и что нужно оставить как есть, чтобы я достиг своей цели. Моя цель – чтобы эта статья была для тебя интересной и полезной, как я описал в первом абзаце. Пожалуйста, не стесняйся оставить комментарий о том, какие части написаны так, что понимание от этого страдает, что можно было пропустить, или чего не хватает. Если есть что-то, что тебе особенно понравилось в этой статье, я также хочу об этом услышать. Спасибо :)

  • Share/Bookmark
Реклама

2 комментария

  1. Maniac:

    Хорошая статья, мне открыла глаза на некоторые вещи, спасибо.

Обратные ссылки /
Оповещения

  1. Установка Flash® Media Server на Ubuntu » markusbe.ru

Добавить комментарий

© 2010 Markus Bertheau. All rights reserved.