Я встраиваю системные вызовы. Да, я понимаю, что это проблематично, но у меня есть веская причина. Я значительно выследил свою ошибку, и я просто спрашиваю, почему __NR_open исчез в этой системе arm64 Arch Linux?
5.0.1-1-ARCH # 1 SMP Вс, 10 марта 15:08:34 MDT 2019 aarch64 GNU / Linux
Опять же, мой код встраивает системные вызовы. Этот подход встраивания работает в другой системе X86_64, и действительно, встраивание mmap () работает в этой системе. Однако при встраивании open () в этот arm64 Arch Linux не удалось выполнить EFAULT.
Во-первых, отслеживая мою ошибку, __NR_open даже НЕ определен в этой среде сборки. Во-вторых, обычный open () вызывает open64 (), который выполняет инструкцию svc с x8, установленным на # 56, __NR_openat em >. В-третьих, __NR_open обычно определяется как 5, и это число было изменено на __NR_setxattr. Это объясняет EFAULT.
По сути, open () преобразуется в openat () в пользовательской библиотеке в этой системе, и системный вызов __NR_open полностью исчез, перешедший новый системный вызов. Я не понимаю, что __NR_open определено в канонический исходный код для arm64, но только не для этой системы arm64 Arch Linux.
Мое исправление ошибки простое: вместо этого встроить openat (). Но у меня вопрос: почему это было удалено и почему это не считается нарушенным с точки зрения Linux? Я думаю о Линусе, говорящем МЫ НЕ НАРУШАЕМ ПОЛЬЗОВАТЕЛЬСКОЕ ПРОСТРАНСТВО!, и я не думаю об этом с точки зрения POSIX POV. Действительно, Программный интерфейс Linux не покрывает это удаление, по крайней мере, явно.