Я знаю, что -fPIC
опция ' ' имеет какое-то отношение к разрешению адресов и независимости между отдельными модулями, но я не уверен, что это на самом деле означает. Вы можете объяснить?
Я знаю, что -fPIC
опция ' ' имеет какое-то отношение к разрешению адресов и независимости между отдельными модулями, но я не уверен, что это на самом деле означает. Вы можете объяснить?
Ответы:
PIC расшифровывается как Position Independent Code
и процитировать man gcc
:
Если поддерживается для целевой машины, генерировать независимый от позиции код, подходящий для динамического связывания и избегающий любых ограничений на размер глобальной таблицы смещения. Эта опция имеет значение для m68k, PowerPC и SPARC. Позиционно-независимый код требует специальной поддержки и поэтому работает только на определенных машинах.
используйте это при построении общих объектов (* .so) на упомянутых архитектурах.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
собиралась , я получил, поэтому я добавил fPIC, и она построена.
Это f
префикс gcc для параметров, которые «управляют соглашениями об интерфейсах, используемыми при генерации кода».
Это PIC
означает «позиционно-независимый код», это специализация fpic
для m68K и SPARC.
Изменить: после прочтения страницы 11 документа, на который ссылается 0x6adb015 , и комментария Кориана, я внес несколько изменений:
Этот параметр имеет смысл только для общих библиотек, и вы сообщаете ОС, что используете глобальную таблицу смещения, GOT. Это означает, что все ваши адресные ссылки относятся к GOT, и код может использоваться несколькими процессами.
В противном случае, без этой опции, загрузчику пришлось бы самому изменять все смещения.
Излишне говорить, что мы почти всегда используем -fpic / PIC.
man gcc
говорит:
-fpic Генерация позиционно-независимого кода (PIC), подходящего для использования в общем библиотека, если поддерживается для целевой машины. Такой код имеет доступ ко всем постоянные адреса через глобальную таблицу смещений (GOT). Динамичный загрузчик разрешает записи GOT при запуске программы (динамический загрузчик не является частью GCC; это часть операционной системы). Если размер GOT для связанного исполняемого файла превышает машинно-зависимый максимальный размер, вы получите сообщение об ошибке от компоновщика с указанием что -fpic не работает; в этом случае вместо этого перекомпилируйте с -fPIC. (Эти максимумы составляют 8k на SPARC и 32k на m68k и RS / 6000. У 386 нет такого предела.) Позиционно-независимый код требует специальной поддержки, поэтому работает только на определенных машинах. Для 386 GCC поддерживает PIC для System V, но не для Sun 386i. Код, созданный для IBM RS / 6000 всегда не зависит от позиции. -fPIC Если поддерживается для целевой машины, испустить независимый от позиции код, подходит для динамического связывания и позволяет избежать ограничений на размер глобальная таблица смещений. Эта опция имеет значение для m68k и SPARC. Позиционно-независимый код требует специальной поддержки, поэтому работает только на определенных машинах.