LINUX.ORG.RU

Как переопределить библиотеки (включая libc), которые подключаются при компиляции программ? (И некоторые другие вопросы)

 , ,


0

1

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

  • Сломать обычный поиск библиотек, так чтобы при ./configure случайно не нашлись системные.
  • Прописать нужные, включая даже libc. На каком уровне это нужно сделать и как это устроено?

В частности я хочу собрать программу с musl, у них есть musl-gcc, но установка на него переменных СС и CXX приводит к тому, что configure ругается на «cannot run c compiled programs», возможно что способ про который я спрашиваю поможет и с этим. Если нет - почему?

Библиотеки ищутся в соответствии с настройками ОС, а не по параметрам компиляции. Например можно прописать LD_LIBRARY_PATH перед запуском проги.

Ещё можно заменить ld-linux на пропатченый и в пропатченом искать уже что хочешь и где угодно.

firkax ★★★★★
()

Сломать обычный поиск библиотек, так чтобы при ./configure случайно не нашлись системные.

Чтобы configure их не нашёл - надо пропатчить configure. Это обычный shell-скрипт, разобраться в логике его работы проблем не представляет. Обычно там просто проверка наличия нужных файлов в путях по списку /lib /usr/lib /usr/local/lib.

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

Но это не во время компиляции, а уже позже, как я понимаю.

kotolamer
() автор топика

Создай файл run.sh со следующим содержимым:

#!/bin/sh

# Долбанное KDE пытаеться выполнить прогу из корневого каталога /
# вместо директории с программой. А вот гном молодец, гном
# всё правильно делает. Ради KDE возвращаем рабочую директорию
# на текущую
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

# Проверяем, есть ли директории data и res
if [ ! -e data ] || [ ! -e res ]
then
	echo "Alarm! There is no data/ and res/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

# Теперь определяем разрядность
MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./lib64
	BIN=./YourApplicationName.x86_64
else
	LIBS=./lib32
	BIN=./YourApplicationName.x86
fi

# Теперь запускаем программу
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

exit $e

Не забудь дать ему параметр исполняемости при помощи chmod +x run.sh (либо в «Свойствах файла»).

Есть много библиотек, которые не надо класть вместе с программой. Это libc6, libpthread (и прочие библиотеки glibc), это все «иксовые» библиотеки (libX*), это библиотеки libpng, libjpeg, libz, это тулкиты GTK и Qt, это libxml2 и libxslt, это libcups и libsane. Ну и конечно же не надо класть libGL (он используется из драйвера видео). Полный список вот и вот. Эти библиотеки обязаны быть в любом дистрибутиве Linux. Разве что в Debian начиная с версии 9 решили избавиться от libpng12, и что теперь делать, я лично не знаю.

Обычно с программой кладут вовсе не базовые системные библиотеки, а libSDL, libopenal, libQt (если используется СЛИШКОМ новая версия библиотеки), libboost, libicu, libcurl, libssl, libcrypto, libevent...

Что касается libc6, тут сложнее. Эту библиотеку нельзя подцепить при помощи LD_LIBRARY_PATH. Дело в том, что, прежде чем подгружать библиотеки, в память загружается библиотека ld-linux.so.2, которая загружает libc6, поэтому подгрузить сторонний невозможно. Но есть трюк с редактированием бинарного файла, чтобы подгружался сторонний ld-linux.so.2. Вот этот способ.

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

libc6, тут сложнее. Эту библиотеку нельзя подцепить…

«Льзя!» В этом плане она не отличается от прочих.

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

Ну а ты попробуй подцепить, и не подцепиться.

В этом плане libstdc++.so.6 - бро. Он подцепляеться. Он наш бро. Это C++ Runtime, если что. Вот допустим я не могу запустить какую-то прогу, потому что она ругаеться в консоль что GLIBCXX нужной версии не найден. Так я гогда беру более новую версию этой библиотеки, подцепляю её, и всё работает.

А вот дебиан нам не бро. В дебиане гомосексуализьм процветает и даёт плоды. Всё началось с безобидного удаления Qt3 из Debian 7 незадолго до релиза. Хотя он там был и должен был войти в релиз. Когда им напомнили про стандарт LSB и что важно сохранять обратную совместимость, там встали на сторону того неадеквата, который принимал это решение единолично.

А потом туда внедрили Systemd, и всё стало окончательно ясно. Сейчас комьюнити Дебиана активно хренососит Столлмана - человека, который их взрастил и дал им инструмент для выживания. Андрей Бульба бы ими гордился.

Ну и libpng12 удалили почём зря. С Qt3 ещё можно было кое-как признать их правоту, но на эту библиотеку реально много софта завязано. Стоило бы её сохранить для обратной совместимости.

И да, я так понимаю, линковать теперь следует с libpng15. Судя по этому документу.

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

Попробую на примере. https://ibb.co/qBCC1vb

Система: lubuntu 18.04 64бит. В левом-верхнем углу видно, что каталог только 64битных библиотек.

Справа-вверху: mc 4.8.19 - 64бит, самый новый, который можно «официально» установить в эту версию системы.

Справа-посеридине: mc 4.8.22 - последняя 32битная версия, запускается со своим комплектом библиотек, в том числе ld и libc.

Справа-внизу: mc 4.8.26 - самый новый 64 бит, запускается со своим комплектом библиотек, в том числе ld, libc.

Все запускаются одним враппером.

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

У тебя очень красивый интерфейс. Чем-то напоминает текстовый режим MDA. Для полной картины не хватает только GoldED.

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