aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2005-11-07 17:57:00 +0000
committerNick Clifton <nickc@redhat.com>2005-11-07 17:57:00 +0000
commit422fee64f86af9ed48e1904610302f4218299b0f (patch)
treed50332f28bbb9b1d415a09279896bd3d837c2374 /gas
parent718c0ded1f2626b3e7e8e210cb93e2714a91b548 (diff)
downloadfsf-binutils-gdb-422fee64f86af9ed48e1904610302f4218299b0f.zip
fsf-binutils-gdb-422fee64f86af9ed48e1904610302f4218299b0f.tar.gz
fsf-binutils-gdb-422fee64f86af9ed48e1904610302f4218299b0f.tar.bz2
PR binutils/1568
* config/obj-coff.c (obj_coff_section): Set readonly flag with the 'x' attribute. Remember the actions of the 'w' and 'n' attributes and do not allow the 'x','s' or 'd' attributes to change them.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/obj-coff.c79
2 files changed, 68 insertions, 18 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index b7ec09a..e1d2fe7 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2005-11-07 Nick Clifton <nickc@redhat.com>
+
+ PR binutils/1568
+ * config/obj-coff.c (obj_coff_section): Set readonly flag with the
+ 'x' attribute. Remember the actions of the 'w' and 'n' attributes
+ and do not allow the 'x','s' or 'd' attributes to change them.
+
2005-11-07 John Levon <levon@movementarian.org>
* config/tc-i386.h (tc_comment_chars): Define.
diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c
index ce4d6f5..a5a76ff 100644
--- a/gas/config/obj-coff.c
+++ b/gas/config/obj-coff.c
@@ -1522,38 +1522,81 @@ obj_coff_section (int ignore ATTRIBUTE_UNUSED)
exp = get_absolute_expression ();
else
{
- ++input_line_pointer;
- while (*input_line_pointer != '"'
- && ! is_end_of_line[(unsigned char) *input_line_pointer])
+ unsigned char attr;
+ int readonly_removed = 0;
+ int load_removed = 0;
+
+ while (attr = *++input_line_pointer,
+ attr != '"'
+ && ! is_end_of_line[attr])
{
- switch (*input_line_pointer)
+ switch (attr)
{
- case 'b': flags |= SEC_ALLOC; flags &=~ SEC_LOAD; break;
- case 'n': flags &=~ SEC_LOAD; flags |= SEC_NEVER_LOAD; break;
+ case 'b':
+ /* Uninitialised data section. */
+ flags |= SEC_ALLOC;
+ flags &=~ SEC_LOAD;
+ break;
+
+ case 'n':
+ /* Section not loaded. */
+ flags &=~ SEC_LOAD;
+ flags |= SEC_NEVER_LOAD;
+ load_removed = 1;
+ break;
+
+ case 's':
+ /* Shared section. */
+ flags |= SEC_COFF_SHARED;
+ /* Fall through. */
+ case 'd':
+ /* Data section. */
+ flags |= SEC_DATA;
+ if (! load_removed)
+ flags |= SEC_LOAD;
+ flags &=~ SEC_READONLY;
+ break;
- case 's': flags |= SEC_COFF_SHARED; /* Fall through. */
- case 'd': flags |= SEC_DATA | SEC_LOAD; /* Fall through. */
- case 'w': flags &=~ SEC_READONLY; break;
+ case 'w':
+ /* Writable section. */
+ flags &=~ SEC_READONLY;
+ readonly_removed = 1;
+ break;
- case 'a': break; /* For compatibility with ELF. */
- case 'x': flags |= SEC_CODE | SEC_LOAD; break;
- case 'r': flags |= SEC_DATA | SEC_LOAD | SEC_READONLY; break;
+ case 'a':
+ /* Ignore. Here for compatibility with ELF. */
+ break;
+
+ case 'r': /* Read-only section. Implies a data section. */
+ readonly_removed = 0;
+ /* Fall through. */
+ case 'x': /* Executable section. */
+ /* If we are setting the 'x' attribute or if the 'r'
+ attribute is being used to restore the readonly status
+ of a code section (eg "wxr") then set the SEC_CODE flag,
+ otherwise set the SEC_DATA flag. */
+ flags |= (attr == 'x' || (flags & SEC_CODE) ? SEC_CODE : SEC_DATA);
+ if (! load_removed)
+ flags |= SEC_LOAD;
+ /* Note - the READONLY flag is set here, even for the 'x'
+ attrbiute in order to be compatible with the MSVC
+ linker. */
+ if (! readonly_removed)
+ flags |= SEC_READONLY;
+ break;
case 'i': /* STYP_INFO */
case 'l': /* STYP_LIB */
case 'o': /* STYP_OVER */
- as_warn (_("unsupported section attribute '%c'"),
- *input_line_pointer);
+ as_warn (_("unsupported section attribute '%c'"), attr);
break;
default:
- as_warn (_("unknown section attribute '%c'"),
- *input_line_pointer);
+ as_warn (_("unknown section attribute '%c'"), attr);
break;
}
- ++input_line_pointer;
}
- if (*input_line_pointer == '"')
+ if (attr == '"')
++input_line_pointer;
}
}