나는 항상 그것이 있었는지 궁금했습니다.유닉스 명령이로 인해 어떤 문제도 발생하지 않습니다.체계 부르다. 예를 들어, 고려해 보면ls
또한 다음과 같은 시스템 호출을 많이 사용합니다.open
, read
,write
. 우리는 사용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)
자신만의 최소 구현을 만들고 싶다면 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
GNU와 달리 true
이것은 --help
및 --version
!를 지원하지 않습니다. (예를 들어 command true --version
내장된 쉘을 건너뜁니다.)
당신은 또한 볼 수 있습니다Linux용 아주 작은 ELF 실행 파일을 만드는 방법에 대한 회오리바람 튜토리얼이것이 깔끔하다고 생각한다면.
답변2
아니요.
언제든지 이와 같은 명령을 작성할 수 있지만 입력이 필요하지 않고 출력도 생성되지 않습니다. sleep(1)
시간의 흐름을 감지하기 위해 시스템 호출 도 사용해야 했습니다.
편집하다: 금지된 메모리에 쓰기를 시도하여 종료하는 것 외에는 아무것도 수행하지 않는 순수 어셈블러 프로그램입니다 SIGSEGV
.