编译aarch64架构程序后仍报‘无法执行二进制文件’错误求助
编译aarch64架构的C/Fortran程序后无法执行二进制文件
我尝试用gcc和gfortran为aarch64架构编译一个C/Fortran混合程序,编译过程无报错,但生成的二进制文件gMultiwfn无法执行。用. gMultiwfn运行时提示bash: .: gMultiwfn: cannot execute binary file,切换到sudo环境执行同样失败。
我是Fortran和编译新手,网上搜的方案大多只说“确保为正确架构编译”,没找到具体解决办法。
编译通过Makefile完成,链接命令如下:
aarch64-linux-gnu-gfortran -O2 -fopenmp -ffree-line-length-none -cpp define.o util.o plot.o Bspline.o sym.o libreta.o function.o GUI.o sub.o integral.o Lebedev-Laikov.o DFTxclib.o edflib.o fileIO.o spectrum.o DOS.o Multiwfn.o 0123dim.o LSB.o population.o orbcomp.o bondorder.o topology.o excittrans.o otherfunc.o otherfunc2.o otherfunc3.o surfana.o procgriddata.o AdNDP.o fuzzy.o CDA.o basin.o orbloc.o visweak.o EDA.o atmraddens.o NAONBO.o minpack.o ean.o hrr_012345.o eanvrr_012345.o boysfunc.o ./dislin_d-11.5.a -lXm -lXt -lX11 -lGL -lblas -llapack -o gMultiwfn
编译生成.o文件的命令为:
aarch64-linux-gnu-gfortran -O2 -fopenmp -ffree-line-length-none -cpp -c [对应文件].f90
所有.o文件均为aarch64架构。
以下是调试命令输出:
$ file gMultiwfn gMultiwfn: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID\[sha1\]=ef34baade8dbbfd9f99e970ebec8e7c6468368a2, for GNU/Linux 3.7.0, not stripped $ ls -l gMultiwfn -rwxrwxrwx 1 admin admin 8644192 Jun 8 12:54 gMultiwfn $ uname -m aarch64 $ objdump -i gMultiwfn BFD header file version (GNU Binutils for Debian) 2.40
我试过用aarch64-linux-gnu-gfortran和aarch64-linux-gnu-gcc替代普通的gfortran和gcc,还是无法执行。
解决方向
1. 修正执行命令
. gMultiwfn是bash的source命令,用于加载脚本内容到当前shell,不是运行二进制文件的正确方式。正确执行方式为:
./gMultiwfn
若当前目录不在系统PATH环境变量中,必须通过./指定当前路径;若已将当前目录加入PATH,直接输入gMultiwfn即可。
2. 检查动态链接库依赖
架构匹配但可能缺少运行时依赖的动态库,用ldd命令排查:
ldd gMultiwfn
如果输出中出现not found的库,需安装对应aarch64版本的依赖包(比如链接命令中用到的libXm、libGL、libblas等)。
3. 禁用PIE编译尝试
你的二进制是PIE(位置无关可执行文件),若系统内核对PIE支持存在异常,可在链接命令中添加-no-pie参数重新编译:
aarch64-linux-gnu-gfortran -O2 -fopenmp -ffree-line-length-none -cpp -no-pie [所有目标文件和库] -o gMultiwfn
4. 验证编译环境一致性
- 若为交叉编译(x86机器编译aarch64二进制):确保交叉工具链配置正确,所有链接的库(如
dislin_d-11.5.a)均为aarch64版本。 - 若为本地编译:尝试降低优化等级(比如
-O0)重新编译,排除优化导致的兼容性问题;同时确认gfortran版本与系统内核版本匹配。
内容的提问来源于stack exchange,提问作者HippoProgrammer
相关产品推荐
相关产品推荐

