c-GCC编译:在文件末尾生成格式错误的ASM



在Linux Fedora上使用GLib在个人C11项目上使用Meson构建和GCC,我在编译时不断随机得到以下错误:

movie.s: Assembler messages:
movie.s:6916: Error: no such instruction: `te.gnu-stack,"",@progbits'
ninja: build stopped: subcommand failed.

检查故障文件后,生成的ASM结尾格式不正确(最后一条指令看起来复制不正确?(

版本不正确:

.LASF52:
.string "GClassInitFunc"
.ident  "GCC: (GNU) 10.3.1 20210422 (Red Hat 10.3.1-1)"
.section    .note.GNU-stack,"",@progbits
te.GNU-stack,"",@progbits

正确版本:

.LASF52:
.string "GClassInitFunc"
.ident  "GCC: (GNU) 10.3.1 20210422 (Red Hat 10.3.1-1)"
.section    .note.GNU-stack,"",@progbits

正如您在故障ASM的最后一行所看到的,此输出行被附加:

te.GNU-stack,"",@progbits

当这个错误发生时,我基本上重新启动编译过程,有时它只是"神奇地"工作(没有对任何文件进行任何修改(。

我的编译器版本:

  • Linux Fedora 33版(三十三(
  • (GCC(10.3.1 20210422(Red Hat 10.3.1-1((2021年4月8日(
  • 介子--buildtype=debug:不进行优化

有人知道是什么原因导致的吗?


编辑:
解决问题:在Meson Github上发布问题:Github.com/mesonbuild/meso/issues/8862;它是";保存temps";造成危害的原因是,忍者使用并行编译,导致中间文件同时被覆盖。您可以禁用"-保存temps";或使用"-j1";限制为一个进程的选项

总之:使用公共源文件构建多个对象/可执行文件时,保存临时文件不是完全并行安全的。

Meson在这里构建;基本上我有两个";可执行的";目标具有共享源,并且由于某种原因,第一个似乎与第二个重叠,尽管它应该是顺序的。

示例:

executable('app',
sources: [
'main.c',
'movie.c',
],
dependencies: [depglib, depgtk, deplibcurl],
)
executable('convert',
sources: [
'convert.c',
'movie.c',
],
dependencies: [depglib, depgio],
)

此答案建议链接到共享库:https://stackoverflow.com/a/47725711/7776411;我会试试的!

谢谢!

最新更新