Ответ 1
Да, вы можете использовать patchelf, как это (из Readme):
patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3
Моя программа зависит от libcurl.so.3
, но в RHEL6 нет такого мягкого типа libcurl.so.3 ->libcurl.so.4
(моя программа может работать плавно при создании этой ссылки). Но есть такая мягкая ссылка: libcurl.so->libcurl.so.4
.
Я хотел бы изменить SONAME
of libcurl.so.3.0.0.0
непосредственно от libcurl.so.3
до libcurl.so
. Затем я могу запустить свою программу на RHEL 6, не создавая софт-ссылку.
Возможно, мое решение глупо, но я думаю, что изучение того, как изменить двоичный файл напрямую, - это интересная вещь.
$readelf -d libcurl.so.3.0.0
Динамический сегмент со смещением 0x303cc содержит 25 записей:
Тип тега Имя/значение
0x00000001 (NEEDED) Общая библиотека: [libssl.so.2]
0x0000000e (SONAME) Имя библиотеки: [ libcurl.so.3] --- > Я хотел бы изменить это на libcurl.so
Да, вы можете использовать patchelf, как это (из Readme):
patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3
Вам следует избегать удаления версии объекта SO, например, когда ваше приложение зависит от конкретного libc (libc.so.6).
Правильный способ сделать это, если вы хотите использовать другой lib, использует переменную LD_PRELOAD перед вызовом вашего приложения
Если вы установите LD_PRELOAD на путь к новому файлу, этот файл будет загружен перед любой другой библиотекой (включая даже C runtime, libc.so).