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

时间:2019-03-02 08:35:51

标签: fortran linker-errors gfortran

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

  

/ usr / bin / ld:/home/osboxes/iraf/bin.linux64//libimfort.a(imakwc.o):在创建PIE对象时,不能将R_X86_64_32相对于.bss进行重定位;用-fPIC重新编译

查看完整日志here

我该如何解决?

我的Makefile

$days = array();
$amounts = array();
$commissions = array();
foreach ($result as $row) {
     array_push($days,$row['sales_day']);
     array_push($amounts,$row['sales_total']);
     array_push($commissions, $row['sales_comm']);
}

$_SESSION['days'] = $days;
$_SESSION['amount'] = $amounts;
$_SESSION['commission'] = $commissions;

同一Makefile可以在装有Ubuntu 16.04 gfortran 5.4的另一台PC上运行,但是在Ubuntu 18.04 gfortran 7.3上却可以中断。在这两种情况下,IRAF库文件都是相同的。

1 个答案:

答案 0 :(得分:0)

Vladimir F的帮助下,我设法解决了这个问题。 Ubuntu 18.04使用PIE,位置无关的可执行文件(source),因此它要求使用-fPIC选项构建库。我使用的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