Есть ли способ сказать компоновщику игнорировать DT_SONAME при загрузке общего объекта? - PullRequest
0 голосов
/ 15 февраля 2019

man ld говорит:

-soname = name При создании общего объекта ELF установите для внутреннего поля DT_SONAME указанное имя.Когда исполняемый файл связан с общим объектом, имеющим поле DT_SONAME, то при запуске исполняемого файла динамический компоновщик будет пытаться загрузить общий объект, указанный в поле DT_SONAME, а не с использованием имени файла, данного компоновщику.

Может ли вторая половина этого утверждения быть переопределена?Другими словами, может ли при запуске исполняемого файла заставить компоновщик игнорировать DT_SONAME внешних общих библиотек и вместо этого использовать только имена файлов?

1 Ответ

0 голосов
/ 15 февраля 2019

Другими словами, может ли при запуске исполняемого файла заставить компоновщик игнорировать 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), но это преобразование намного сложнее выполнить правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...