当我在下面这样相当简单的东西上运行strace时,会有2次对arch_prctl的调用.他们干些什么?

$ strace echo "testing 123"
execve("/usr/bin/echo", ["echo", "testing 123"], 0x7ffd396e6c78 /* 61 vars */) = 0
brk(NULL)                               = 0x55e988289000
arch_prctl(0x3001 /* ARCH_??? */, 0x7fff0c166400) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=114959, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 114959, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5c04879000
close(3)                                = 0
openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \203\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=2250400, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5c04877000
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 1973104, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5c04695000
mmap(0x7f5c046bb000, 1441792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x26000) = 0x7f5c046bb000
mmap(0x7f5c0481b000, 319488, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x186000) = 0x7f5c0481b000
mmap(0x7f5c04869000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1d3000) = 0x7f5c04869000
mmap(0x7f5c0486f000, 31600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5c0486f000
close(3)                                = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5c04692000
arch_prctl(ARCH_SET_FS, 0x7f5c04692740) = 0
... <more syscalls>

推荐答案

TL;DR-他们正在做一些你most likely不需要理解的深奥神秘的事情.


根据arch_prctlmanual entry

Arch_prctl-设置特定于体系 struct 的线程状态

ARCH_SET_FS-将FS寄存器的64位基数设置为addr.

EINVAL-code不是有效的子命令.

因此,第二个arch_prctl系统调用正在设置FS寄存器.有关FS寄存器意义的解释,请参阅以下内容:

另一方面,第一个调用似乎正在使用无法识别的子命令发出请求.strace输出似乎不知道子命令的含义,并且它没有在<linux/prctl.h>头文件中定义.简而言之,在这种情况下,它是actually什么都不做.

UPDATE

显然,0x3001的意思是ARCH_CET_STATUS,这在 Control-flow Enforcement Technology (CET) Shadow Stack.我的猜测是,EINVAL意味着CET不是在您运行的平台上实现的.

Linux相关问答推荐

如何注释掉SLURM中的延迟调度命令?

在Linix&;Mac中运行Reaction本机项目时出现问题

Flutter 构建错误:';DART:JS_interop';在此平台上不可用

用户作用域在Linux内核密钥环(Golang)中是什么意思?

为什么库中不调用全局变量的构造函数?

记录终端输入和输出的 Bash 脚本

使用 ansible 验证 firewalld 配置

8 个半小时范围的 Crontab 表达式

如何为命令的所有选项启用无密码 sudo?

`std::cout` 是如何实现的?

Linux 如何将主机文件作为用户的输入并将其调用到脚本中

编译过度对齐的动态分配变量时出现 icpc 错误

如何使用 gcc 编译为程序集

如何获取 CPU 使用率

Linux 配置/制作,--prefix?

比较两个图像的 python/linux 方式

基于shell中正则表达式的 colored颜色 突出显示输出

区分 Java 线程和 OS 线程?

获取本地时区的 Olson TZ 名称?

如何用逗号而不是空格分割列表