Я встраиваю системные вызовы.Да, я понимаю, что это проблематично, но у меня есть веская причина.Я значительно отследил свою ошибку и просто спрашиваю, почему __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 .В-третьих, __NR_open обычно определяется как 5, и это число было переназначено на __NR_setxattr .Это объясняет, что EFAULT .
По существу, open () преобразуется в openat () в пользовательской библиотеке в этой системе и в __NR_open системный вызов полностью исчез, перешел в новый системный вызов.Что я не понимаю, так это то, что __NR_open определено в каноническом источнике для arm64, но не в этой системе arm64 Arch Linux.
Моя ошибка исправлена просто: inline openat () вместо.Но мой вопрос: почему это было удалено и почему это не считается сломанным из Linux POV?Я думаю о Линусе, который говорит: «1051 * МЫ НЕ ПЕРЕРЫВАЕМ ПОЛЬЗОВАТЕЛЬСКОЕ ПРОСТРАНСТВО!» и я не думаю об этом из POSIX POV.Действительно, Интерфейс программирования Linux не охватывает это удаление, по крайней мере, явно.