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

时间:2017-05-20 18:35:30

标签: c++ gcc assembly binary x86

如何强制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会保留他们的订购。但我怎么能确定海湾合作委员会不会输出:

[...]
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
[...]

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

不幸的是,这不可能。

来自gcc docs

  

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