Подтвердить что ты не робот

Почему gcc не неявно снабжает флаг -fPIC при компиляции статических библиотек на x86_64

У меня было множество проблем с компиляцией общих объектов, которые статически ставят статические библиотеки. Эта проблема возникает только на платформах 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:, даже если это необходимо, почему он не предоставляется неявно? Я думал, что нарушение изменений должно было быть большим, не-no

4b9b3361

Ответ 1

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

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