如何在Mac上使用英特尔的内存保护扩展(MPX)编译程序?

问题描述 投票:0回答:1

我正在尝试通过镜像this tutorial for Linux在我的Macbook Pro上测试英特尔的内存保护扩展(MPX)。我的处理器是Intel Core i5-6267U,通过运行sysctl machdep.cpu | grep MPX,它确实具有使用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保护的程序?

c gcc x86 cpu intel
1个回答
0
投票

我发现了一种解决方法,可以让我在Mac上使用MPX-尽管它实际上仅适用于小型程序。我为使MPX用于内核空间而采取的步骤如下:

  1. 启用MPX。有关如何执行此操作,请参阅英特尔手册。简而言之,需要向MSR写一些位。
  2. 启动Linux VM或在具有支持MPX的汇编程序的任何其他系统上跳。
  3. 在第二个系统上,写出MPX组装说明(在Mac上要在程序中使用该指令)并组装程序。
  4. 通过objdump -d分解程序,并将相关MPX指令和操作数的操作码复制到Mac上的内联汇编中。
  5. 在Mac上编译并运行:)

这在用户空间中也适用于MPX,但启用MPX的方式略有变化(XSAVE用户空间指令和MSR用于内核空间)。

作为复制操作码后Mac上的嵌入式程序外观的示例,请考虑以下内容。

__asm__ volatile (
        ".byte 0x48, 0x8d, 0x45, 0xf0           \t\n" // leaq -16(%rbp), %rax
        ".byte 0xf3, 0x0f, 0x1b, 0x40, 0x10     \t\n" // bndmk 16(%rax), %bnd0
        ".byte 0xf2, 0x0f, 0x1a, 0x40, 0x16     \t\n" // bndcu 22(%rax), %bnd0
        :
        :
        : "rax"
    );
© www.soinside.com 2019 - 2024. All rights reserved.