Шапка скрипта для gcc

yroslavasako

Хочу писать скрипты для gcc. Скрипт - это си программа с мейном. Она собирается во временный файл (если можно - просто в память) и запускается скриптом.
У кого-нибудь есть готовый шаблон?

marat7256

gcc file.c
./a.out
rm a.out

okis

Почему для gcc?
Можно так:
 
#!/usr/local/bin/tcc -run
#include <stdio.h>

int main
{
printf("Hello World\n");
return 0;
}

yroslavasako


#!/bin/sh
tail -n +5 $0 | gcc -o /dev/stdout -xc -| /lib/ld-linux-x86-64.so.2 /dev/stdin $@
exit $?
!#

#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello world\n");
return 0;
}

Как-то так, но оно не работает.

/dev/stdin: error while loading shared libraries: /dev/stdin: file too short

И я не могу понять почему? Вроде линукс следует концепции "всё есть файл", и непонятно почему его собственный лоадер не умеет загружать бинари из пайпа

yroslavasako

нету у меня tcc. И на большинстве компов, для которого пишется скрипт, тоже нет

okis

http://stackoverflow.com/questions/13690454/how-to-compile-a...
пишут, что не получится просто так через ld-linux, нужен костыль

okis

а почему, кстати, нельзя бинарник в tmp сохранить?

yroslavasako

а почему, кстати, нельзя бинарник в tmp сохранить?
можно, почему нет.

#!/bin/sh
OUT=$(mktemp)
tail -n +10 $0 | gcc -o /dev/stdout -xc -| cat > $OUT
chmod +x $OUT
$OUT $0 $@
RESULT=$?
rm $OUT
exit $RESULT
!#

Вот так работает (я в курсе, что cat лишний, просто проверял, что gcc при выводе в stdout не обрезает файл)
Но это же гораздо менее красиво. И зачем вообще придумали /dev/stdin и /dev/fd/0 как не для использования?

margadon

стопудово тут вдруг окажется нужным какое-нибудь порево с #include </dev/stdin>
а-ля

$ cat a.cpp
#include <stdio.h>
#include </dev/stdin>

int main {
printf("%s\n", str);
return 0;
}

$ echo "char str[] = \"~~~\";" | g++ a.cpp -o a | ./a
~~~
Оставить комментарий
Имя или ник:
Комментарий: