LINUX.ORG.RU
ФорумTalks

Линус против динамической линковки библитек

 


0

1

пруф

Shared libraries are not a good thing in general. They add a lot of overhead in this case, but more importantly they also add lots of unnecessary dependencies and complexity, and almost no shared libraries are actually version-safe, so it adds absolutely zero upside.

Yes, it can save on disk use, but unless it’s some very core library used by a lot of things (ie particularly things like GUI libraries like gnome or Qt or similar), the disk savings are often not all that big - and disk is cheap. And the memory savings are often actually negative (again, unless it’s some big library that is typically used by lots of different programs at the same time).

I think people have this incorrect picture that «shared libraries are inherently good». They really really aren’t. They cause a lot of problems, and the advantage really should always be weighed against those (big) disadvantages.

Pretty much the only case shared libraries really make sense is for truly standardized system libraries that are everywhere, and are part of the base distro.

★★★★★

ППКС. Сошки нужны для либц, иксов и графона. Всё остальное проще статикой влинковывать. Ещё по перфе будет лучше.

Stil ★★★★★
()
Ответ на: комментарий от X512

Линус все по теме ответил. clang ни с кем не делит код в памяти, а работает в 3 раза медленней. мол, федоровцам надо его иначе собирать.

так что, ес-но, оба подхода должны быть.

crypt ★★★★★
()
Последнее исправление: crypt (всего исправлений: 1)
Ответ на: комментарий от crypt

clang ни с кем не делит код в памяти

clang можно собрать с динамическими библиотеками и он будет занимать в разы меньше места.

X512 ★★★★★
()
Ответ на: комментарий от X512

Пишут, что он уже так собран.

Yes, it’s intentional. Dynamic linking libraries from other packages is the Fedora policy[1], and clang and llvm are separate packages (in Fedora).

Линусу это не нравится.

Yeah. Appended is the profile I see when I profile that «make oldconfig», so about 45% of all time seems to be spent in just symbol lookup and relocation.

Side note: I really wish Fedora stopped doing that.

Как видно, дело вовсе не в занимаемом месте.

numas13
()
Ответ на: комментарий от numas13

so about 45% of all time seems to be spent in just symbol lookup and relocation.

Убогий формат ELF с убогими хешами символов. В формате PE начиная с Windows 95 используется бинарный поиск, а также есть импорт по ординалам. В Обероне тоже используется бинарный поиск.

Возможно поможет сборка с -fno-semantic-interposition -fvisibility=hidden -fno-plt.

Side note: I really wish Fedora stopped doing that.

Зачем Линус лезет со своим мнением в чужой проект? Ядро Линукс свободное, пользоваться им можно как угодно и спрашивать разрешения Линуса не обязательно.

X512 ★★★★★
()
Ответ на: комментарий от X512

Возможно поможет сборка с -fno-semantic-interposition -fvisibility=hidden -fno-plt.

Там в обсуждении всё есть.

system gcc
     1050.15s user 192.96s system 3015% cpu   41.219 total
     1055.47s user 196.51s system 3022% cpu   41.424 total

clang (libLLVM*.a libclang*.a); LLVM=1
     1588.35s user 193.02s system 3223% cpu   55.259 total
     1613.59s user 193.22s system 3234% cpu   55.861 total
clang (libLLVM.so libclang-cpp.so); LLVM=1
     1870.07s user 222.86s system 3256% cpu 1:04.26 total
     1863.26s user 220.59s system 3219% cpu 1:04.73 total
     1877.79s user 223.98s system 3233% cpu 1:05.00 total
     1859.32s user 221.96s system 3241% cpu 1:04.20 total
clang (libLLVM.so libclang-cpp.so -fno-semantic-interposition); LLVM=1
     1810.47s user 222.98s system 3288% cpu 1:01.83 total
     1790.46s user 219.65s system 3227% cpu 1:02.27 total
     1796.46s user 220.88s system 3139% cpu 1:04.25 total
     1796.55s user 221.28s system 3215% cpu 1:02.75 total
clang (libLLVM.so libclang-cpp.so -fno-semantic-interposition -Wl,-Bsymbolic); LLVM=1
     1608.75s user 221.39s system 3192% cpu   57.333 total
     1607.85s user 220.60s system 3205% cpu   57.042 total
     1598.64s user 191.21s system 3208% cpu   55.778 total
