Ошибка связывания перемещения библиотеки IRAF с R_X86_64_32 не может быть использована - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь скомпилировать программу под названием DAOSPEC, написанную на Фортране.Это дает мне следующую ошибку (среди похожих):

/ usr / bin / ld: /home/osboxes/iraf/bin.linux64//libimfort.a(imakwc.o): перемещениеR_X86_64_32 против `.bss 'нельзя использовать при создании объекта PIE;перекомпилируйте с -fPIC

Полный журнал здесь .

Как это исправить?

Мой Makefile

FCOMP = gfortran
FFLAGS = -Wall -Wextra -fPIC -fmax-errors=1 -O3 -march=native -ffast-math -funroll-loops

.SUFFIXES: .o .f
.f.o:
    $(FCOMP) -c $(FFLAGS) $<

default : daospec

daospec: daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o
    $(FCOMP) -o daospec daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o -L/usr/local/lib/ -lcfitsio -lplotsub -ldevices -lutils -L/usr/lib/x86_64-linux-gnu/ -lX11 -L/home/YOUR_USERNAME/iraf/bin.linux64/ -limfort -lsys -lvops -L/home/YOUR_USERNAME/iraf/unix/bin.linux64/ -los -lf2c -lcurl 

clean:
    rm -rf daospec *.o

Тот же Makefile работает на другом ПК с Ubuntu 16.04 gfortran 5.4, но работает на Ubuntu 18.04 gfortran 7.3.В обоих случаях файлы библиотеки IRAF совпадают.

1 Ответ

0 голосов
/ 03 марта 2019

Мне удалось решить проблему с помощью Владимир Ф .Ubuntu 18.04 использует PIE, независимые от позиции исполняемые файлы ( source ), и, следовательно, требует сборки библиотек с опцией -fPIC.Библиотеки в официальном дистрибутиве IRAF , которые я использовал, не были собраны с -fPIC, и это стало причиной моих ошибок.

К счастью, теперь можно установить библиотеки IRAF из пакета iraf-dev в Ubuntu 18.04:

sudo apt-get install iraf-dev

В качестве альтернативы, можно скомпилировать IRAF из iraf-community / iraf * из Github.Репозиторий 1016 * с опцией -fPIC.

Наконец, я изменил Makefile, чтобы использовать новые местоположения файлов библиотеки IRAF: /usr/lib/iraf/bin/ и /usr/lib/iraf/unix/bin/.

FCOMP = gfortran
FFLAGS = -Wall -Wextra -fPIC -fmax-errors=1 -O3 -march=native -ffast-math -funroll-loops

.SUFFIXES: .o .f
.f.o:
  $(FCOMP) -c $(FFLAGS) $<

default : daospec

daospec: daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o
  $(FCOMP) -o daospec daospec.o lnxsubs.o iosubs.o mathsubs.o bothsubs.o -L/usr/local/lib/ -lcfitsio -lplotsub -ldevices -lutils -L/usr/lib/x86_64-linux-gnu/ -lX11 -L/usr/lib/iraf/bin/ -limfort -lsys -lvops -L/usr/lib/iraf/unix/bin/ -los -lf2c -lcurl

clean:
  rm -rf daospec *.o
...