Я пытаюсь протестировать Intel Memory Protection Extensions (MPX) на моем Macbook Pro, копируя этот учебник для Linux. Мой процессор - 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, я вижу, что сборка, генерируемая G CC, действительно имеет инструкции MPX-specifici c (bnd...
). Что еще мне нужно сделать, чтобы скомпилировать программу с защитой MPX?