clang (libLLVM.so libclang-cpp.so -fno-semantic-interposition -Wl,-Bsymbolic-functions); LLVM=1
     1617.35s user 220.54s system 3217% cpu   57.115 total

Зачем Линус лезет со своим мнением в чужой проект? Ядро Линукс свободное, пользоваться им можно как угодно и спрашивать разрешения Линуса не обязательно.

Так он же не требует. Всего лишь выражает свою точку зрения и надеется что это изменится.

numas13
()
Ответ на: комментарий от numas13

Проблема вообще по хорошему решается процессом-сервером компиляции, который не завершается после компиляции каждого файла. Вызов бинарника компилятора приводит к старту сервера компиляции если он ещё не запущен и передачи ему параметров по IPC.

X512 ★★★★★
()
Ответ на: комментарий от X512

Согласен. Сервер потом можно остановить после некоторого бездействия.

numas13
()

a.out тогда зачем выкинули?

Shadow ★★★★★
()
Ответ на: комментарий от X512

или просто передать компилятору все файлы в командную строку сразу, а не по одному

Harald ★★★★★
()
Ответ на: комментарий от hateyoufeel

Flatpak ценен попыткой сделать нормальный сэндбоксинг для линуксового софта

Ты только забываешь, что любая софтина, имеющая доступ к системным вызовам ядра, по факту имеет доступ уровня root. И это не было никаким сюрпризом, учитывая историю уязвимостей, а также костылей, которыми эти уязвимости подпирали, вроде SELinux и AppArmor.

Потому нет, Flatpak не был и не пытался быть sandbox-ом. Как и докер, который изначально создан ровно как запускалка программ для линукса, которая была призвана решить проблему «перекомплиируется glibc с флагами, а вместе с ней вам, наверное, придется перекомпилировать еще и апачку с libmod-php... но это не точно».

byko3y ★★★★
()
Ответ на: комментарий от Artamudo

Линус на NixOS пересел?

А NixOS тут при чем? Контейнеры, да и просто бинарные дистрибутивы со статической линковкой или просто всеми базовыми либами в одной папке с LD_LIBRARY_PATH решают ту же проблему.

byko3y ★★★★
()

Линус, а как мне обновить libSDL в линуксовой версии Героев 3? Там старая версия, в которой не поддерживается ALSA. А в линуксовой версии quake2 3.21 поддерживается, но работает плохо, из-за чего приходится указывать параметр SDL_AUDIODRIVER=dsp. В обоих случаях используется статичная линковка, и библиотек SDL находится внутри исполняемого файла heroes3 или quake2.

ZenitharChampion ★★★★★
()
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от leg0las

Вот есть допустим libpng, и в ней нашли уязвимость, которая например позволяет при открытии специально сформированной картинки выполнять произвольный код (такое уже вроде было). Те, кто слинкован статически будут курить бамбук / ждать обновления приложения. Динамически собранные приложения получат патченую libpng, проблема решена

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

byko3y ★★★★
()
Ответ на: комментарий от X512

В Линуксе это в принципе не работает, имена динамических библиотек другие. Попробуйте запустить бинарник Qt3/GTK2 с библиотеками Qt4+/GTK3+. А в Windows обратная совместимость в целом работает. Версии в именах библиотек не нужны, вместо этого есть ELF symbol versioning

Я бы не стал так этим хвастаться, потому что дистрибутив винды с годами становится больше и больше.

byko3y ★★★★
()
Ответ на: комментарий от X512

Проблема вообще по хорошему решается процессом-сервером компиляции, который не завершается после компиляции каждого файла. Вызов бинарника компилятора приводит к старту сервера компиляции если он ещё не запущен и передачи ему параметров по IPC

Почему никто не вспомнил, что раздельная компиляция — зло? Она решала проблему, которая существовала 50 лет назад и не актуальна в 2021, а вместо этого создает свою собственную проблему, которую теперь сиди и решай. Например, компиляция резидентным сервером — это единственный практически успешный способ ускорения компиляции крестовых шаблонов:

https://github.com/yrnkrn/zapcc

byko3y ★★★★
()
Ответ на: комментарий от ZenitharChampion

Линус, а как мне обновить libSDL в линуксовой версии Героев 3?

