実行時にシステムコールをしないUnixコマンドはありますか?

実行時にシステムコールをしないUnixコマンドはありますか?

私はいつもそれがあったかどうか疑問に思いました。Unixコマンドこれにより、問題は発生しません。システム 呼ぶ。たとえば、考えてみるとlsまた、次のようなシステムコールを多く使用します。open、、、readwrite。私たちは使用strace これらの呼び出しを見つけるためのコマンドです。

ベストアンサー1

/bin/trueそして/bin/false必要なもの以外のシステムコールをする必要はありませんexit(2)。 (GNU trueとfalseは動的にリンクされたELF実行可能ファイルなので、一般的な定型句の起動を取得します。)

asmでプログラムを作成し、そのプログラムから戻る_startか、実行を続行しようとすると、実行がマップされていないページにジャンプするときにセグメントが発生します。だからあなたは技術的にできる電話は避けてくださいexit()。しかし、その価値はありません。 :血

true(1)最も簡単な実装は空のファイルであることを読んだでしょう。これはシェルから呼び出された場合にのみ機能します。

touch true
chmod 755 true
./true
echo $?
 0
strace ./true
 write(2, "strace: exec: Exec format error\n", 32) = 32
 exit_group(1)

独自の最小実装を作成したい場合は、trueamd64で次のことを実行できます。

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

GNUとは異なり、trueこれは--help--version!をサポートしません。 (たとえば、command true --version組み込みシェルをスキップします。)

また、見ることができますLinux用の非常に小さなELF実行可能ファイルを作成する方法についての旋回風チュートリアルこれがきれいだと思うなら。

おすすめ記事