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

StackOverflow https://stackoverflow.com/questions/3961446

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top