Форум программистов, компьютерный форум CyberForum.ru

Что такое "position-independent code" (-fPIC in gcc) ? - C++

Восстановить пароль Регистрация
 
Butt-Head
Заблокирован
29.07.2015, 11:46     Что такое "position-independent code" (-fPIC in gcc) ? #1
What is meant my position-independent code (-fPIC in gcc)? When would you use it? How are EXE and DLL's compiled with this regard in Windows? *

Что такое "position-independent code" ((-fPIC in gcc) ? С чем его едят? Когда нужно его использовать?
Как с этой фишкой собираются EXE и DLL под Windows? В чём особенность?

Добавлено через 1 час 8 минут
Важная тема теряется... Up!

Добавлено через 14 секунд
Важная тема теряется... Up!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
29.07.2015, 15:39     Что такое "position-independent code" (-fPIC in gcc) ? #2
Это ключ для библиотек Линукса, насколько я понял. Windows тут не при чём.
Butt-Head
Заблокирован
29.07.2015, 15:48  [ТС]     Что такое "position-independent code" (-fPIC in gcc) ? #3
Цитата Сообщение от nmcf Посмотреть сообщение
Это ключ для библиотек Линукса
Ну как бы это ключ компилятора. GCC в виде minGW есть как бы и под виндой ...
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
29.07.2015, 15:59     Что такое "position-independent code" (-fPIC in gcc) ? #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если кратко.

Без fpic динамическая либа будет грузиться в память каждого процесса, который ее использует. С fpic - все процессы будут разделять одну копию. Это на 32битной. На 64битной без fpic будет ошибка линковки.

На 32битной архитектуре статическую либу пофиг как компилить - с fpic или без него.
На 64битной - пофиг, если линкуем в бинарник, и не пофиг, если линкуем в динамические либы (тогда fpic обязателен - им включается магия 64битных регистров для смещений).
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,620
29.07.2015, 16:14     Что такое "position-independent code" (-fPIC in gcc) ? #5
Цитата Сообщение от Butt-Head Посмотреть сообщение
GCC в виде minGW есть как бы и под виндой
Добавлю, что на win весь код position-independent по умолчанию, поэтому -fpic в mingw на самом деле ничего не делает.
Butt-Head
Заблокирован
29.07.2015, 16:24  [ТС]     Что такое "position-independent code" (-fPIC in gcc) ? #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Добавлю, что на win весь код position-independent по умолчанию, поэтому -fpic в mingw на самом деле ничего не делает.
Да кстати, там же DLL именно для экономии ресурсов и был придуман.
Хмм, тогда получается фраза When would you use it? How are EXE and DLL's compiled with this regard in Windows? с подвохом и собирается всё и так с этим флагом и разницы между DLL-кой и EXE как бы нет ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,900
Записей в блоге: 2
Завершенные тесты: 1
29.07.2015, 16:31     Что такое "position-independent code" (-fPIC in gcc) ? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
GCC Полное руководство.
-fpic
Компилятор генерирует независимый от положения в памяти, перемещаемый объектный код (position independent code, PIC). Такой формат необходим для получения модулей, используемых в составе динамической разделяемой библиотеки (shared library). Вся внутренняя адресация строится с использованием глобальной таблицы смешений (global offset table, GOT). При определении любого адреса содержащееся в таблице значение складывается с начальным адресом загрузки кода.
Опция используется при компиляции модулей, предназначенных для сохранения в разделяемых объектных библиотеках для их последующей динамической загрузки оттуда и использования программами во время их выполнения.
Если при использовании опции -fpic компоновщик выдает сообщение ошибки о том, что перемещаемый объектный код не работает, то следует перекомпилировать исходник с опцией -fPIC.
Некоторые системы имеют ограничение на размер таблицы смещений. Для процессора "Motorola m88k" предельный размер таблицы равен 16k, для "m68k" и "RS/6000" он равен 32k, для "Sparc" - 8k. PIC-код требует наличия определенной аппаратной поддержки и вследствие этоrо может работать только на платформах, имеющих такую поддержку.

-fPIC
Эта опция имеет то же значение, что и -fpic, но у нее есть дополнительные возможности, позволяющие обходить действующие на некоторых платформах ограничения размера таблиц смещений перемещаемого объектного кода. Такие ограничения действуют на машинах Motorola m88k, m68k и Sparc.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
29.07.2015, 16:56     Что такое "position-independent code" (-fPIC in gcc) ? #8
ТС задал вопрос в контексте windows, а потому ему ссылка не будет интересна. Но для linux'оидов может пригодиться Вопросы по динамическим библиотекам
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,620
29.07.2015, 18:51     Что такое "position-independent code" (-fPIC in gcc) ? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Butt-Head Посмотреть сообщение
Хмм, тогда получается фраза When would you use it? How are EXE and DLL's compiled with this regard in Windows? с подвохом и собирается всё и так с этим флагом и разницы между DLL-кой и EXE как бы нет ?
Я не совсем там верно написал. В windows вообще position-independent code для DLL в том смысле, в котором оно есть в UNIX, не используется.
Адреса внутри Dll строятся относительно предпочтительного базового адреса, т.е. адреса заранее фиксированы. При загрузке Dll, если базовый адрес занят, то система производит перебазирование Dll, в том числе перевычисление каждого абсолютного адреса и изменение кода для осуществления использования новых адресов. После перебазирования библиотека перестает быть разделяемой, т.е. экономии памяти для динамически загружаемых библиотек уже не происходит. Но если базовый адрес не занят, то библиотека может быть использована разделяемо. По этой причине системные библиотеки имеет заранее предвычисленные базовые адреса, чтобы они не пересекались и перебазирование не происходило.

Добавлено через 2 минуты
Вот нашел небольшую статью в сравнении с Linux so: http://www.symantec.com/connect/arti...ndows-part-one
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 20:39     Что такое "position-independent code" (-fPIC in gcc) ?
Еще ссылки по теме:

Что такое "Структурированные типы данных. Объекты" C++
Scanf "chSdSSdbQ" - что такое Q C++
Что такое "сокет"? Посоветуйте литературу C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
29.07.2015, 20:39     Что такое "position-independent code" (-fPIC in gcc) ? #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от DrOffset Посмотреть сообщение
По этой причине системные библиотеки имеет заранее предвычисленные базовые адреса, чтобы они не пересекались и перебазирование не происходило
Идиотизм какой-то... Хотя в наш век дешёвой памяти некритично, но как-то выглядит туповато
Yandex
Объявления
29.07.2015, 20:39     Что такое "position-independent code" (-fPIC in gcc) ?
Ответ Создать тему
Опции темы

Текущее время: 08:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru