【发布时间】:2020-05-08 21:30:18
【问题描述】:
我正在尝试通过镜像this tutorial for Linux 在我的 Macbook Pro 上测试英特尔的内存保护扩展 (MPX)。我的处理器是 Intel Core i5-6267U,它确实能够使用 MPX,已通过运行 sysctl machdep.cpu | grep MPX 验证。但是,当我尝试编译以下测试程序时:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define noinline __attribute__((noinline))
char dog[] = "dog";
char password[] = "secr3t";
noinline
char dog_letter(int nr)
{
return dog[nr];
}
int main(int argc, char **argv)
{
int max = sizeof(dog);
int i;
if (argc >= 2)
max = atoi(argv[1]);
for (i = 0; i < max; i++)
printf("dog[%d]: '%c'\n", i, dog_letter(i));
return 0;
}
使用以下命令:
/usr/local/bin/gcc-8 -o mpx_test -fcheck-pointer-bounds -mmpx mpx_test.c
我收到以下错误字符串:
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:26:10: error: unexpected token in argument list
bnd jle L2
^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:37:11: error: unexpected token in argument list
bnd call _atoi
^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:41:10: error: unexpected token in argument list
bnd jmp L3
^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:45:11: error: unexpected token in argument list
bnd call _dog_letter
^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:57:9: error: unexpected token in argument list
bnd jl L4
^
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:61:2: error: invalid instruction mnemonic 'bnd'
bnd ret
^~~
/var/folders/v0/g_jfwt1j0kj1cp6vjn818jjh0000gn/T//cc5F0fho.s:88:2: error: invalid instruction mnemonic 'bnd'
bnd ret
^~~
如果我使用 -S 标志进行编译,我可以看到 GCC 生成的程序集确实具有特定于 MPX 的指令 (bnd...)。我还需要做什么来编译带有 MPX 保护的程序?
【问题讨论】:
-
GCC 没有删除 MPX 支持吗?
-
Apple 的汇编程序似乎还没有更新以理解 MPX。这可能意味着内核和 C 库也不支持 MPX。您将不得不等待支持此功能的新版 OSX。
-
什么虚拟机?我听说 MPX 也已从 Linux 内核中删除。
-
如果您想在 VM 中运行代码,请在 VM 中编译。您正在做的是将和组装编译成 MachO64 目标文件 MacOS,因此即使您遗漏了
-fcheck-pointer-bounds -mmpx,您也很难在 Linux 上运行它 -
我不知道 MPX 是否需要虚拟机管理程序和/或外部操作系统的支持才能在 VM 内部使用。你不妨试试看。