Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在armv6中查找Exeve的系统调用号?_Linux_Assembly_Arm_System Calls_Armv6 - Fatal编程技术网

Linux 如何在armv6中查找Exeve的系统调用号?

Linux 如何在armv6中查找Exeve的系统调用号?,linux,assembly,arm,system-calls,armv6,Linux,Assembly,Arm,System Calls,Armv6,我正在尝试在ArchLinuxARMV6L体系结构上编写汇编代码,需要调用execve。 对于x86和x86-64,系统调用号分别为59(64位)和11(32位),可以使用以下方法找到 $ grep execve /usr/include/x86_64-linux-gnu/asm/unistd_64.h #define __NR_execve 59 #define __NR_execveat 322 $ grep execve /usr/include/x86_64-linux-gnu/asm/

我正在尝试在ArchLinuxARMV6L体系结构上编写汇编代码,需要调用execve。 对于x86和x86-64,系统调用号分别为59(64位)和11(32位),可以使用以下方法找到

$ grep execve /usr/include/x86_64-linux-gnu/asm/unistd_64.h
#define __NR_execve 59
#define __NR_execveat 322
$ grep execve /usr/include/x86_64-linux-gnu/asm/unistd_32.h
#define __NR_execve 11
#define __NR_execveat 358
同样的,在arm中有什么方法可以做到这一点吗?如何确定哪一个将产生正确的系统呼叫号码? 下面是Arm系统的结果

$ find /usr/include -name "unistd.h"
/usr/include/bits/unistd.h
/usr/include/sys/unistd.h
/usr/include/linux/unistd.h
/usr/include/asm/unistd.h
/usr/include/unistd.h
/usr/include/asm-generic/unistd.h

$ grep execve /usr/include/asm/unistd-common.h
#define __NR_execve (__NR_SYSCALL_BASE + 11)
#define __NR_execveat (__NR_SYSCALL_BASE + 387)
$ grep execve /usr/include/asm-generic/unistd.h
#define __NR_execve 221
__SC_COMP(__NR_execve, sys_execve, compat_sys_execve)
#define __NR_execveat 281
__SC_COMP(__NR_execveat, sys_execveat, compat_sys_execveat)
请帮我找到Exeve的正确系统呼叫号码。 多谢各位

Linux alarmpi 4.4.34+#3 Thu Dec 1 14:44:23 IST 2016 armv6l GNU/Linux


您是否尝试过简单地编译(或预处理)
\include
/
int callnum=\uu NR\u execve查看您得到的号码?这似乎是对标题中的
#if
逻辑进行排序的明显方式。您需要在ARM平台的
\uuunr\usyscall\ubase
中找到基值,并将11添加到其中。在某些ARM系统上,
\unr\usyscall\ubase
为0x0,在某些ARM系统上为0x900000。此链接包含各种平台的一些系统调用表(其中包括ARM strong和ARM thumb):。表中还列出了用于参数等的寄存器。@PeterCordes Thank You能够使用该方法确认它使用的是11。@MichaelPetch感谢W3challs链接,这是一个非常方便的站点。NR_SYSCALL_BASE几乎总是零。对于一些超旧系统(2010年之前),它是0x900000。“thumb”ABI与NR_SYSCALL_BASE为零的ARM相同。如果您运行一些超旧的StrongARM Linux,您可能会得到一个OABI系统。对于4.4.43系统,必须结合一些真正奇怪的情况才能使其成为仅限OABI的系统。内核可能同时支持这两种操作,以使用2010年以前的二进制文件。许多现代Linux都是用两个表编译的。您不应该发现任何仅具有0x9000000的现代系统,但只能为零。所有硬件都可以使用其中一种;这只是软件问题。