From c0de9bbf633b421a57a10db70d6d76b5f195546e Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 11 Nov 2020 20:30:51 +0300 Subject: [PATCH] =?utf8?q?Overhead=20=D0=BE=D1=82=20=D0=B4=D0=B8=D0=BD?= =?utf8?q?=D0=B0=D0=BC=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B9=20=D0=BB?= =?utf8?q?=D0=B8=D0=BD=D0=BA=D0=BE=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit http://harmful.cat-v.org/software/dynamic-linking/ http://harmful.cat-v.org/software/dynamic-linking/versioned-symbols https://sta.li/faq/ В комментарии http://blog.stargrave.org/russian/71870b1510dfc2727093f2767b994b8596f9b163#comment1 я запускал convert, в котором ldd на полэкрана, в течении 165мс. Когда руками собрал с нуля, то у меня на полтора экрана вывод ldd и утилита запускается более чем в два раза дольше. Всё таки 200мс это очень и очень заметное на глаз время, тем более для long-live утилиты. Когда я только начал в этом году программировать на C, то задавался вопросом какие библиотеки мне делать (static vs shared). И все хакеры говорят в один голос о статической линковке. Есть даже целый "stali" (static linux) дистрибутив, целью которого является только статическая линковка, musl и всякое такое. В котором много ссылок на конкретные примеры всяких размеров программ, времени их запуска и тому подобного. Plan9 и Go -- имеют только такую линковку. И вот, судя по ImageMagick, я однозачно теперь тоже за статическую. Во-первых, если использовать всякие -ffunction-sections+-Wl,--gc-sections, то в итоговом исполняемом файле не останется лишнего кода в виде неиспользуемых функций. Во-вторых, даже если размер будет и больше, то он всё равно при этом будет быстро (быстрее) загружаться, что куда важнее чем место на диске. Основной аргумент за динамическую линковку у людей: типа если нужно обновить OpenSSL, то можно только его обновить, не трогая остального. Но даже я на своей практике с чистой совестью могу заявить что это брехня только изредка работающая, ибо регулярно *на практике* несовместимости в версиях библиотеки, которые препятствуют обновлению и по факту приходится всё равно пересобирать зависимый от неё софт. Да и в чём проблема пересборки всего что зависит от неё, пускай это даже и libc? Отсутствие исходников? Не аргумент, ибо они должны быть в свободном ПО. Проприетарное -- идёт нафиг. Время сборки/пересборки -- а вот это повод задумываться над скоростью компилирования. C-компиляторы вполне себе шустрые например. Go -- аналогично, пересобрать ВЕСЬ Go софт, сколько бы его не было -- вопросы нескольких минут, как мне представляется на практике. C++/Rust/etc -- теперь я ещё больше понимаю насколько важно время сборки. А в идеальной и прекрасной системе со свободным ПО (значит и исходники будут) на C/Go проблем нет никаких. Скорость, производительность, простота, безопасность (куча ссылок касающаяся недостатков динамической линковки про безопасность как-раз), эффективность! Плюс никаких проблем с тем чтобы иметь софт с самыми разносторонними по версиям зависимостями, ибо они всё равно вшиваются. Я однозначный поклонник этого подхода! -- 2.48.1