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 | |
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.
-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; } } |