Почему gcc неявно предоставляет флаг -fPIC при компиляции статических библиотек в x86_64 - PullRequest
58 голосов
/ 18 октября 2010

У меня было множество проблем при компиляции общих объектов, которые статически связываются со статическими библиотеками.Эта проблема появляется только на платформах x84_64.При выполнении той же работы по компиляции на x86_32 у меня нет никаких проблем.

Возможно, это специфическая для ОС конфигурация GCC, но мои исследования показывают, что GCC работает на платформах x86_64.В любом случае, я использую gcc 4.4.3 в Ubuntu 10.04 x86_64.

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

Вопрос 1: В чем разница между -fpic и -fPIC (очевидно, -fPIC генерирует больше инструкций на x86)?Почему более поздний тип более актуален в контексте x86_64?

Вопрос 2: Я предполагаю, что когда вы связываетесь со статическим кодом, вы жестко встраиваете функции в ваш двоичный файл во время соединения, зачем ему нужен уровень косвенности "позиция"Независимый кодекс "машина обеспечивает?

Вопрос 3: Теперь, если x86 не нужен -fpic / -fPIC для связи общих объектов со статическими архивами, зачем это нужно в x86_64?

Вопрос 4: , даже если он необходим, почему он не предоставляется неявным образом?Я думал, что переломные изменения должны были быть большими нет-нет

1 Ответ

47 голосов
/ 27 октября 2010
  1. См. Вопрос 3544035 . Также обсуждаются здесь и там .
  2. Это зависит от того, какое использование вы будете использовать для своей статической библиотеки. Если вы хотите связать его только с программами, ему не нужен код PIC (libtool называет это удобной библиотекой, потому что вы можете обойтись без нее, например, она просто помогает довести процесс компиляции до разумного размера, например). В противном случае, если вы намереваетесь связать разделяемые библиотеки с ним, вам понадобится код PIC в вашей статической библиотеке.
  3. См. Вопрос 3146744 , а также здесь
  4. Он раздувает ваш код, поэтому он не используется по умолчанию. Одна вещь, которую нужно увидеть, это то, что, когда вы компилируете один объектный файл, GCC не знает, собираетесь ли вы создавать из него разделяемую библиотеку или нет. В большинстве моих небольших проектов я просто связываю вместе несколько объектных файлов, и, например, мне не нужен код PIC.

Кроме того, мой совет: если вам нужно беспокоиться об этом, вы делаете это неправильно (или вам нравится изучать трудный путь, что приятно, потому что вы получите больше от опыта). Системы компиляции (libtool, cmake, все, что вы используете) должны сделать это за вас.

...