Могу ли я указать свой исполняемый файл для ссылки на одну или другую библиотеку, например, libhello.so или libhellod.so? - PullRequest
2 голосов
/ 09 мая 2019

У меня есть проект, настроенный таким образом, что, если я делаю сборку релиза, я получаю библиотеки с именами, например libhello.so, а если это отладочная сборка, я получаю имена, подобные libhellod.so - обратите внимание на d в конце имени.

Поэтому, когда я компилирую и связываю приложение / исполняемый файл, я делаю что-то вроде:

gcc -g -o myapp obj1 obj2 obj3 -lhellod

Где я здесь связываю его с библиотекой отладки.Теперь я могу развернуть это приложение с его библиотекой:

  • myapp
  • libhellod.so

замечательно, но затем мы решаем, что хотимсоздайте выпускную версию hello lib и разверните ее вместе с приложением вместо отладочной версии.Теперь он жалуется, что не может найти библиотеку с именем hellod.Итак, я могу просто сделать символическую ссылку:

  • myapp
  • libhello.so
  • libhellod.so -> libhello.so

Этотакже работает.

Можно ли как-нибудь связать мой исполняемый файл так, чтобы он нашел либо libhello.so, либо libhellod.so (без использования символических ссылок)?- или символические ссылки - единственный способ достичь этого?или мой дизайн просто глупый?!

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Нет, вы не можете.

Однако вас может заинтересовать переменная окружения LD_PRELOAD. Это позволяет принудительно загружать библиотеку раньше всех остальных, указанных в исполняемом файле.

Поскольку компоновщик обрабатывает библиотеки по порядку, если вы LD_PRELOAD=libhellod.so yourprogram, он должен сделать libhellod.so переопределить символы из libhello.so. Это не помешает загрузке libhello.so - например, будет запущен раздел инициализации. Проверьте результат с помощью LD_DEBUG=bindings.

Вы можете получить тот же эффект редактирования /etc/ld.so.preload

Проверьте документацию ld.so .

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

0 голосов
/ 09 мая 2019

Другим способом было бы создать исполняемый файл отладки hellod, который ссылается на отладку libhellod.so.

...