aboutsummaryrefslogtreecommitdiff
path: root/gas/config/obj-coff.c
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/config/obj-coff.c
parent718c0ded1f2626b3e7e8e210cb93e2714a91b548 (diff)
downloadgdb-422fee64f86af9ed48e1904610302f4218299b0f.zip
gdb-422fee64f86af9ed48e1904610302f4218299b0f.tar.gz
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/config/obj-coff.c')
-rw-r--r--gas/config/obj-coff.c79
1 files changed, 61 insertions, 18 deletions
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;
}
}