У меня ограниченные знания о динамических библиотеках, и у меня обычно есть проблемы, связанные с библиотеками, которые я не понимаю.
Недавно я узнал о библиотеках из поиска Google и особенно по следующим ссылкам:
Разница между общими объектами (.so), статическими библиотеками (.a) и DLL (.so)?.
http://www.ibm.com/developerworks/library/l-dynamic-libraries/. Эта статья была очень полезна для понимания динамических библиотек и их использования:
Если я правильно понял (поправьте меня, если я ошибаюсь), есть два возможных использования общих объектов:
динамическое связывание: общий объект автоматически загружается динамическим компоновщиком при запуске программы.
динамическая загрузка: объект общего ресурса загружается и используется под управлением программы во время выполнения через API динамической загрузки (dlopen, dlerror, dlsym и dlclose). Эта опция полезна для плагинов.
Если я все понял правильно, в случае динамического связывания все символы проверяются во время компиляции. Это позволяет компилятору / компоновщику точно знать, какой общий объект эффективно используется программой, а какой не используется.
Теперь случается, что динамический компоновщик всегда вызывается во время выполнения, даже если общий объект не используется. Это можно проверить, связав пустую программу с библиотеками, которые не находятся в местах, доступных для поиска во время выполнения, и выполнение не удастся. Связывание программы с библиотекой, которая фактически не используется в программе, может происходить, когда есть обновления и использование библиотеки больше не требуется. Это также происходит, когда кто-то изолирует часть программы для отладки и связывает все библиотеки основной программы.
Мой вопрос: есть ли возможность попросить компилятор / компоновщик не включать ссылку на общие объекты, которые не имеют символов, на которые ссылаются в программе?
Есть ли проблема, которая мешает компилятору сделать это?
Следующие посты имеют некоторые сходства с настоящим вопросом, но ни один из них не имеет принятого ответа или ответа, который удовлетворяет мое любопытство:
Если вы используете 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
Однако я на самом деле не уверен, что компилятор может сделать это в общем случае. Рассмотрим зависимую разделяемую библиотеку, которая имеет слабую ссылку на библиотеку, которую вы хотите удалить из своей строки ссылки: как бы компилятор узнал, что безопасно удалить библиотеку и / или символы в этой точке?
Других решений пока нет …