diff options
-rw-r--r-- | bfd/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 4 | ||||
-rw-r--r-- | bfd/coffcode.h | 29 | ||||
-rw-r--r-- | bfd/section.c | 4 |
4 files changed, 32 insertions, 15 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 945504c..dc5454b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2009-03-19 Kai Tietz <kai.tietz@onevision.com> + + * bfd-in2.h: Regenerated. + * coffcode.h (sec_to_styp_flags): For pe-coff add SEC_READONLY + for debugging sections and map memory read/write dependent on + SEC_COFF_NOREAD. + (styp_to_sec_flags): Set SEC_COFF_NOREAD for sections + without memory read flags set. + * section.c: Add SEC_COFF_NOREAD to section flags. + 2009-03-19 Andreas Schwab <schwab@linux-m68k.org> * elf32-hppa.c (final_link_relocate): Cast bfd_vma values to long diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index a173f56..78a5bd9 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1304,6 +1304,10 @@ typedef struct bfd_section TMS320C54X only. */ #define SEC_TIC54X_CLINK 0x20000000 + /* Indicate that section has the no read flag set. This happens + when memory read flag isn't set. */ +#define SEC_COFF_NOREAD 0x40000000 + /* End of section flags. */ /* Some internal packed boolean fields. */ diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 44ac080..484fb6b 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -637,7 +637,7 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags) /* FIXME: There is no gas syntax to specify the debug section flag. */ if (CONST_STRNEQ (sec_name, DOT_DEBUG) || CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)) - sec_flags = SEC_DEBUGGING; + sec_flags = SEC_DEBUGGING | SEC_READONLY; /* skip LOAD */ /* READONLY later */ @@ -666,19 +666,14 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags) /* skip LINK_DUPLICATES */ /* skip LINKER_CREATED */ - if (sec_flags & (SEC_ALLOC | SEC_LOAD)) - { - /* For now, the read/write bits are mapped onto SEC_READONLY, even - though the semantics don't quite match. The bits from the input - are retained in pei_section_data(abfd, section)->pe_flags. */ - styp_flags |= IMAGE_SCN_MEM_READ; /* Always readable. */ - if ((sec_flags & SEC_READONLY) == 0) - styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write. */ - if (sec_flags & SEC_CODE) - styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE. */ - if (sec_flags & SEC_COFF_SHARED) - styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful. */ - } + if ((sec_flags & SEC_COFF_NOREAD) == 0) + styp_flags |= IMAGE_SCN_MEM_READ; /* Invert NOREAD for read. */ + if ((sec_flags & SEC_READONLY) == 0) + styp_flags |= IMAGE_SCN_MEM_WRITE; /* Invert READONLY for write. */ + if (sec_flags & SEC_CODE) + styp_flags |= IMAGE_SCN_MEM_EXECUTE; /* CODE->EXECUTE. */ + if (sec_flags & SEC_COFF_SHARED) + styp_flags |= IMAGE_SCN_MEM_SHARED; /* Shared remains meaningful. */ return styp_flags; } @@ -1117,6 +1112,10 @@ styp_to_sec_flags (bfd *abfd, /* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */ sec_flags = SEC_READONLY; + /* If section disallows read, then set the NOREAD flag. */ + if ((styp_flags & IMAGE_SCN_MEM_READ) == 0) + sec_flags |= SEC_COFF_NOREAD; + /* Process each flag bit in styp_flags in turn. */ while (styp_flags) { @@ -1149,7 +1148,7 @@ styp_to_sec_flags (bfd *abfd, break; #endif case IMAGE_SCN_MEM_READ: - /* Ignored, assume it always to be true. */ + sec_flags &= ~SEC_COFF_NOREAD; break; case IMAGE_SCN_TYPE_NO_PAD: /* Skip. */ diff --git a/bfd/section.c b/bfd/section.c index d804dd6..5a335a6 100644 --- a/bfd/section.c +++ b/bfd/section.c @@ -343,6 +343,10 @@ CODE_FRAGMENT . TMS320C54X only. *} .#define SEC_TIC54X_CLINK 0x20000000 . +. {* Indicate that section has the no read flag set. This happens +. when memory read flag isn't set. *} +.#define SEC_COFF_NOREAD 0x40000000 +. . {* End of section flags. *} . . {* Some internal packed boolean fields. *} |