From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <003e01c53c36$161124d0$c464a8c0@OLIVEMA> From: "Dmitry Kazimirov" To: "ALT Linux Sisyphus discussion list" References: <42510B50.3020202@jet.msk.su> <20050406202216.GA18524@basalt.office.altlinux.org> <200504082102.04463.alexey_borovskoy@mail.ru> Subject: =?koi8-r?B?UmU6IFtzaXN5cGh1c10gUmU6INDF0sXWo9fZ18HFzSBsaWJ0b29s?= Date: Fri, 8 Apr 2005 18:25:34 +0600 MIME-Version: 1.0 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-BeenThere: sisyphus@altlinux.ru X-Mailman-Version: 2.1.5 Precedence: list Reply-To: ALT Linux Sisyphus discussion list List-Id: ALT Linux Sisyphus discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Apr 2005 12:25:53 -0000 Archived-At: List-Archive: > А существует ли совсем правильная замена libtool? Уоу оу оу. Стоп. Кто сказал, что libtool поступает неправильно, используя файлы *.la для того, чтобы включить в зависимости собираемой библиотеки (исполняемого файла) все используемые ей (им) библиотеки, которые не были перечислены явно при линковке? Ведь в общем случае правильно поступать именно так. Рассмотрим такую вот ситуацию: 1. Библиотека BASE предоставляет некоторый интерфейс для доступа к объекту, описываемому структурой BASE_STRUCT. Пусть, например, sizeof(BASE_STRUCT) = 8. Пусть есть метод base_initialize(BASE_STRUCT*). Пусть эта библиотека имеет libtool version info 3:4:1. 2. Библиотека BASE_UTIL предоставляет дополнительные функции по управлению объектами, описанными структурой BASE_STRUCT (например, упрощенный интерфейс для доступа к ним). Версия BASE_UTIL - 1:5:0. 2. Приложение APP использует библиотеку BASE_UTIL для простого управления объектами BASE_STRUCT. Приложение APP собирается при помощи libtool без файла libBASE_UTIL.la. Тогда в зависимости APP не будет включена библиотека libBASE.so.2, а только libBASE_UTIL.so.1. Теперь представим, что автор библиотеки BASE увеличил размер структуры BASE_STRUCT, добавив какой-нибудь указатель и sizeof(BASE_STRUCT) = 12, поэтому base_initialize заполняет 12 байт. Зная, что полученная библиотека несовместима с предыдущими версиями, автор увеличил номер интерфейса библиотеки. Теперь её libtool version info - 4:0:0. А вот автор библиотеки BASE_UTIL не подумал о том, что интерфейс его библиотеки опосредованно изменился (не заметил, был невнимателен, посчитал это неправильным или что-то еще), и не увеличил version info до 2:0:0. Что же мы имеем? Библиотека BASE_UTIL опакетилась и стала требовать libBASE.so.4, но ее версия не изменилась, и приложение APP по-прежнему захочет исползовать libBASE_UTIL.so.1, которая, например, будучи загруженной в приложение вместо приложением восьми байт неожиданно проинициализирует 12, и т. д. Короче, приложение упадет. А все потому, что приложение APP не имело прямой зависимости от BASE, хотя использовала ее через BASE_UTIL. Так что у *.la файлов есть определенные плюсы, и уж точно не стоит искать "более правильную" замену libtool. Следует отметить, что есть множество причин, по которым описанная ситуация будет происходить очень редко, так что в Сизифе можно экономить на трафике, исключая непрямые зависимости. Ведь при создании дистрибутива, я думаю, всё равно все включаемые в него пакеты будут пересобраны. Однако в будущем описанная проблема может возникнуть при обновлении некоторых пакетов дистрибутива из Сизифа. Например, libBASE...rpm и libBASE_UTIL...rpm обновятся по зависимости друг от друга, а приложение из APP...rpm будет падать, если его не обновить из Сизифа вручную (так как зависимость от неизменившейся интерфейсной версии libBASE_UTIL...rpm) не будет требовать обновления.