Другими словами, может ли при запуске исполняемого файла заставить компоновщик игнорировать DT_SONAME внешних общих библиотек и вместо этого использовать только имена файлов?
Нет.
Во-первых, компоновщик не участвует в запуске исполняемого файла, загрузчик (также известный как динамический компоновщик).Загрузчик - это совершенно отдельная программа, которая обычно не разделяет код и полностью отличается от компоновщика.
Во-вторых, после того, как компоновщик завершен, имя файла, которое использовалось для компоновки исполняемого файла, не записывается где угодно (записывается только DT_SONAME
).Поэтому, даже если загрузчик хотел использовать исходное имя файла, у него нет возможности узнать, что это было.
Тем не менее, вы могли бы изменить строку в .dynstr
раздел исполняемого файла, который записывает DT_SONAME
.Если строка (скажем) foobar.so.1
, и вы двоично редактируете ее вместо barfoo.so
, то загрузчик будет искать barfoo.so
(используя свои обычные правила поиска в общей библиотеке) вместо foobar.so.1
.Единственным ограничением здесь является то, что новое имя не длиннее старого (иначе вы испортите какую-то другую строку).
Также возможно заменить раздел .dynstr
новым с более длиннымстрок (и замените foobar.so.1
на /full/path/to/libsomething.so
), но это преобразование намного сложнее выполнить правильно.