【问题标题】:GCC compilation : malformed generated ASM at the end of the fileGCC 编译:在文件末尾生成格式错误的 ASM
【发布时间】:2021-08-23 12:24:30
【问题描述】:

在 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(33)
  • (GCC) 10.3.1 20210422(红帽 10.3.1-1)(2021 年 4 月 8 日)
  • 介子 --buildtype=debug :没有优化

有人知道是什么原因造成的吗?


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

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

【问题讨论】:

  • 这看起来像是系统某处的错误。

标签: c assembly gcc glib meson-build


【解决方案1】:

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

例子:

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;我试试看!

谢谢!

【讨论】:

  • 已解决问题:在 Meson Github 上发布问题:github.com/mesonbuild/meson/issues/8862;造成伤害的是“保存临时文件”,因为忍者使用并行编译导致中间文件同时被覆盖。您可以禁用“-save-temps”或使用“-j1”选项来限制一个进程。
  • 您可能希望将最后一条评论编辑到您的答案中,关于保存临时不是并行安全的。 (如果您多次构建相同的源文件?或者如果临时文件都在某个父目录中,而不是在子目录中。)
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多