http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59512
Bug ID: 59512
Summary: Incomplete output files when compiler is killed
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: driver
Assignee: unassigned at gcc dot gnu.org
Reporter: robert-gcc at debian dot org
Hi
When cc1plus program is killed for example by OOM then the output file (given
by the `-o' option) can be incomplete, which will than result in linker error.
This is especially visible when the `-pipe' option is used.
I can see that clang always first create some temporary file, and then renames
it into the final one:
strace -efile -f clang++ a.cpp -pipe -c -o a.o
[pid 28990] stat64("a.o", {st_mode=S_IFREG|0644, st_size=716, ...}) = 0
[pid 28990] access("a.o", W_OK) = 0
[pid 28990] open("/dev/urandom", O_RDONLY) = 3
[pid 28990] open("a.o-8cc52ce9", O_RDWR|O_CREAT|O_EXCL, 0666) = 3
// skipped some output
[pid 28990] rename("a.o-8cc52ce9", "a.o") = 0
It would be nice if g++ could implement the same behaviour.
I tried to simulate it in makefiles by using something like `g++ -o [email protected] &&
mv [email protected] $@', and it worked pretty well, unless coverage flags
(`-fprofile-arcs -ftest-coverage') were also given, in which case the generated
gcno/gcda files refered to the `.o.tmp' files, which generally broke the
coverage calculations. For that reason I think that it would be best if g++
could handle this `write to temp && rename temp' approach internally.