This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
PATCH to gas:Fix handling of 'shared' data sections for PE targets
- From: Danny Smith <danny_r_smith_2001 at yahoo dot co dot nz>
- To: binutils <binutils at sources dot redhat dot com>
- Date: Sun, 27 Oct 2002 15:41:22 +1100 (EST)
- Subject: PATCH to gas:Fix handling of 'shared' data sections for PE targets
The shared variable attribute in gcc for PE targets is broken by the way gas
handles the 's' flag.
With the following example, adapted from gcc's extend.texi,
#include <stdio.h>
int foo __attribute__((section ("bar"), shared)) = 0;
main()
{
++foo;
printf("%d copies of shared.exe have been loaded", foo);
for (;;) {}
}
gcc -S produces:
.globl _foo
.section bar,"ws"
.align 4
So far okay.
However, gas produces the following section header for 'ws' flags
3 bar 00000004 00000000 00000000 000000e4 2**2
CONTENTS, SHARED
Although the code compiles into an executable, the image is not recognized as
valid by the OS.
Changing the 'ws' flag to 'w' produces valid object
3 bar 00000004 00000000 00000000 000000e4 2**2
CONTENTS, ALLOC, LOAD, DATA
because 'w' alone sets to TC_COFF_SECTION_DEFAULT_ATTRIBUTES, which is
(SEC_LOAD | SEC_DATA)
The following patch fixes, producing
3 bar 00000004 00000000 00000000 000000e4 2**2
CONTENTS, ALLOC, LOAD, DATA, SHARED
and an executable that does the right thing.
Danny
2002-10-27 Danny Smith <dannysmith@users.sourceforge.net>
* config/obj-coff.c (obj-coff-section): Set SEC_DATA and
SEC_LOAD flags for sections marked as 's'.
--- obj-coff.c.orig Sun Sep 29 04:24:01 2002
+++ obj-coff.c Sun Oct 27 04:00:50 2002
@@ -1465,12 +1465,12 @@ obj_coff_section (ignore)
{
case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break;
case 'n': flags &=~ SEC_LOAD; flags |= SEC_NEVER_LOAD; break;
+ case 's': flags |= SEC_SHARED; /* fall through */
case 'd': flags |= SEC_DATA | SEC_LOAD; /* fall through */
case 'w': flags &=~ SEC_READONLY; break;
case 'a': break; /* For compatability with ELF. */
case 'x': flags |= SEC_CODE | SEC_LOAD; break;
case 'r': flags |= SEC_READONLY; break;
- case 's': flags |= SEC_SHARED; break;
case 'i': /* STYP_INFO */
case 'l': /* STYP_LIB */
http://careers.yahoo.com.au - Yahoo! Careers
- 1,000's of jobs waiting online for you!