2009-07-22 3 views
10

Я собираю файл makefile для проекта, над которым я работаю. У меня есть исполняемый файл и общая библиотека в проекте. Оба используют одни и те же исходные файлы, которые скомпилируются отдельно в объектные файлы. Чтобы использовать эти объекты в общей библиотеке, мне нужно использовать флаг -fPIC (position independent code) в gcc. Есть ли какие-либо последствия для компиляции объектов с -fPIC, которые используются в исполняемом файле?Что, если таковые имеются, являются последствиями компиляции объектов с флагом gcc -fPIC, если они используются в исполняемых файлах?

+0

Похоже, что GCC7 теперь требует всего, что скомпилировано с помощью -fPIC. По крайней мере, я получаю ошибку n и нашел этот вопрос в поиске, почему я действительно получаю ошибку? – Lothar

+0

@ Lothar Нет, это вообще не требует. Вы смешиваете объекты, скомпилированные с и без '-fPIC'? – ephemient

ответ

9

Компиляция независимого от положения кода, если это не необходимо, - это перетаскивание производительности на некоторых платформах (в первую очередь, архитектура x86 с голодающим голосом, поскольку ПОС отбирает регистр, который можно использовать более свободно при отсутствии ПИК), но там в противном случае не должно быть никаких отрицательных последствий.

В дальнейшем возможно создание независимого от позиции исполняемого файла (-fPIE), построенного из только независимого от положения кода.

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

+0

Нет PIC не отображает регистр на x86. Этот ЦП не имеет косвенного кода позиции и поэтому всегда добавляет косвенность к данным/функциям. Вы можете забыть о -fPIC полностью на x86, потому что, если вы не укажете его, вы получите быстрый код, а компоновщик дублирует сегмент кода для каждого исполняемого файла. – Lothar

+0

@ Lothar На x86-32, в зависимости от компилятора, PIC забирает регистр. GCC до 5.0 резервов '% ebx', что делает его недоступным для общего использования. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient