zsh에서 실행을 시도할 때 다음 명령은 다음에서 가져옵니다.여기
/lib64/ld-linux-x86-64.so.2 =(/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}'\
| sudo gcc -x c -o /dev/stdout -)
다음 오류를 반환합니다.
/tmp/zshgYCSAH: 공유 라이브러리 로드 오류: /tmp/zshgYCSAH: 파일이 너무 짧습니다.
다만, 발급
/lib64/ld-linux-x86-64.so.2 /bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}'
#include <stdio.h>
int main(){printf("c one liners\n");}
예상되는 동작을 반환합니다.
여기서 매우 분명한 것을 놓치고 있습니까?
운영 체제, GCC 권한 및 버전
uname -a
Linux debian 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64 GNU/Linux
\ls -l /usr/bin/x86_64-linux-gnu-gcc-8
-rwxr-x--- 1 root root 1100664 Apr 6 2019 /usr/bin/x86_64-linux-gnu-gcc-8
sudo gcc --version
gcc (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
문맥
file =(/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}' | sudo gcc -x c -o /dev/stdout -)
/tmp/zshrOdFnK: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d94f408ab2b445d20624e2b1fb7c4939dfc25c46, not stripped
\ls -l =(/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}' | sudo gcc -x c -o /dev/stdout -)
-rw------- 1 paulo paulo 16600 Mar 30 12:37 /tmp/zshTNxAXl
컴파일러 하위 명령이 제대로 작동하는 것 같습니다.
/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}' | gcc -x c -o a.out -
ls -l a.out
-rwxr-xr-x 1 root root 16600 Mar 30 12:03 a.out
du a.out
20 a.out
./a.out
c one liners
답변1
컴파일러 하위 명령이 제대로 작동하는지 확인하는 것이 좋습니다.
/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}' | gcc -x c -o a.out -
ls -l a.out
결과가 길이가 0인 임시 출력 파일인 경우 표시되는 오류가 발생합니다.
/lib64/ld-linux-x86-64.so.2 /dev/null
/dev/null: error while loading shared libraries: /dev/null: file too short
답변2
문제의 원인이 무엇인지 알아냈습니다: 권한.
GCC 권한
\ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 5 Feb 25 2019 /usr/bin/gcc -> gcc-8
\ls -l /usr/bin/gcc-8
lrwxrwxrwx 1 root root 22 Apr 6 2019 /usr/bin/gcc-8 -> x86_64-linux-gnu-gcc-8
\ls -l /usr/bin/x86_64-linux-gnu-gcc-8
-rwxr-x--- 1 root root 1100664 Apr 6 2019 /usr/bin/x86_64-linux-gnu-gcc-8
ELF 객체에 대한 권한
\ls -l =(/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}' | sudo gcc -x c -o /dev/stdout -)
-rw------- 1 paulo paulo 16600 Mar 30 12:37 /tmp/zshTNxAXl
접두사가 붙은 명령을 실행합니다.sudo
sudo /lib64/ld-linux-x86-64.so.2 =(/bin/echo -e '#include <stdio.h>\nint main(){printf("c one liners\\n");}' | sudo gcc -x c -o /dev/stdout -)
c one liners
올바른 결과를 반환합니다.