Общие библиотеки могут быть настроены двумя способами. Один с абсолютными адресами, так что каждый двоичный файл, который загружает общий объект, получает свою собственную копию общего кода, но вызовы не имеют дополнительного косвенного обращения и выполняются настолько быстро, насколько это возможно. Другой способ - с помощью кода PIC или независимого от позиции кода. Это добавляет дополнительный уровень косвенности, но затем одна копия кода совместно используемой библиотеки может обслуживать все приложения, которым это необходимо (поскольку дополнительный уровень косвенности относится к двоичному файлу приложения).
То, что вы видите, это то, что когда вы пытаетесь встроить 64-битные, абсолютные адреса из первого варианта не могут принудительно установить конкретный 64-битный адрес (возможно, некоторый объектный файл в вашем коде не поддержка 64-разрядных адресов), и компилятор сообщает, что у вас есть для использования варианта 2 с включенной PIC. Для этого вам нужно скомпилировать весь ваш код и библиотеки с -fPIC
, предполагая g ++ / gcc. Вам также может понадобиться связать библиотеку с -shared
, но я не могу вспомнить точное время, когда вы должны это сделать.