diff options
author | Nick Clifton <nickc@redhat.com> | 2005-11-07 17:57:00 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2005-11-07 17:57:00 +0000 |
commit | 422fee64f86af9ed48e1904610302f4218299b0f (patch) | |
tree | d50332f28bbb9b1d415a09279896bd3d837c2374 /gas | |
parent | 718c0ded1f2626b3e7e8e210cb93e2714a91b548 (diff) | |
download | gdb-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')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/obj-coff.c | 79 |
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; } } |