Почему включение -fPIC для компиляции статической библиотеки вызывает ошибку сегментации во время выполнения?

Я компилирую статическую библиотеку C ++ с помощью g ++ и использую параметр -fPIC. Я должен использовать параметр -fPIC, потому что в конечном итоге эта библиотека будет связана с другими статическими библиотеками для формирования динамической библиотеки.

Когда я тестирую статическую библиотеку локально, она работает полностью нормально, если я не включаю параметр -fPIC. Но как только я компилирую библиотеку с -fPIC, я получаю ошибку сегментации во время выполнения при вызове одной из функций.

По каким причинам включение -fPIC для компиляции статической библиотеки могло вызвать ошибку сегментации во время выполнения?


person Connor Flood    schedule 15.06.2016    source источник
comment
Я знаю, что это очень общий характер, но если ваш код содержит Undefined Behavior, то может произойти что угодно, и изменение флага компилятора может заставить компилятор использовать этот UB по-новому - в любом случае ошибка в вашем коде, если UB вовлеченный. Это всего лишь предположение ...   -  person Jesper Juhl    schedule 15.06.2016
comment
Я тоже об этом думал. Я немного прочитал -fPIC и не смог найти кого-либо, кто бы сообщал об ошибках времени выполнения в своем коде, включив его (в большинстве случаев он включал -fPIC, который был решением их проблем)   -  person Connor Flood    schedule 15.06.2016
comment
Может быть, вы могли бы предоставить минимальный, воспроизводимый, компилируемый тестовый пример, который мы могли бы попробовать. Это поможет диагностировать проблему. См. sscce.org.   -  person Jesper Juhl    schedule 15.06.2016
comment
Я согласен, я займусь его созданием. Проблема в том, что статическая библиотека скомпилирована из очень большой кодовой базы и не может быть опубликована.   -  person Connor Flood    schedule 15.06.2016


Ответы (1)


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

С другой стороны, статическая библиотека - это просто архив объектных файлов.

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

Поэтому, если вы не создаете исполняемый файл, в котором все другие объектные файлы не зависят от позиции (вы используете -fPIC для кода своей программы), вы не можете связать со статической библиотекой, которая использует независимый от позиции код, сгенерированный исполняемый файл просто не настроен для этого.

person Some programmer dude    schedule 15.06.2016
comment
Допустим, я компилирую статическую библиотеку (с параметром -fPIC). Теперь я хочу скомпилировать эту статическую библиотеку с помощью Test.cpp (у которого есть основной метод). Когда я запускаю сгенерированный исполняемый файл, только ОДНА из моих функций, вызываемых main, вызывает ошибку сегментации, в то время как остальная часть кода работает нормально. Но когда статическая библиотека компилируется БЕЗ -fPIC, весь код в сгенерированном исполняемом файле работает. G. Так почему же включение -fPIC приводит к сбою только части кода? - person Connor Flood; 15.06.2016
comment
@ConnorFlood Это действительно невозможно сказать без дополнительной информации, и это зависит от того, что делают все ваши функции. Вызывают ли работающие функции другие функции в библиотеках? Это делает функция, которая вылетает? - person Some programmer dude; 16.06.2016