Почему 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: даже если это необходимо, почему он не поставляется неявно ? Я думал, что ломать изменения должен был быть большой нет-нет

1 52

1 ответ:

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

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