А ты уверен, что смог бы обновить libSDL на нужную версию в героях, если бы она была там отдельно? Ну в смысле: есть ли вообще такая готовая версия libSDL, которая совместима с героями 3?

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Я бы не стал так этим хвастаться, потому что дистрибутив винды с годами становится больше и больше.

Windows PE влезает в USB диск на 256 МБ и там много чего запускается. 90% дистрибутива Windows – это мусор.

X512 ★★★★★
()
Ответ на: комментарий от X512

Windows PE влезает в USB диск на 256 МБ и там много чего запускается. 90% дистрибутива Windows – это мусор

Ну так этот мусор — это и есть сплошные совместимости вместе с багфиксами.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Ну так этот мусор — это и есть сплошные совместимости вместе с багфиксами.

Там и без этого мусора хватает: Metro/UWP, раздутый Проводник, разные непонятные и малоиспользуемые программы, сервисы, библиотеки, драйверы. Для многих программ багфиксы и специальные режимы совместимости не требуются.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Фигню пишешь. Компилятору не заинлайнить код из динамических библиотек, что ухудшает оптимизацию. Процессор сложнее ускорить, чем добавить памяти и диска.

Zyy
()
Последнее исправление: Zyy (всего исправлений: 1)
Ответ на: комментарий от byko3y

Ты только забываешь, что любая софтина, имеющая доступ к системным вызовам ядра, по факту имеет доступ уровня root.

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

Потому нет, Flatpak не был и не пытался быть sandbox-ом.

Сходи авторам это расскажи. Они не очень в курсе.

Из https://docs.flatpak.org/en/latest/sandbox-permissions.html

One of Flatpak’s main goals is to increase the security of desktop systems by isolating applications from one another. This is achieved using sandboxing and means that, by default, applications that are run with Flatpak have extremely limited access to the host environment.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

Торвальдс решил побороться с фрагментированием Linux платформы? Слишком поздно спохватился, как минимум на 10 лет опоздал.

hummer
()
Последнее исправление: hummer (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Из статических код таки отлично инлайнится, если компилятор это умеет.

Статические библиотеки это уже машинный код и его уже нельзя инлайнить (там уже есть код установки стековых фреймов, возврата и т.п. что не должно быть если инлайнить). Чтобы инлайнить код нужно компилировать всё из исходников.

X512 ★★★★★
()
Ответ на: комментарий от X512

Наличие дополнительной информации, в специальным образом спомпилированных бибблиотеках, не позволяет вычленить то, что необходимо для инлайна?

hummer
()
Ответ на: комментарий от hateyoufeel

Ты только забываешь, что любая софтина, имеющая доступ к системным вызовам ядра, по факту имеет доступ уровня root.

Это примерно как утверждать, что любая софтина вообще имеет доступ уровня root, потому что в процессорах есть дыры

А как у нас называется модель безопасности, когда уязвимость всем известна, но еще никто не придумал как ее эксплуатировать? «Безопасность неуловимого Джо»?

Потому нет, Flatpak не был и не пытался быть sandbox-ом.

Сходи авторам это расскажи

Расскажу авторам докера, скорее:

https://twitter.com/solomonstre/status/1111004913222324225
«If WASM+WASI existed in 2008, we wouldn't have needed to created Docker. That's how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let's hope WASI is up to the task»

One of Flatpak’s main goals is to increase the security of desktop systems by isolating applications from one another. This is achieved using sandboxing and means that, by default, applications that are run with Flatpak have extremely limited access to the host environment

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

byko3y ★★★★
()
Ответ на: комментарий от X512

Из статических код таки отлично инлайнится, если компилятор это умеет.

Статические библиотеки это уже машинный код и его уже нельзя инлайнить (там уже есть код установки стековых фреймов, возврата и т.п. что не должно быть если инлайнить). Чтобы инлайнить код нужно компилировать всё из исходников

Для Link-time optimization (LTO) нужно сгенерировать библиотеку со включенной LTO. Тогда компилятор включает в либу кроме сгенерированного маш кода еще и какие-то там промежуточные коды.

byko3y ★★★★
()

Pretty much the only case shared libraries really make sense is for truly standardized system libraries that are everywhere, and are part of the base distro.

Здрасьте, а как же динамически подключаемые плагины? Если Торвальдс действительно именно так выразился, то тут он поспешил и людей насмешил. Впрочем, многого от разработчика очередной юниксоподобной системы ожидать не стоит.

seiken ★★★★★
()
Ответ на: комментарий от X512

В Windows это уже более 30 лет назад осилили, так что всё возможно.

Но не для VC++ Runtime, а он важный системный компонент.

EXL ★★★★★
()
Ответ на: комментарий от Stil

Иксы давно уже не стандарт и полагаться на них в новых дистрибутивах нельзя. Да и вообще статическая линковка графических приложений в Linux – сущий ад. Особенно какого-нибудь Qt, который часть своих либ грузит через dlopen().

EXL ★★★★★
()
Ответ на: комментарий от EXL

Особенно какого-нибудь Qt, который часть своих либ грузит через dlopen().

В Обероне кстати работает аналог dlopen() при статической линковке потому что линковщик сохраняет список и заголовки линкуемых модулей. Можно хоть в ПЗУ микроконтроллера на голом железе слинковать и динамическое обращение к модулям будет работать.

В C/C++ всё традиционно криво и убого.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 2)
Ответ на: комментарий от EXL

