【问题标题】:How to enforce GCC to translate volatile inline assembly statements in a linear fashion?如何强制 GCC 以线性方式翻译 volatile 内联汇编语句?
【发布时间】:2017-10-20 17:34:38
【问题描述】:

如何强制 GCC 以线性方式翻译 volatile 内联汇编语句?

我知道使内联汇编语句既易失性又依赖于内存会阻止 GCC 重新排序它们。

但是,对于 GCC 是否会将这些汇编语句线性地放置在输出文件中,并没有说什么?

假设我有以下内联汇编语句(伪代码):

[...]
volate&mem_dependent_inline_asm_statement_1
volate&mem_dependent_inline_asm_statement_2
[...]
volate&mem_dependent_inline_asm_statement_n
[...]

那么我保证 GCC 会保留它们的顺序。但是我怎么能确定GCC不会输出:

[...]
jmp label_1
label_2:
[...]
asm_statement_n
[...]
label_1:
asm_statement_1
asm_statement_2
[...]
jmp label_2

我知道我的示例有点晦涩难懂,但我在运行时的防篡改应用取决于将内联汇编语句块转换为保留顺序的相应汇编语句块。

换句话说,我想要这样的输出:

[...]
asm_statement_1
asm_statement_2
[...]
asm_statement_n
[...]

有什么想法吗?

【问题讨论】:

  • 最简单的方法是将它们组合成一个内联 asm 语句。或者,只需在 .S 文件中编写汇编代码并将其包含在您的项目中——然后您可以使用预处理器宏。
  • 没有任何保证,也没有理由让 GCC 提供您所要求的内容。您必须按照 Chris Dodd 的建议编写整个代码块,这些代码块需要在汇编中按特定顺序排列。 GCC 可以做各种各样的事情来重新排序代码。诸如部分内联和将函数分离为冷分区和热分区之类的事情甚至可以在其他函数之间移动代码。
  • @ChrisDodd - 你能提供一个小例子作为答案吗? IE。显示宏以及如何包含 .s 文件?

标签: c++ gcc assembly binary x86


【解决方案1】:

很遗憾,这是不可能的。

来自gcc docs

不要期望一系列 asm 语句保持完美 编译后连续,即使您使用的是 volatile 限定符。如果某些指令需要在 输出,把它们放在一个单一的多指令 asm 语句中。

【讨论】:

  • 谢谢! - 这似乎很有帮助。
猜你喜欢
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 2010-12-05
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2010-11-24
相关资源
最近更新 更多