在John Viega的C和C ++安全编程手册中,我遇到了以下声明
asm("value_stored: \n"
".long 0xFFFFFFFF \n"
);
我真的不明白在汇编中使用.long
指令,但在这里它用于在可执行文件中嵌入一个预先计算的值。我可以以某种方式强制这些字节在可执行文件中的位置吗?我试图把它放在main
的末尾(认为这种方式将在.text
部分的末尾),但我得到了分段错误。把它放在主要作品之外。
答案 0 :(得分:3)
即使在main
的末尾,内联汇编程序序列也会生成要执行的代码。在我的环境中objdump -d foo.o
显示:
00000000004004b4 <main>:
4004b4: 55 push %rbp
4004b5: 48 89 e5 mov %rsp,%rbp
00000000004004b8 <value>:
4004b8: ff (bad)
4004b9: ff (bad)
4004ba: ff (bad)
4004bb: ff (bad)
4004bc: b8 01 00 00 00 mov $0x1,%eax
4004c1: 5d pop %rbp
4004c2: c3 retq
跳过它可以减轻这种情况
asm("jmp 1f"
"value: .long 0xffffffff"
"1:");
关键字Nf或Nb创建本地临时标签以向前或向后跳跃。
另一个选项是将变量放到命名段中,该段可以在链接器文件中作为.text或.data中的最后一个段进行排序。