Meu compilador personalizado para uma linguagem de brinquedo usa Cranelift para gerar código de objeto, que posso escrever em um arquivo main.o
. Para transformar esse arquivo de objeto em um arquivo executável, invoco o GCC com gcc -o main main.o
.
No entanto, gostaria de canalizar o código diretamente para o GCC para não ter um arquivo de objeto temporário gravado no disco, então faço meu compilador gravar o código de objeto na saída padrão. Usar -
como um nome de arquivo não funciona porque a -x
opção não parece ter nenhum valor para arquivos de objeto.
Usar algum tipo de redirecionamento de shell também não funciona: gcc -o main <(compiler)
erros com /usr/bin/ld: /proc/self/fd/11: file not recognized: Illegal seek
. (Observe que isso funciona quando o próprio GCC trabalha no arquivo, por exemplo, com gcc -xc <(echo "int main(){}") -o main
, mas não quando o arquivo é passado para LD. A -pipe
opção também não parece fazer diferença.)
Existe alguma maneira de usar o GCC para vincular o código do objeto canalizado para ele?
ld
precisa de um arquivo pesquisável para que você não possa usar um canal. A<(...)
substituição do processo shell Korn se expande para o caminho de um tubo.Você precisa de zsh e seu
=(...)
ou peixe e seu(...|psub -f)
para obter o caminho para um arquivo pesquisável regular (criado dentro$TMPPREFIX
ou$TMPDIR
sob o capô).Se
ld
precisar que o caminho do arquivo termine em.o
, inzsh
, setTMPSUFFIX=.o
.Em outros shells, você pode criar o arquivo temporário manualmente, pode até chamá
gcc
-lo e até mesmo redirecionarcompiler
a saída de para ele depois que ele já foi excluído. Em shells do tipo Korn/POSIX:Observe que
gcc
ele próprio cria muitos arquivos temporários para seu próprio processamento, portanto, é inútil tentar evitar a criação de um arquivo extra aqui.Você não pode canalizar um arquivo de objeto para seu compilador. Como mostra o erro, isso não pode funcionar porque o gcc tentou procurá-lo e essa não é uma operação que um pipe suporta. (Funciona no código-fonte apenas porque o gcc foi escrito com lexing/parsing específico, que realmente parece consumir a entrada sequencialmente.)
Portanto, um arquivo temporário anônimo deve servir!
resolveria seu problema:
Mas: é um recurso apenas do zsh, não do bash mais comum, então não sei se você deseja usá-lo ou apenas gravar em um arquivo de objeto portátil e vinculá-lo - como qualquer pessoa com um makefile, ou script ninja ou um gerador para isso serviria.
Observe também que, se o seu compilador usar um código intermediário como entrada, talvez você realmente queira alterá-lo para ser um back-end llvm? Dessa forma, você pode carregá-lo como plug-in no clang e apenas compilar o código-fonte para o arquivo de objeto diretamente, ou até mesmo executar uma combinação de vinculação e compilação de uma só vez.