Я исключительно про безопасность статической линковки. Так как иксы работают по стабильному и клиент-серверному протоколу, какой-нибудь хлиб влинковывать в приложение безопасностно. Так то я за подход «выживания» и «инспектирования»: посмотреть есть ли вейланд композитор, если есть – создать вейланд окно, если нет – посмотреть есть ли х-сервер, если есть – создать х окно, если нет – срать в консоль. И так примерно со всем.

// надо будет ещё фреимбуффер поддержать лол

Stil ★★★★★
()
11 июня 2021 г.
Ответ на: комментарий от X512

Т.е. поэтому в винде у меня не все проги работали от версии к версии ?) Они ломают аби, просто там никто на эту тему не плачет, т.к. почти всё по несёт с собой все библиотеки и только виндовые устанавливает как по сути зависимость

AKonia ★★★
()
Ответ на: комментарий от X512

Можно просто ссылку на статью Дреппера по этой теме было дать, но он кстати описывал и плюсы и минусы и тонкости динбиблов

AKonia ★★★
()
Ответ на: комментарий от X512

У меня лицензионный диск с игрой Paraworld -> работал на семёрке, не работал на 8-ке, пруф это или не пруф - решай себе сам, но мой опыт показывает, что случаи когда программы работавшие на прошлых выпусках винды не работали даже в режиме совместимости на новых - не столь и редки. Единственное почему это не так бросается в глаза я полагаю, что коммерческий, активный софт чаще обновляют, а вот ПО оставшееся без обновлений вполне может просто перестать работать, что может и не факт, но по моему указывает на проблемы с аби.

AKonia ★★★
()
Ответ на: комментарий от AKonia

У меня лицензионный диск с игрой Paraworld -> работал на семёрке, не работал на 8-ке

Это не нарушение совместимости ABI. Нарушение совместимости ABI было бы если бы вдруг ввели новый формат исполняемых файлов или поменяли бы соглашение вызовов системного API (в Линуксе всё это было). Это скорее всего изменение недокументированного поведение. Работа программ, опирающихся на неопределённое поведение, не гарантируется.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от AKonia

Они ломают аби

Нет. Windows никогда не ломает ABI.

fsb4000 ★★★★★
()
Ответ на: комментарий от Zyy

Правильно написанные программы работают от Windows 95 до Windows 10. И для этого не надо ставить старые библиотеки или собирать в старой версии дистрибутива.

X512 ★★★★★
()
Ответ на: комментарий от Zyy

на практике

На практике я могу писать программы, что они будут работать везде от Windows 95 до Windows 10 20H2.

То что программы с багами где-то работают, где-то нет, это не проблема Microsoft. Обращайтесь в поддержку тех программ.

fsb4000 ★★★★★
()
Ответ на: комментарий от Zyy

«Правильно написанные программы» работают от старой версии linux до новой.

Программы под GTK1, Qt1-3 так просто из коробки не запустятся. Где-то уже Qt4 из репозиториев выкинули. А в user32.dll никогда не выкидывают ничего публичного и документированного, только добавляют.

X512 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.