Компоновщик должен создать исполняемый файл (а не общий объект). Почему?
Начиная с 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
).