Existe uma maneira de executar um binário nativo de um pipe?

10
echo 'main(){}' | gcc -xc - -o /dev/stdout | ???

Existe uma maneira de executar o binário de saída em um sistema semelhante a um unix?

EDIT: Eu precisava executar a saída do g ++ em um ambiente de área restrita onde não posso escrever nenhum arquivo (nada malicioso, prometo).

    
por Alex B 07.10.2011 / 15:03

4 respostas

6

Eu não acredito que isso seja possível. A chamada de sistema exec (2) sempre requer um nome de arquivo ou caminho absoluto (o nome do arquivo é sempre um %código%). char* também tem requisitos semelhantes para um nome de arquivo.

O mais próximo que você pode fazer é canalizar a saída em um pipe nomeado e tentar executar a partir do pipe. Isso pode funcionar, embora o shell possa se recusar a executar qualquer arquivo que não tenha o posix_spawn bits definido. Crie o canal com --x--x--x e veja se você consegue fazê-lo funcionar.

Outra abordagem seria escrever algo que lê entrada padrão, grava um arquivo em uma área temporária, configura os bits -x nele, forks e execs, em seguida, exclui o arquivo. O inode e o conteúdo permanecerão até que o programa termine a execução, mas não será acessível através do sistema de arquivos. Quando o processo terminar, o inode será liberado e o armazenamento será retornado para a lista livre.

EDIT: Como Mat aponta, a primeira abordagem não funcionará como o carregador tentará demandar a página no executável, o que gerará tráfego de busca aleatório no arquivo, e isso não é possível em um tubo. Isso deixa algum tipo de abordagem como a segunda.

    
por 07.10.2011 / 15:34
2

Isso executará automaticamente a compilação do seu código, mas criará um arquivo (periodicamente) no sistema de arquivos para fazê-lo.

echo 'main(){}' | gcc -xc -o /tmp/a.out && chmod u+x /tmp/a.out && /tmp/a.out && rm -f /tmp/a.out

(No momento, estou testando isso agora, mas tenho certeza de que isso ou algo próximo a ele funcionará para você)

EDIT: Se o objetivo de sua tubulação é cortar discos físicos fora da equação de velocidade, considere a criação de um ram disk para manter o arquivo intermediário.

    
por 07.10.2011 / 16:33
2

Você pode tentar tcc , que irá compilar e executar um programa em uma única etapa, sem escrever nenhum arquivo intermediário. Não é o gcc, o que pode ser um problema para você, mas é espetacularmente rápido, então pode até ser melhor do que o gcc para seus propósitos.

    
por 11.05.2012 / 16:10
0

Assim como o @TheQUUX sugeriu, eu não testei o teste, mas você pode querer experimentar cling - "o interpretador C ++ interativo, construído sobre bibliotecas LLVM e Clang.".

Encontre mais informações aqui: link

    
por 18.04.2018 / 16:35