如何强制GCC以线性方式转换易失的内联汇编语句?
我知道使内联汇编语句既易失又依赖于内存将阻止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
[...]
有任何想法吗?
最佳答案
不幸的是,这是不可能的。
从gcc docs: