Компиляция завершается с ошибкой «перемещение R_X86_64_32 против «.rodata» не может быть использовано при создании кругового объекта; перекомпилируйте с помощью -fPIE

#makefile #compiler-errors #fortran #ubuntu-20.04

#makefile #ошибки компилятора #fortran #ubuntu-20.04

Вопрос:

Я пытаюсь скомпилировать некоторый исходный код из makefile, но он не работает. Ошибка, которую я получаю,

 gfortran-9 -o sams43 sams43.o mvnorm.o isml_wrapper.o
/usr/bin/ld: sams43.o: relocation R_X86_64_32 against '.rodata' can not be used when making a PIE object; recompile with -fPIE
collect2: error: ld returned 1 exit status
make: *** [makefile:7: sams43] Error 1
  

Вот мой makefile:

 FC=gfortran-9
FCFLAGS= -g

all: sams43 normal_dataset

sams43: sams43.o mvnorm.o imsl_wrapper.o 
    ${FC} -o sams43 sams43.o mvnorm.o imsl_wrapper.o

imsl_wrapper.o: imsl_wrapper.f90
    ${FC} ${FCFLAGS} -c imsl_wrapper.f90

sams43.o: sams43.f90
    ${FC} ${FCFLAGS} -c sams43.f90

mvnorm.o: mvnorm.f90
    ${FC} ${FCFLAGS} -c mvnorm.f90

normal_dataset: normal_dataset.o mvnorm.o
    ${FC} -o normal_dataset normal_dataset.o mvnorm.o

normal_dataset.o: normal_dataset.f90
    ${FC} ${FCFLAGS} -c normal_dataset.f90

clean:
#   rm *.o sams43 normal_dataset
  

Я использую Ubuntu 20.04. Мой сотрудник может без проблем скомпилировать файл make в более старой версии ubuntu. Единственная разница между ее make-файлом и моим заключается в том, что я изменил ‘FC = gfortran’ на ‘FC = gfortran-9’. Это связано с тем, что gfortran больше не работает в моей версии Ubuntu, поэтому я использую gfortran-9 в качестве своего компилятора.

Из других сообщений здесь кажется, что это может быть проблемой с флагами, которые я использую (т. Е. Коды могли измениться между двумя версиями fortran), но я не смог найти никакой информации о том, какой флаг ввести вместо этого.

Я очень новичок в программировании, и любая помощь будет оценена!

Комментарии:

1. Вы пытались «перекомпилировать с помощью -fPIE», добавив в параметры компилятора?

2. Спасибо, как совершенно новый программист, это может сработать, но я не знаю, куда добавить это утверждение. Добавлю ли я его в свой makefile? Имеет ли значение, куда я помещаю его в makefile?

3. Вы можете добавить в FCFLAGS = строку (для некоторых шагов), но также потребуется для ${FC} -fPIE под sams43: строкой.

4. Обычно вы помещаете ${FCFLAGS} в строку ссылки, а также в строки компиляции.