make Src 遇到PIE的問題

助教您好:我在編譯paraseis時遇到了一些問題,想要跟助教請教一下
我目前已經成功執行完lib.src.latest裡面的install了,目前正在跑src裡面的make。我使用原本的makefile時會遇到Error: Rank mismatch between actual argument at (1) and actual argument at (2) (scalar and rank-1) 的問題,因此我在compile flag中加入-fallow-argument-mismatch -fPIC這個flag,但是加入這個flag之後就遇到了令一個問題

/usr/bin/ld: ../lib/libfepg.a(subtime.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: failed to set dynamic section sizes: bad value
collect2: error: ld returned 1 exit status

我有在試著在後面加入-no-pie的flag:
加入這個flag之後fortran就會讀不到一些library,似乎不是很好的解決方式

mpif90 -o ddm ddm.o esddm.o mstart.o mbft.o nuc8g2.o agq4.o alq4.o mgather.o  incore.o mazsendpart.o mazrecvpart.o msazrecvpart.o timer.o inimpi.o intcommu.o realcommu.o  ../lib/libblas.a ../lib/libfepg.a  ../lib/libmetis.a  ../lib/libfepgsolv.a  -lm -no-pie
/usr/bin/ld: ../lib/libfepg.a(fepglib.o): in function `smit_':
fepglib.f:(.text+0x301a): undefined reference to `_gfortran_stop_numeric_f08'
collect2: error: ld returned 1 exit status
make: *** [makefile:48: ddm] Error 1

請問有什麼比較好的解決方式嗎?謝謝助教!!!

同學您好,

很抱歉之前沒有留意到您的發問 QQ

/usr/bin/ld: ../lib/libfepg.a(subtime.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIE

這個問題發生的原因是,libfepg.a 這個 Static Library 裡面的 Object file 沒有使用 PIC (Position Independent Code) 來編譯,而有其他 Shared Library 依賴 libfepg,因此出錯。

要編譯 Shared Library, 所有的 Object file 都需要 PIC,但是 Static Library 的 Object file 沒有規定要 PIC, 因此如果 Shared Library 依賴的 Static Library 沒有 PIC, 就會有這樣的錯誤訊息。

只要在編譯 libfepg 時,加上 -fPIE / -fPIC,就可以解決這個問題了!
(注意,不是在 paraseis 中加,而是在 libfepg 中加。如果很難加,有一個黑魔法:CC="gcc -fPIC")