From 5a40b568d023922e735ddc21f3b4a30d52197b7a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor <iant@golang.org> Date: Thu, 18 Sep 2014 17:27:26 -0700 Subject: [PATCH] lib9, cmd/ld: fixes for cross-linking on a Windows host This fixes a couple of problems that occur when the linker removes its temporary directory on Windows. The linker only creates and removes a temporary directory when doing external linking. Windows does not yet support external linking. Therefore, these problems are only seen when using a cross-compiler hosted on Windows. In lib9, FindFirstFileW returns just the file name, not the full path name. Don't assume that we will find a slash. Changed the code to work either way just in case. In ld, Windows requires that files be closed before they are removed, so close the output file before we might try to remove it. Fixes #8723. LGTM=alex.brainman R=golang-codereviews, alex.brainman CC=golang-codereviews https://golang.org/cl/141690043 --- src/cmd/ld/lib.c | 4 ++++ src/lib9/tempdir_windows.c | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index 651705a2e6..36f0f99de2 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -144,6 +144,10 @@ libinit(void) void errorexit(void) { + if(cout >= 0) { + // For rmtemp run at atexit time on Windows. + close(cout); + } if(nerrors) { if(cout >= 0) mayberemoveoutfile(); diff --git a/src/lib9/tempdir_windows.c b/src/lib9/tempdir_windows.c index 1a530059ae..4c3df7cf11 100644 --- a/src/lib9/tempdir_windows.c +++ b/src/lib9/tempdir_windows.c @@ -70,7 +70,7 @@ removeall(char *p) { WinRune *r, *r1; DWORD attr; - char *q, *elem; + char *q, *qt, *elem; HANDLE h; WIN32_FIND_DATAW data; @@ -91,15 +91,18 @@ removeall(char *p) do{ q = toutf(data.cFileName); elem = strrchr(q, '\\'); - if(elem != nil) { + if(elem != nil) elem++; - if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) { - free(q); - continue; - } + else + elem = q; + if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) { + free(q); + continue; } - removeall(q); - free(q); + qt = smprint("%s\\%s", p, q); + free(q); + removeall(qt); + free(qt); }while(FindNextFileW(h, &data)); FindClose(h); -- 2.30.9