디스크에 쓰지 않고 g++로 C++ 코드를 컴파일하는 방법이 있나요? [폐쇄]

디스크에 쓰지 않고 g++로 C++ 코드를 컴파일하는 방법이 있나요? [폐쇄]

저는 특별한 Linux 환경을 가지고 있습니다. 모든 파일과 폴더는 읽기 전용이고 G++가 설치되어 있습니다. 더 이상 달릴 수 없어요 sudo. C++ 프로그램을 실행할 수 있습니다. 다른 C++ 코드를 컴파일하고 싶어서 다음과 같은 코드를 작성했습니다.

#include<iostream>
#include<string>
#include<cassert>

#include<unistd.h>
#include<wait.h>
#include<sys/mman.h>

constexpr char GPPPATH[]="/bin/g++";

int compile(std::string const& program){
    int exefid=memfd_create("exe",0);
    int subpid=fork();
    assert(subpid!=-1);
    if (subpid==0){
        int pid=getpid();
        int programfid=memfd_create("program",0);
        write(programfid,program.c_str(),program.size());
        std::string const programPath="/proc/"+std::to_string(pid)+"/fd/"+std::to_string(programfid);
        std::string const ExePath="/proc/"+std::to_string(pid)+"/fd/"+std::to_string(exefid);
        dup2(fileno(stdout),fileno(stderr));
        execl(GPPPATH,GPPPATH,"-xc++",programPath.c_str(),"-o",ExePath.c_str(),NULL);
        throw;
    }else{
        int status;
        waitpid(subpid,&status,0);
        if (!WIFEXITED(status)) throw;
    }
    return exefid;
}
int main(int argc,char** argv,char** envp){
    int fid=compile("""#include<bits/stdc++.h>\nint main(){std::cout<<\"IAKIOI\";}""");
    fexecve(fid,argv,envp);
}

내가 사용한 출력 파일을 저장하려면 memfd_create물론 작동하지 않았습니다. G++는 디스크에 임시 파일을 생성하려고 시도했지만 실패했습니다. 디스크 쓰기 없이 g++에서 C++를 컴파일할 수 있는 방법이 있나요?

또한 사용해 보았 -pipe으나 여전히 임시 파일이 생성되는 것으로 나타났습니다.

╭─     /tmp                                                         21:12:45
╰─❯ cat tmp.cpp                                  
#include<bits/stdc++.h>
int main(){std::cout<<114514;}

╭─     /tmp                                                         21:12:48
╰─❯ strace g++ -pipe tmp.cpp -o tmp 2>&1 | grep "/tmp"
getcwd("/tmp", 1024)                    = 5
readlink("/tmp/tmp.cpp", 0x7ffc1ec38d50, 1023) = -1 EINVAL (无效的参数)
getcwd("/tmp", 1024)                    = 5
readlink("/tmp/tmp", 0x7ffc1ec38d50, 1023) = -1 EINVAL (无效的参数)
access("/tmp", R_OK|W_OK|X_OK)          = 0
newfstatat(AT_FDCWD, "/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=20504576, ...}, 0) = 0
openat(AT_FDCWD, "/tmp/ccolfqPz.o", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
openat(AT_FDCWD, "/tmp/cckzgSEX.res", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
newfstatat(AT_FDCWD, "/tmp/cckzgSEX.res", {st_mode=S_IFREG|0600, st_size=0, ...}, 0) = 0
unlink("/tmp/cckzgSEX.res")             = 0
newfstatat(AT_FDCWD, "/tmp/ccolfqPz.o", {st_mode=S_IFREG|0600, st_size=2064, ...}, 0) = 0
unlink("/tmp/ccolfqPz.o")               = 0

내 마운트는/proc/mounts

/dev/vda1 /etc/passwd ext4 ro,nosuid,relatime,errors=remount-ro 0 0
/dev/vda1 /etc/terminfo ext4 ro,nosuid,relatime,errors=remount-ro 0 0
/dev/vda1 /usr/lib/locale/locale-archive ext4 ro,nosuid,relatime,errors=remount-ro 0 0
proc /proc proc ro,nosuid,relatime 0 0
udev /dev devtmpfs ro,nosuid,relatime,size=11892204k,nr_inodes=2973051,mode=755 0 0
/dev/vda1 /nix ext4 ro,nosuid,relatime,errors=remount-ro 0 0
/dev/vda1 /tmp/exec_ir9g3uq9 ext4 ro,nosuid,relatime,errors=remount-ro 0 0
none /proc proc rw,nosuid,noexec,relatime,hidepid=invisible 0 0
none /proc/sys tmpfs ro,nosuid,relatime,size=0k 0 0

답변1

물론 TMPDIR호출 gcc(또는 g++다른 GCC 컴파일러)하기 전에 환경 변수를 설정하십시오. 설치 경로로 설정하십시오 tmpfs. 귀하 /tmp의 또는 /run/run/user/$(id -u)/이미 그러한 tmpfs 마운트가 있을 수 있습니다 ! ( mount예를 들어 이 클래스의 출력을 확인하십시오 mount | grep tmpfs.)

그러한 마운트를 생성해야 하는 경우,

sudo mount -t tmpfs -o size=10M tmpfs /path/to/empty/directory

관련 정보