2012-01-02 2 views
2

Я смотрел и искал это, но я не вижу, что я сделал.boost testing fpic linking error

У меня есть рабочий проект на 32-битной машине. Я просто вытащил хранилище на 64 битную машину (которая была оригинальной машиной разработки для проекта), и я теперь получаю следующие ошибки, связывающие при попытке построить тестирование бинарного

/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires dynamic R_X86_64_PC32 reloc against 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)' which may overflow at runtime; recompile with -fPIC 
/usr/bin/ld: error: /usr/lib/libboost_test_exec_monitor-mt.a(unit_test_log.o): requires unsupported dynamic reloc 11; recompile with -fPIC 

Я действительно не могу посмотрите, что я мог бы изменить. Библиотеки ускорения вытаскиваются прямо из репозиториев ubuntu. Любой, у кого есть какие-то подсказки.

ответ

0

Хорошо, ответ Саймона действительно помог мне на этом пути.

Окончательное решение этой конкретной проблемы заключается в использовании

libboost_unit_test_framework 

(который поставляется с общей библиотеке) вместо

libboost_test_exec_monitor 

(который не делает)

2

Общие библиотеки могут быть установлены двумя способами. Один из них имеет абсолютные адреса, так что каждый двоичный файл, который загружает общий объект, получает свою собственную копию общего кода, но вызовы не имеют дополнительной косвенности и находятся как можно быстрее. Другим способом является «PIC» или независимый от положения код. Это добавляет дополнительный слой косвенности, но затем одна копия кода разделяемой библиотеки может обслуживать все приложения, которые в ней нуждаются (поскольку дополнительный уровень косвенности для каждого приложения двоичный).

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

+0

Ошибки указывая мне на libboost_test_exec_monitor-mt.a - предположительно библиотеки boost уже скомпилированы с помощью fpic? Есть ли способ определить, какие из моих библиотек я забыл скомпилировать с помощью fpic – Tom

14

Вы связываете статическую библиотеку (Boost) в динамическую библиотеку. Статические библиотеки обычно не строятся с -fPIC, поскольку предполагается, что они связаны только с программой, а не с другой библиотекой.

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

Это преобразование не выполняется на x86 64 бит; два сообщения об ошибках означают

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

Таким образом, компоновщик не может генерировать код, который будет загружаемым, и по праву отказывается сделать это .

Для решения этой проблемы вам необходимо установить связь с общим libboost_test_exec_monitor-mt или самостоятельно создать статическую библиотеку.