* output.cc (Output_file::open): Add execute permission to empty file.
authorCary Coutant <ccoutant@google.com>
Tue, 8 Sep 2009 22:32:51 +0000 (22:32 +0000)
committerCary Coutant <ccoutant@google.com>
Tue, 8 Sep 2009 22:32:51 +0000 (22:32 +0000)
* testsuite/Makefile.am (permission_test): New test.
* testsuite/Makefile.in: Regenerate.

gold/ChangeLog
gold/output.cc
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in

index b5174490a4a230c20f6f8605388bc48b92c63150..b486aea3bc4bca577e92a1733019df3e26a52318 100644 (file)
@@ -1,3 +1,9 @@
+2009-09-08  Cary Coutant  <ccoutant@google.com>
+
+       * output.cc (Output_file::open): Add execute permission to empty file.
+       * testsuite/Makefile.am (permission_test): New test.
+       * testsuite/Makefile.in: Regenerate.
+
 2009-09-02  Ian Lance Taylor  <iant@google.com>
 
        * output.cc (Output_file::resize): Call map_no_anonymous rather
index fd47407052c34fb0f4100019cb52bdf5ea918e40..e99464b2658843c7f42a7e5ce7f10e2013d23008 100644 (file)
@@ -30,7 +30,7 @@
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <algorithm>
-#include "libiberty.h"   // for unlink_if_ordinary()
+#include "libiberty.h"
 
 #include "parameters.h"
 #include "object.h"
