Перемещение Фортрана усечено, чтобы соответствовать - mcmodel -fPIC не работает - PullRequest
0 голосов
/ 09 июля 2019

Прикрепленный мной make-файл происходит из исходного каталога кода гидродинамики гладких частиц.Когда я фиксирую количество частиц в 128 ** 3 частиц, мой код компилируется нормально.Теперь, когда мне нужно использовать 256 ** 3, я получаю relocation truncated to fit: R_X86_64_PC32 against symbol ... defined in COMMON section in ....

Я попробовал несколько вещей, которые я нашел в Интернете:

  • с помощью команды set stacksize unlimited
  • добавление -mcmodel=large флага
  • добавление -fPIC флага

ни один из этих способов не работает.Мне также известна статья https://www.technovelty.org/c/relocation-truncated-to-fit-wtf.html, но я не понимаю, что я должен делать.

Мой make-файл: (я прикрепляю его часть)

include ../makeflags
CPP=g++  
CPPFLAGS = $(OPTIONS) -D$(SYS) -mcmodel=large -traceback

.SUFFIXES: .F

OBJ = hydra.o accel.o ahtime.o clist.o cool.o createcool.o dumpdata.o   

.f.o:
    $(F77) $(FLAGS) -c $<
.F.o:
    @ if test $(SYS) = ibm ; then \
    echo "$(CPP) -P -C $(CPPFLAGS) $< > tmp/$*.f";\
    $(CPP) -P -C $(CPPFLAGS) $< > tmp/$*.f;\
    echo "$(F77) $(FLAGS) -c tmp/$*.f";\
    $(F77) $(FLAGS) -c tmp/$*.f;\
        elif test $(SYS) = f2c ; then \
        echo "$(CPP) -P -C $(CPPFLAGS) $< > tmp/$*.f";\
        $(CPP) -P -C $(CPPFLAGS) $< > tmp/$*.f;\
        echo "$(F77) $(FLAGS) -c tmp/$*.f";\
        $(F77) $(FLAGS) -c tmp/$*.f;\
    else \
    echo "$(F77) $(FLAGS) $(CPPFLAGS) -c $<";\
    $(F77) $(FLAGS) $(CPPFLAGS) -c $<;\
    fi

.c.o:
    $(CC) -c $(CPPFLAGS) $(CFLAGS) $<

hydra:  tmp $(OBJ) 
    echo $(FLAGS) 
    $(F77) -o hydra $(FLAGS) $(OBJ) $(LIBS)
    mv hydra $(RUNDIR)

new_options:
    touch *.F
    make

clean:
    /bin/rm  -rf *.o tmp 

system.o: system.$(SYS)
    @ if test $(SYS) = f2c ; then \
    cp system.f2c system.c; \
    $(CC) -c $(CPPFLAGS) $(CFLAGS) system.c; \
    else \
    cp system.$(SYS) system.f; \
    $(F77) $(FLAGS) -c system.f; \
    fi

tmp:    
    @ test -d $@ || mkdir $@
    @ for i in `ls *.inc` ; do \
    (cd tmp ; ln -s ../$$i $$i ) ; \
    done

Мой файл флагов: (я прикрепляю его часть)

SHELL = /bin/sh

# set SYS to one of: sun, dec, cray, sgi, ibm, hpux, f2c, g77
SYS = g77

# choose appropriate names for compilers
F77 = /usr/bin/f77
CC = cc
CPP = /lib/cpp 

# compilation flags for linux box
FLAGS= -O2
FLAGS=  -O2 -fomit-frame-pointer -m486 
FLAGS= -Wall -g 
FLAGS= -mcmodel=large

# For cosmic test use
  UNITS_OPTIONS =
  OTHER_OPTIONS =

OPTIONS = $(FORCE_OPTIONS) $(UNITS_OPTIONS) $(OTHER_OPTIONS)

Я понимаю, что это некоторая проблема с памятью, которая по некоторым причинам не решается с помощью опций, которые я описал выше.Пожалуйста, помните, что я не могу связываться с определениями переменных в коде (например, изменять ОБЩИЕ блоки и т. Д.), Потому что они связаны со многими программами, и это приведет к полному сбою компиляции.Точная ошибка, которую я получаю:

/ home / user / Downloads / Stage / hydra4.0 / src / hydra.F: 1 :(. Text + 0x14): перемещение усечено до соответствия:R_X86_64_PC32 для символа `param_ ', определенного в разделе COMMON в hydra.o

для многих программ компонентов, а не только для hydra.o.

...