Динамическое связывание: возможно ли отключить автоматическую загрузку неиспользуемых общих объектов?

У меня ограниченные знания о динамических библиотеках, и у меня обычно есть проблемы, связанные с библиотеками, которые я не понимаю.
Недавно я узнал о библиотеках из поиска Google и особенно по следующим ссылкам:

Если я правильно понял (поправьте меня, если я ошибаюсь), есть два возможных использования общих объектов:

  • динамическое связывание: общий объект автоматически загружается динамическим компоновщиком при запуске программы.

  • динамическая загрузка: объект общего ресурса загружается и используется под управлением программы во время выполнения через API динамической загрузки (dlopen, dlerror, dlsym и dlclose). Эта опция полезна для плагинов.

Если я все понял правильно, в случае динамического связывания все символы проверяются во время компиляции. Это позволяет компилятору / компоновщику точно знать, какой общий объект эффективно используется программой, а какой не используется.

Теперь случается, что динамический компоновщик всегда вызывается во время выполнения, даже если общий объект не используется. Это можно проверить, связав пустую программу с библиотеками, которые не находятся в местах, доступных для поиска во время выполнения, и выполнение не удастся. Связывание программы с библиотекой, которая фактически не используется в программе, может происходить, когда есть обновления и использование библиотеки больше не требуется. Это также происходит, когда кто-то изолирует часть программы для отладки и связывает все библиотеки основной программы.

Мой вопрос: есть ли возможность попросить компилятор / компоновщик не включать ссылку на общие объекты, которые не имеют символов, на которые ссылаются в программе?
Есть ли проблема, которая мешает компилятору сделать это?

Следующие посты имеют некоторые сходства с настоящим вопросом, но ни один из них не имеет принятого ответа или ответа, который удовлетворяет мое любопытство:

0

Решение

Если вы используете g ++ / ld, есть несколько предложений, изложенных на Как удалить неиспользуемые символы C / C ++ с помощью GCC и ld?

Например:

  • gcc -Os -fdata-sections -ffunction-sections test.cpp -o test.o -Wl,--gc-sections
  • -dead_strip
  • -dead_strip_dylibs

Однако я на самом деле не уверен, что компилятор может сделать это в общем случае. Рассмотрим зависимую разделяемую библиотеку, которая имеет слабую ссылку на библиотеку, которую вы хотите удалить из своей строки ссылки: как бы компилятор узнал, что безопасно удалить библиотеку и / или символы в этой точке?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]