Это может быть несколько мета-вопрос, поскольку, по-моему, моя проблема связана с недостатком знаний об общих статических библиотеках.Программа сбоя сегментации, скомпилированная в общую библиотеку, но не статическую.
Я работаю над сервером/клиентской системой, использующей infiniband как учебное упражнение/готовую к предстоящей программе работы. Первоначально у меня было 2 исполняемых файла, каждый из которых включал в себя один и тот же исходный код, поэтому я разделил их на обычные файлы (являющиеся RDMAConnectionManager.cpp и RDMAConnection.cpp вместе со своими заголовками).
Где-то по линии я решил, что эти файлы должны быть библиотекой, поэтому я могу обеспечить, чтобы мой сервер и клиент использовали один и тот же код нижнего уровня. Я всегда использовал разделяемые библиотеки, поэтому я занимался вещами в соответствии с нормой, создавая общую библиотеку через cmake.
Проблема была, как только я сделал это, я хотел бы получить ошибку сегментации в функции, представленной в библиотеке rdmacm, в частности, с ib_verbs функций. Я думал, что это может иметь какое-то отношение к упорядочению порядка, но я ничего не изменил.
По прихоти, я изменил его из SHARED в библиотеку STATIC. Это сработало отлично! Мое понимание статики заключалось в том, что она включала все символы из библиотек, которые она связывает, в то время как общий - нет. Однако теперь, когда я нашел эту неприятную проблему, я чувствую, что что-то упускаю.
С тех пор я немного поработал и чувствую себя более комфортно с различиями, однако я до сих пор не знаю, что приводит к этой проблеме (или как ее увидеть в будущем). Кто-нибудь знает, почему может произойти что-то подобное?
Это не сработало отлично. Вы перемещали материал, который маскировал segfault, но он все еще там. Совместные библиотеки существуют уже 50 лет. RDMA существует около 10. Ваш код работает около 2 дней. Что говорит вам Бритва Оккама? – stark
Возможно, вы можете проверить с помощью 'ldd', что вы на самом деле используете динамическую библиотеку, которую вы ожидаете использовать. –