@@ -3461,8 +3461,22 @@ Output_file::open(off_t file_size)
       else
        {
          struct stat s;
-         if (::stat(this->name_, &s) == 0 && s.st_size != 0)
-           unlink_if_ordinary(this->name_);
+         if (::stat(this->name_, &s) == 0
+             && (S_ISREG (s.st_mode) || S_ISLNK (s.st_mode)))
+           {
+             if (s.st_size != 0)
+               ::unlink(this->name_);
+             else if (!parameters->options().relocatable())
+               {
+                 // If we don't unlink the existing file, add execute
+                 // permission where read permissions already exist
+                 // and where the umask permits.
+                 int mask = ::umask(0);
+                 ::umask(mask);
+                 s.st_mode |= (s.st_mode & 0444) >> 2;
+                 ::chmod(this->name_, s.st_mode & ~mask);
+               }
+           }
 
          int mode = parameters->options().relocatable() ? 0666 : 0777;
          int o = open_descriptor(-1, this->name_, O_RDWR | O_CREAT | O_TRUNC,
index 1d6d06b24495628f5b999bdf9d9f337673028d35..b7ea225379e0c7c9999a158505d89965ae94cc8b 100644 (file)
@@ -1139,5 +1139,15 @@ hidden_test: hidden_test_main.o libhidden.so gcctestdir/ld
 hidden_test.err: hidden_test
        @touch hidden_test.err
 
+# Test that if the output file already exists and is empty,
+# it will get execute permission.
+check_PROGRAMS += permission_test
+permission_test: basic_test.o gcctestdir/ld
+       umask 022; \
+       rm -f $@; \
+       touch $@; \
+       chmod 600 $@; \
+       $(CXXLINK) -Bgcctestdir/ basic_test.o
+
 endif GCC
 endif NATIVE_LINKER
index 461ee73a2c6688c96821b79836515bdcd198184e..b40ba310f684efd13a21fef2c7c24be223c79a71 100644 (file)
@@ -46,7 +46,8 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \
        $(am__EXEEXT_7) $(am__EXEEXT_8) $(am__EXEEXT_9) \
        $(am__EXEEXT_10) $(am__EXEEXT_11) $(am__EXEEXT_12) \
        $(am__EXEEXT_13) $(am__EXEEXT_14) $(am__EXEEXT_15) \
-       $(am__EXEEXT_16) $(am__EXEEXT_17) $(am__EXEEXT_18)
+       $(am__EXEEXT_16) $(am__EXEEXT_17) $(am__EXEEXT_18) \
+       $(am__EXEEXT_19)
 
 # Test --detect-odr-violations
 
@@ -353,6 +354,10 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \
 @NATIVE_LINKER_FALSE@  $(am__DEPENDENCIES_1) \
 @NATIVE_LINKER_FALSE@  $(am__DEPENDENCIES_1) \
 @NATIVE_LINKER_FALSE@  $(am__DEPENDENCIES_1)
+
+# Test that if the output file already exists and is empty,
+# it will get execute permission.
+@GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_29 = permission_test
 subdir = testsuite
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -462,6 +467,8 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS)
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ local_labels_test$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_test$(EXEEXT)
 @GCC_TRUE@@MCMODEL_MEDIUM_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_18 = large$(EXEEXT)
+@GCC_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_19 =  \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ permission_test$(EXEEXT)
 basic_pic_test_SOURCES = basic_pic_test.c
 basic_pic_test_OBJECTS = basic_pic_test.$(OBJEXT)
 basic_pic_test_LDADD = $(LDADD)
@@ -678,6 +685,12 @@ object_unittest_LDADD = $(LDADD)
 object_unittest_DEPENDENCIES = libgoldtest.a ../libgold.a \
        ../../libiberty/libiberty.a $(am__DEPENDENCIES_1) \
        $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+permission_test_SOURCES = permission_test.c
+permission_test_OBJECTS = permission_test.$(OBJEXT)
+permission_test_LDADD = $(LDADD)
+permission_test_DEPENDENCIES = libgoldtest.a ../libgold.a \
+       ../../libiberty/libiberty.a $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 plugin_test_1_SOURCES = plugin_test_1.c
 plugin_test_1_OBJECTS = plugin_test_1.$(OBJEXT)
 plugin_test_1_LDADD = $(LDADD)
@@ -1099,13 +1112,13 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c \
        $(initpri1_SOURCES) $(justsyms_SOURCES) $(large_SOURCES) \
        local_labels_test.c many_sections_r_test.c \
        $(many_sections_test_SOURCES) $(object_unittest_SOURCES) \
-       plugin_test_1.c plugin_test_2.c plugin_test_3.c \
-       plugin_test_4.c $(protected_1_SOURCES) $(protected_2_SOURCES) \
-       $(relro_script_test_SOURCES) $(relro_test_SOURCES) \
-       $(script_test_1_SOURCES) $(script_test_2_SOURCES) \
-       script_test_3.c $(thin_archive_test_1_SOURCES) \
-       $(thin_archive_test_2_SOURCES) $(tls_pic_test_SOURCES) \
-       $(tls_shared_gd_to_ie_test_SOURCES) \
+       permission_test.c plugin_test_1.c plugin_test_2.c \
+       plugin_test_3.c plugin_test_4.c $(protected_1_SOURCES) \
+       $(protected_2_SOURCES) $(relro_script_test_SOURCES) \
+       $(relro_test_SOURCES) $(script_test_1_SOURCES) \
+       $(script_test_2_SOURCES) script_test_3.c \
+       $(thin_archive_test_1_SOURCES) $(thin_archive_test_2_SOURCES) \
+       $(tls_pic_test_SOURCES) $(tls_shared_gd_to_ie_test_SOURCES) \
        $(tls_shared_gnu2_gd_to_ie_test_SOURCES) \
        $(tls_shared_gnu2_test_SOURCES) $(tls_shared_ie_test_SOURCES) \
        $(tls_shared_nonpic_test_SOURCES) $(tls_shared_test_SOURCES) \
@@ -1155,8 +1168,8 @@ DIST_SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c \
        $(am__initpri1_SOURCES_DIST) $(am__justsyms_SOURCES_DIST) \
        $(am__large_SOURCES_DIST) local_labels_test.c \
        many_sections_r_test.c $(am__many_sections_test_SOURCES_DIST) \
-       $(object_unittest_SOURCES) plugin_test_1.c plugin_test_2.c \
-       plugin_test_3.c plugin_test_4.c \
+       $(object_unittest_SOURCES) permission_test.c plugin_test_1.c \
+       plugin_test_2.c plugin_test_3.c plugin_test_4.c \
        $(am__protected_1_SOURCES_DIST) \
        $(am__protected_2_SOURCES_DIST) \
        $(am__relro_script_test_SOURCES_DIST) \
@@ -1880,6 +1893,12 @@ many_sections_test$(EXEEXT): $(many_sections_test_OBJECTS) $(many_sections_test_
 object_unittest$(EXEEXT): $(object_unittest_OBJECTS) $(object_unittest_DEPENDENCIES) 
        @rm -f object_unittest$(EXEEXT)
        $(CXXLINK) $(object_unittest_OBJECTS) $(object_unittest_LDADD) $(LIBS)
+@GCC_FALSE@permission_test$(EXEEXT): $(permission_test_OBJECTS) $(permission_test_DEPENDENCIES) 
+@GCC_FALSE@    @rm -f permission_test$(EXEEXT)
+@GCC_FALSE@    $(LINK) $(permission_test_OBJECTS) $(permission_test_LDADD) $(LIBS)
+@NATIVE_LINKER_FALSE@permission_test$(EXEEXT): $(permission_test_OBJECTS) $(permission_test_DEPENDENCIES) 
+@NATIVE_LINKER_FALSE@  @rm -f permission_test$(EXEEXT)
+@NATIVE_LINKER_FALSE@  $(LINK) $(permission_test_OBJECTS) $(permission_test_LDADD) $(LIBS)
 @GCC_FALSE@plugin_test_1$(EXEEXT): $(plugin_test_1_OBJECTS) $(plugin_test_1_DEPENDENCIES) 
 @GCC_FALSE@    @rm -f plugin_test_1$(EXEEXT)
 @GCC_FALSE@    $(LINK) $(plugin_test_1_OBJECTS) $(plugin_test_1_LDADD) $(LIBS)
@@ -2106,6 +2125,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/many_sections_r_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/many_sections_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/object_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permission_test.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugin_test_3.Po@am__quote@
@@ -2922,6 +2942,12 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(LINK) -Bgcctestdir/ -Wl,-R,. hidden_test_main.o libhidden.so 2>hidden_test.err
 @GCC_TRUE@@NATIVE_LINKER_TRUE@hidden_test.err: hidden_test
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ @touch hidden_test.err
+@GCC_TRUE@@NATIVE_LINKER_TRUE@permission_test: basic_test.o gcctestdir/ld
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ umask 022; \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ rm -f $@; \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ touch $@; \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ chmod 600 $@; \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ basic_test.o
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.