Hi, this patch allows that relocated const data is placed into .rdata. To provide old behavior for older runtimes not supporting pseudo-relocation operating on read-only sections, the option -fwritable-relocated-rdata can be used.
ChangeLog 2012-03-03 Kai Tietz <kti...@redhat.com> * doc/invoke.texi (fwritable-relocated-rdata): Document new Cygwin/MinGW target option. * config/i386/winnt.c (i386_pe_unique_section): Ignore reloc if flag -fwritable-relocated-rdata is not set. (i386_pe_section_type_flags): Likewise. * config/i386/cygming.opt (fwritable-relocated-rdata): Add new flag variable flag_writable_rel_rdata. Tested for i686-w64-mingw32, x86_64-w64-mingw32, and i686-pc-cygwin. Ok for apply? Regards, Kai Index: doc/invoke.texi =================================================================== --- doc/invoke.texi (revision 184760) +++ doc/invoke.texi (working copy) @@ -13826,6 +13826,13 @@ Windows, as there the user32 API, which is used to set executable privileges, isn't available. +@item -fwritable-relocated-rdata +@opindex fno-writable-relocated-rdata +This option is available for MinGW and Cygwin targets. It specifies +that relocated-data in read-only section is put into .data +section. This is a necessary for older runtimes not supporting +modification of .rdata sections for pseudo-relocation. + @item -mpe-aligned-commons @opindex mpe-aligned-commons This option is available for Cygwin and MinGW targets. It Index: config/i386/winnt.c =================================================================== --- config/i386/winnt.c (revision 184760) +++ config/i386/winnt.c (working copy) @@ -395,6 +395,10 @@ const char *name, *prefix; char *string; + /* Ignore RELOC, if we are allowed to put relocated + const data into read-only section. */ + if (!flag_writable_rel_rdata) + reloc = 0; name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); name = i386_pe_strip_name_encoding_full (name); @@ -441,6 +445,10 @@ unsigned int flags; unsigned int **slot; + /* Ignore RELOC, if we are allowed to put relocated + const data into read-only section. */ + if (!flag_writable_rel_rdata) + reloc = 0; /* The names we put in the hashtable will always be the unique versions given to us by the stringtable, so we can just use their addresses as the keys. */ Index: config/i386/cygming.opt =================================================================== --- config/i386/cygming.opt (revision 184760) +++ config/i386/cygming.opt (working copy) @@ -53,4 +53,8 @@ posix Driver +fwritable-relocated-rdata +Common Report Var(flag_writable_rel_rdata) Init(0) +Put relocated read-only data into .data section. + ; Retain blank line above