2010-09-22 Kai Tietz <kai.tietz@onevision.com>

* coffcode.h (sec_to_styp_flags): Adjust debug
        sections to be conform to pe-coff specification
        and avoid marking them as excluded.
        (styp_to_sec_flags): Doing reverse mapping.
This commit is contained in:
Kai Tietz 2010-09-22 14:19:35 +00:00
parent fccd1d1e5f
commit 72e4db75e8
2 changed files with 36 additions and 14 deletions

View file

@ -1,5 +1,10 @@
2010-09-22 Kai Tietz <kai.tietz@onevision.com>
* coffcode.h (sec_to_styp_flags): Adjust debug
sections to be conform to pe-coff specification
and avoid marking them as excluded.
(styp_to_sec_flags): Doing reverse mapping.
* peXXigen.c (_bfd_XXi_final_link_postscript):
Add handling for setting IAT directory entry.

View file

@ -636,6 +636,14 @@ static long
sec_to_styp_flags (const char *sec_name, flagword sec_flags)
{
long styp_flags = 0;
bfd_boolean is_dbg = FALSE;
if (CONST_STRNEQ (sec_name, DOT_DEBUG)
#ifdef COFF_LONG_SECTION_NAMES
|| CONST_STRNEQ (sec_name, GNU_LINKONCE_WI)
#endif
|| CONST_STRNEQ (sec_name, ".stab"))
is_dbg = TRUE;
/* caution: there are at least three groups of symbols that have
very similar bits and meanings: IMAGE_SCN*, SEC_*, and STYP_*.
@ -646,16 +654,15 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
but there are more IMAGE_SCN_* 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_READONLY;
if (is_dbg)
sec_flags = SEC_DEBUGGING | SEC_READONLY;
/* skip LOAD */
/* READONLY later */
/* skip RELOC */
if ((sec_flags & SEC_CODE) != 0)
styp_flags |= IMAGE_SCN_CNT_CODE;
if ((sec_flags & SEC_DATA) != 0)
if ((sec_flags & (SEC_DATA | SEC_DEBUGGING)) != 0)
styp_flags |= IMAGE_SCN_CNT_INITIALIZED_DATA;
if ((sec_flags & SEC_ALLOC) != 0 && (sec_flags & SEC_LOAD) == 0)
styp_flags |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; /* ==STYP_BSS */
@ -666,9 +673,9 @@ sec_to_styp_flags (const char *sec_name, flagword sec_flags)
styp_flags |= IMAGE_SCN_LNK_COMDAT;
if ((sec_flags & SEC_DEBUGGING) != 0)
styp_flags |= IMAGE_SCN_MEM_DISCARDABLE;
if ((sec_flags & SEC_EXCLUDE) != 0)
if ((sec_flags & SEC_EXCLUDE) != 0 && !is_dbg)
styp_flags |= IMAGE_SCN_LNK_REMOVE;
if ((sec_flags & SEC_NEVER_LOAD) != 0)
if ((sec_flags & SEC_NEVER_LOAD) != 0 && !is_dbg)
styp_flags |= IMAGE_SCN_LNK_REMOVE;
/* skip IN_MEMORY */
/* skip SORT */
@ -1120,7 +1127,14 @@ styp_to_sec_flags (bfd *abfd,
long styp_flags = internal_s->s_flags;
flagword sec_flags;
bfd_boolean result = TRUE;
bfd_boolean is_dbg = FALSE;
if (CONST_STRNEQ (name, DOT_DEBUG)
#ifdef COFF_LONG_SECTION_NAMES
|| CONST_STRNEQ (name, GNU_LINKONCE_WI)
#endif
|| CONST_STRNEQ (name, ".stab"))
is_dbg = TRUE;
/* Assume read only unless IMAGE_SCN_MEM_WRITE is specified. */
sec_flags = SEC_READONLY;
@ -1190,27 +1204,30 @@ styp_to_sec_flags (bfd *abfd,
mean that a given section contains debug information. Thus
we only set the SEC_DEBUGGING flag on sections that we
recognise as containing debug information. */
if (CONST_STRNEQ (name, DOT_DEBUG)
if (is_dbg
#ifdef _COMMENT
|| strcmp (name, _COMMENT) == 0
#endif
#ifdef COFF_LONG_SECTION_NAMES
|| CONST_STRNEQ (name, GNU_LINKONCE_WI)
#endif
|| CONST_STRNEQ (name, ".stab"))
sec_flags |= SEC_DEBUGGING;
)
{
sec_flags |= SEC_DEBUGGING | SEC_READONLY;
}
break;
case IMAGE_SCN_MEM_SHARED:
sec_flags |= SEC_COFF_SHARED;
break;
case IMAGE_SCN_LNK_REMOVE:
sec_flags |= SEC_EXCLUDE;
if (!is_dbg)
sec_flags |= SEC_EXCLUDE;
break;
case IMAGE_SCN_CNT_CODE:
sec_flags |= SEC_CODE | SEC_ALLOC | SEC_LOAD;
break;
case IMAGE_SCN_CNT_INITIALIZED_DATA:
sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
if (is_dbg)
sec_flags |= SEC_DEBUGGING;
else
sec_flags |= SEC_DATA | SEC_ALLOC | SEC_LOAD;
break;
case IMAGE_SCN_CNT_UNINITIALIZED_DATA:
sec_flags |= SEC_ALLOC;