无法使用链接 IRAF 库重定位 R_X86_64_32 的错误

Error linking IRAF library relocation R_X86_64_32 against can not be used

我正在尝试编译一个用 Fortran 编写的名为 DAOSPEC 的程序。它给了我以下错误(以及类似的错误):

/usr/bin/ld: /home/osboxes/iraf/bin.linux64//libimfort.a(imakwc.o): relocation R_X86_64_32 against `.bss' can not be used when making a PIE object; recompile with -fPIC

查看完整日志 here

我该如何解决?

我的生成文件

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 的另一台 PC 上工作,但在 Ubuntu 18.04 gfortran 7.3 上会中断。在这两种情况下,IRAF 库文件都是相同的。

Vladimir F. Ubuntu 18.04 uses PIE, position independent executables (source), and thus it requires libraries to be built with -fPIC option. The libraries in the official IRAF distribution 的帮助下,我已经设法解决了这个问题,我使用的不是用 -fPIC 构建的,这就是导致我出错的原因。

幸运的是,现在可以从 Ubuntu 18.04 上的 iraf-dev 软件包安装 IRAF 库:

sudo apt-get install iraf-dev

或者,可以使用 -fPIC 选项从 Github 的 iraf-community/iraf 存储库编译 IRAF。

最后,我修改了 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