Линкер жалуется на отсутствие -fPIC - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь выполнить кросс-компиляцию заблокированной программы Cython для использования на RPi.

Ссылка выдает (для многих объектов библиотеки Python)

/usr/bin/arm-linux-gnueabihf-ld: 
/root/xxx_Build/usr/local/lib/python3.7/config-3.7m-arm-linux-gnueabihf/libpython3.7m.a(getopt.o): relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC

Компоновщик должен создать исполняемый файл (а не общий объект). Почему?

Компиляция (из моих модулей):

cython_freeze.py -o main.c sub.py
cython sub2.py

{crossPrefix}gcc -fPIC -pthread -O2 -Wall -Wextra -fno-strict-aliasing -fwrapv -I{crossRoot}{pythonInclude} -c -o main.o main.c'
{crossPrefix}gcc -fPIC -pthread -O2 -Wall -Wextra -fno-strict-aliasing -fwrapv -I{crossRoot}{pythonInclude} -c -o sub.o sub.c'

Ссылка:

{crossPrefix}gcc -Xlinker -export-dynamic -L{crossRoot}/usr/local/lib/{pythonCommand}/config-{pythonVersion}m-{crossPrefixM} main.o sub.o -l{pythonCommand}m -lm -lpthread -ldl -lutil -o 

Версия:

  • Python 3.7.0 (из python.org со сборкой по умолчанию)
  • Cython 0.28.5
  • Host UBUNTU 18.04 x64
  • Цель UBUNTU MATE 16.04 Raspberry Pi 3 B +

Вышеупомянутый процесс работал с

  • Python 3.6.4
  • Cython 0.23.3
  • Host UBUNTU 16.04 x64
  • Цель UBUNTU MATE 16.04 Raspberry Pi 3 B +

1 Ответ

0 голосов
/ 13 сентября 2018

Компоновщик должен создать исполняемый файл (а не общий объект). Почему?

Начиная с Ubuntu 17.04, Ubuntu присоединилась к тенденции в конфигурациях сборки GCC. по умолчанию генерировать PIE (независимые от позиции исполняемые файлы) и, следовательно, объект PIC файлы по умолчанию. PIE усиливают безопасность системы, поскольку такие исполняемые файлы могут работать при наличии ASLR

См:

$ cat /etc/*-release | grep VERSION
VERSION="18.04.1 LTS (Bionic Beaver)"
VERSION_ID="18.04"
VERSION_CODENAME=bionic

$ echo "int main(void) { return 0; }" | gcc -x c -
$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=3597d2a178dfb7ff7b0ba10886819bf19e40d596, not stripped

PIEs являются общими объектами, поэтому все объектные файлы в связке PIE должны быть скомпилированы -fPIC. Это будет по умолчанию для вновь скомпилированных объектных файлов, но, очевидно, это не относится к объектным файлам в вашем libpython3.7m.a.

Вы можете настаивать на старомодном исполняемом файле, добавив -no-pie к параметрам связывания. (в этом случае вам не нужно компилировать свой собственный код с помощью -fPIC).

...