Это происходит потому, что все модули ядра не зачищены. Чтобы уменьшить его размер, его нужно разделить.
Используйте эту команду:
SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +
Это значительно уменьшит размер. После выполнения вышеуказанной команды можно приступать к созданию initramfs/initrd
But why does it not do the same until it finds the expected version rather than accepting the first instance of library irrespective of its version?
Да, насколько ему известно. zlib.so.1.2.7
и zlib.so.1.2.8
оба имеют soname zlib.so.1
, поэтому ваши двоичные файлы alpha
и bravo
говорят, что им нужно zlib.so.1
. Динамический загрузчик загружает первую найденную подходящую библиотеку; он не знает, что версия 1.2.8 предоставляет дополнительные символы, которые нужны bravo
. (Вот почему дистрибутивы стараются указать дополнительную информацию о зависимостях, такую как zlib1g (>= 1.2.8)
для bravo
.)
Вы можете подумать, что это должно быть легко исправить, но это не так, не в последнюю очередь потому, что двоичные файлы и библиотеки перечисляют нужные им символы отдельно от нужных им библиотек, поэтому загрузчик не может проверить, что данная библиотека предоставляет все символы, которые необходимы от него. Символы могут предоставляться различными способами, и введение связи между символами и библиотеками, предоставляющими их, может привести к поломке существующих двоичных файлов.Есть также дополнительное удовольствие от вставки символов, чтобы все усложнить (и заставить чувствительных к безопасности -разработчиков рвать на себе волосы ).
Некоторые библиотеки предоставляют информацию о версии, которая в конечном итоге хранится в .gnu.version_r
со ссылкой на предоставляющую библиотеку, которая могла бы здесь помочь, но libz
не входит в их число.
(Учитывая сонимы, я ожидаю, что ваш двоичный файл alpha
будет нормально работать с zlib.so.1.2.8
.)