Есть ли способ напрямую изменить SONAME бинарного файла?

Моя программа зависит от 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, не создавая софт-ссылку.

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

Tahnk вы за свой комментарий, devnull. возможно, я не сказал ясно.

$readelf -d libcurl.so.3.0.0

Динамический сегмент со смещением 0x303cc содержит 25 записей:

Тип тега Имя/значение

0x00000001 (NEEDED) Общая библиотека: [libssl.so.2]

0x0000000e (SONAME) Имя библиотеки: [ libcurl.so.3] --- > Я хотел бы изменить это на libcurl.so

Ответ 1

Да, вы можете использовать patchelf, как это (из Readme):

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3

Ответ 2

Вам следует избегать удаления версии объекта SO, например, когда ваше приложение зависит от конкретного libc (libc.so.6).

Правильный способ сделать это, если вы хотите использовать другой lib, использует переменную LD_PRELOAD перед вызовом вашего приложения

Если вы установите LD_PRELOAD на путь к новому файлу, этот файл будет загружен перед любой другой библиотекой (включая даже C runtime, libc.so).