Dee*_*ngh 0 shell-script command
我一直想知道是否有任何不进行任何系统调用的Unix 命令。例如,如果我们考虑实例,它也会使用很多系统调用,例如, ,。我们使用该 命令来查找这些调用。 lsopenreadwritestrace
/bin/true并/bin/false没有做任何系统调用比所需的其他exit(2)。(GNU true 和 false 是动态链接的 ELF 可执行文件,所以当然你会得到通常的样板启动)。
如果你在 asm 中编写了一个试图从 返回的程序_start,或者只是继续执行,当执行跳转到一个未映射的页面时,它会出现段错误。所以,你在技术上能够避免调用exit(),但它是不值得。:P
您可能已经读过 最简单的实现true(1)是一个空文件。这仅在从 shell 调用时才有效。
touch true
chmod 755 true
./true
echo $?
0
strace ./true
write(2, "strace: exec: Exec format error\n", 32) = 32
exit_group(1)
Run Code Online (Sandbox Code Playgroud)
如果您想制作自己的最小true实现,那么在 amd64 上您可以执行以下操作:
cat > exit64.s <<EOF
.section .text
.globl _start
_start:
xor %edi, %edi
mov $231, %eax # exit(0)
syscall
# movl $1,%eax # 32bit int80 can call the 32bit ABI system calls from long mode
# int $0x80
EOF
as exit64.s -o exit64.o && ld exit64.o -o exit64
strace ./exit64
execve("./exit64", ["./exit64"], [/* 69 vars */]) = 0
exit_group(0) = ?
+++ exited with 0 +++
file exit64
exit64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
Run Code Online (Sandbox Code Playgroud)
与 GNU 不同true,这个不支持--help和--version! (例如command true --version跳过shell内置。)
如果您认为这很简洁,另请参阅关于为 Linux 创建真正小巧的 ELF 可执行文件的旋风教程。
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |