Хотите хорошего понимания общих библиотек на уровне памяти - PullRequest
2 голосов
/ 11 февраля 2012

Пожалуйста, помогите.Я создаю разделяемую библиотеку, и при запуске с этой командой это выдает ошибку "gcc -shared libx.o -o libx.so"

/ usr / lib64 / gcc / x86_64-suse-linux / 4.3 /../../../../x86_64-suse-linux/bin/ld: libx.o: перемещение R_X86_64_32 против `.rodata 'нельзя использовать при создании общего объекта;перекомпилировать с -fPIC libx.o: не удалось прочитать символы: неверное значение

collect2: ld вернул 1 состояние выхода

Итак, я запускаю его с -FPIC, он компилируется, вы можете датья хорошо понимаю значение -FPIC на уровне памяти, я имею в виду, как оно распределяется в физической памяти между двумя программами, использующими эту общую библиотеку.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 19 сентября 2016

Для систем с виртуальной памятью загрузчик, скорее всего, отобразит общий код на несколько смежных страниц в пространстве памяти приложений, использующих эту библиотеку.Чтобы разделить эти страницы между несколькими процессами, они должны быть:

  1. только для чтения.
  2. может отображаться в произвольном адресном пространстве процесса.

Последствия:

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

  2. Эффективный код часто не может быть сопоставлен с произвольным местоположением в адресном пространстве.Обычно эффективный код ограничен конкретным адресом или низким диапазоном адресов.Опция -fpic указывает компилятору использовать менее эффективный код, но с преимуществом отсутствия ограничений относительно места его выполнения.

Теперь мы можем понять вашу проблему:

перемещение R_X86_64_32 против `.rodata ' - Здесь компоновщик предупреждает вас о том, что компилятор использовал кодген, который ограничен в работе с низким диапазоном адресов.Поэтому он не подходит для использования в общей библиотеке.

1 голос
/ 21 февраля 2013

-fpic обозначает независимый от позиции код.

Вы можете прочитать drepper, чтобы получить больше идей о динамическом соединении http://www.akkadia.org/drepper/dsohowto.pdf

Кажется, дубликат аналогичного поста GCC -fPIC опция

...