답변:
나는 이것이 가능하다고 생각하지 않습니다. 간부 (2) 시스템 콜은 항상 파일 이름 또는 절대 경로 요구 (파일명 항상이다 char*
). posix_spawn
파일 이름에 대한 요구 사항도 비슷합니다.
가장 가까운 것은 출력을 명명 된 파이프로 파이프하고 파이프에서 실행을 시도하는 것입니다. 셸에서 --x--x--x
비트가 설정 되지 않은 파일의 실행을 거부 할 수도 있지만 작동 할 수 있습니다 . 파이프를 작성하고 mkfifo(1)
작동시킬 수 있는지 확인하십시오.
또 다른 방법은 표준 입력을 읽고, 파일을 템포 레이 영역에 쓰고, -x 비트를 설정하고, 포크와 execs를 삭제 한 파일을 작성하는 것입니다. inode와 내용은 프로그램 실행이 끝날 때까지 유지되지만 파일 시스템을 통해 액세스 할 수 없습니다. 프로세스가 종료되면 inode가 해제되고 스토리지가 사용 가능 목록으로 리턴됩니다.
편집 : Mat가 지적한 것처럼 로더가 실행 파일에서 요청 페이지를 요청하려고 시도하면 파일에서 무작위 탐색 트래픽이 생성되고 파이프에서는 불가능하므로 첫 번째 접근 방식이 작동하지 않습니다. 이것은 두 번째와 같은 접근 방식을 남깁니다.
memfd syscall을 사용하는 솔루션 : https://github.com/abbat/elfexec
에서 사용할 수있는 명명 된 파일 디스크립터를 메모리에 작성합니다 exec
. 의사 코드 :
#include <linux/memfd.h>
...
int memfd = syscall(SYS_memfd_create, "someName", 0);
...
write(memfd,... elf-content...);
...
fexecve(memfd, argv, environ);
.o
파일을 / tmp에 쓰지 못하면 죽습니다.
그러면 코드 컴파일이 자동으로 실행되지만이를 수행하기 위해 파일 시스템에 파일이 생성됩니다.
echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out
(나는 현재 이것을 테스트하고 있지만, 이것이 확실하거나 그와 비슷한 것이 당신을 위해 효과가 있다고 확신합니다)
편집 : 파이핑의 목표가 물리 디스크를 속도 방정식에서 잘라내는 것이라면 중간 파일을 보관할 램 디스크 를 만드는 것을 고려 하십시오.
csh
.
@TheQUUX가 제안한 것처럼 자체 테스트하지는 않았지만 cling
"LLVM 및 Clang 라이브러리 위에 구축 된 대화식 C ++ 인터프리터" 를 사용해 볼 수 있습니다 .
자세한 정보는 여기에서 확인하십시오 : https://cdn.rawgit.com/root-project/cling/master/www/index.html
csh
.