【发布时间】:2017-05-29 21:51:17
【问题描述】:
我刚刚阅读了有关 GCC 中英特尔平台上对 %fs 和 %gs 段前缀的支持。 有人提到“获取基于 %gs 的指针的方式,或控制 %gs 本身的值,超出了 gcc 的范围;"
我正在寻找一种方法,我可以手动设置 %fs 的值(我在 IA32,RH Linux 上)并使用它。当我刚刚设置 %fs=%ds 时,下面的测试工作正常,这是预期的。但是我无法更改测试以获得另一个 %fs 值并且不会出现分段错误。我开始认为改变 %fs 的值并不是唯一要做的事情。所以我正在寻找一个建议,如何让 %fs 寻址的内存部分不等于 DS。
#include <stddef.h>
typedef char __seg_fs fs_ptr;
fs_ptr p[] = {'h','e','l','l','o','\0'};
void fs_puts(fs_ptr *s)
{
char buf[100];
buf[0] = s[0];
buf[1] = s[1];
buf[2] = s[2];
buf[3] = '\0';
puts(buf);
}
void __attribute__((constructor)) set_fs()
{
__asm__("mov %ds, %bx\n\t"
"add $0, %bx\n\t" //<---- if fs=ds then the program executes as expected. If not $0 here, then segmentation fault happens.
"mov %bx, %fs\n\t");
}
int main()
{
fs_puts(p);
return 0;
}
【问题讨论】: