icx生成非ELF格式.o文件致ifx链接失败及生成方法问询
问题背景
使用Intel® oneAPI DPC++/C++ Compiler(icx)编译生成的.o文件并非ELF格式,使用ifx链接时出现如下错误:
ifx -O3 -ffast-math -nofor-main -DSPEC_CPU_LP64 flincs.o fsettle.fppized.o fshake.o innerf.o flincsd.o fsettled.fppized.o fshaked.o 3dview.o atomprop.o binio.o block_tx.o bondfree.o buffer.o calcgrid.o calch.o calcmu.o calcvir.o clincs.o comlib.o confio.o constr.o copyrite.o coupling.o csettle.o disre.o do_fit.o do_gct.o dummies.o ebin.o edsam.o enxio.o ewald.o ewald_util.o f77_wrappers.o fatal.o ffscanf.o fftgrid.o filenm.o fnbf.o force.o futil.o gbutil.o gctio.o genalg.o ghat.o glaasje.o gmx_system_xdr.o gmxfio.o ifunc.o index.o init.o init_sh.o innerc.o invblock.o ionize.o libxdrf.o macros.o main.o maths.o matio.o md.o mdatom.o mdebin.o mdrun.o memdump.o minimize.o mshift.o mvdata.o mvxvf.o names.o network.o nrama.o nrjac.o nrnb.o ns.o nsb.o nsgrid.o orires.o pargs.o pbc.o pdbio.o pme.o poisson.o pppm.o princ.o psgather.o pssolve.o psspread.o pull.o pullinit.o pullio.o pullutil.o rando.o random.o rbin.o rdgroup.o readinp.o relax_sh.o replace.o rmpbc.o shakef.o shift_util.o sim_util.o smalloc.o sortwater.o splittop.o stat.o statutil.o strdb.o string2.o symtab.o synclib.o tables.o tgroup.o tpxio.o trnio.o trxio.o txtdump.o typedefs.o update.o vcm.o vec.o viewit.o wgms.o wman.o wnblist.o writeps.o xdrd.o xtcio.o xutils.o xvgr.o -lm -o gromacs 3dview.o: file not recognized: file format not recognized
经检查确认icx生成的目标文件不是ELF格式:
root@lanlanxiyiji-PC:/home/speccpu2006-v1.0.1/benchspec/CPU2006/400.perlbench/run/build_base_x86_64_linux.0000# icx -c -o 3dview.o -DSPEC_CPU -DNDEBUG -DPERL_CORE -std=gnu89 -flto -O3 -ffast-math -funroll-loops -fomit-frame-pointer -ftree-vectorize -fprefetch-loop-arrays -DSPEC_CPU_LP64 -DSPEC_CPU_LINUX_X64 -include math.h -fno-strict-aliasing 3dview.c icx: warning: optimization flag '-fprefetch-loop-arrays' is not supported [-Wignored-optimization-argument] root@lanlanxiyiji-PC:/home/speccpu2006-v1.0.1/benchspec/CPU2006/400.perlbench/run/build_base_x86_64_linux.0000# readelf -h 3dview.o readelf: Error: Not an ELF file - it has the wrong magic bytes at the start icx version Intel(R) oneAPI DPC++/C++ Compiler 2023.0.0 (2023.0.0.20221201) Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /opt/intel/oneapi/compiler/2023.0.0/linux/bin-llvm Configuration file: /opt/intel/oneapi/compiler/2023.0.0/linux/bin-llvm/../bin/icx.cfg
问题解答
1. 为何ifx无法识别该目标文件?ifort却可以正常链接?
编译命令中添加了-flto(链接时优化)选项,icx在该选项下生成的是LLVM bitcode格式的文件,而非标准ELF目标文件:
- ifort(旧版Intel Fortran编译器)对LLVM bitcode的兼容性更好,能自动处理这类文件完成链接;
- ifx基于LLVM架构,但默认不会自动识别bitcode格式的
.o文件,因此报错无法识别格式。
2. 如何通过icx生成ELF格式的目标文件?
有两种可行方案:
- 移除LTO选项:直接删除编译命令中的
-flto,icx会生成标准ELF格式的目标文件,ifx可正常识别链接; - 保留LTO并生成兼容ELF:若需要LTO优化,可添加
-fembed-bitcode选项,让icx生成内嵌bitcode的ELF目标文件,既保留优化能力又能被ifx识别;或替换-flto为-flto=thin,thin LTO生成的文件格式兼容ifx的链接流程。
内容的提问来源于stack exchange,提问作者nino
相关产品推荐
相关产品推荐

