* libcoff-in.h (struct xcoff_tdata): Define.
authorIan Lance Taylor <ian@airs.com>
Mon, 9 Oct 1995 21:19:53 +0000 (21:19 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 9 Oct 1995 21:19:53 +0000 (21:19 +0000)
(xcoff_data): Define.
* bfd.c (struct _bfd): Add xcoff_obj_data field to tdata union.
* bfd-in2.h, libcoff.h: Rebuild.
* coff-rs6000.c (xcoff_mkobject): New static function.
(coff_mkobject): Define.
(xcoff_copy_private_bfd_data): New static function.
(coff_bfd_copy_private_bfd_data): Define.
(rs6000coff_howto_table): Change R_TOC complain_on_overflow from
signed to bitfield.
(rs6000coff_vec): Add DYNAMIC to object_flags.
* coffcode.h (sec_to_styp_flags): If RS6000COFF_C, handle .pad and
.loader sections specially.
(coff_new_section_hook): If RS6000COFF_C, get the .text and .data
section alignment from the XCOFF tdata information.
(coff_mkobject_hook): If RS6000COFF_C, set DYNAMIC based on
F_SHROBJ, and copy the extra a.out header information into the
XCOFF tdata structure.
(coff_write_object_contents): If RS6000COFF_C, set F_SHROBJ,
F_DYNLOAD and the extra a.out header information.
(coff_slurp_symbol_table): Set BSF_NOT_AT_END for a C_EXT or
C_HIDEXT symbol with attached csect information.
* coffswap.h (coff_swap_aouthdr_in): If RS6000COFF_C, swap
in the o_maxdata field.
(coff_swap_aouthdr_out): If RS6000COFF_C, swap extra XCOFF fields.
* coffgen.c (coff_renumber_symbols): Don't move any symbol to the
end if BSF_NOT_AT_END is set.

bfd/ChangeLog
bfd/coffcode.h
bfd/coffgen.c
bfd/coffswap.h
bfd/libcoff-in.h
bfd/libcoff.h

index b6de77e..6bda4ae 100644 (file)
@@ -1,7 +1,32 @@
 Mon Oct  9 11:24:08 1995  Ian Lance Taylor  <ian@cygnus.com>
 
-       * coffcode.h (coff_slurp_symbol_table): Set BSF_NOT_AT_END for an
-       XCOFF XTY_LD symbol.
+       * libcoff-in.h (struct xcoff_tdata): Define.
+       (xcoff_data): Define.
+       * bfd.c (struct _bfd): Add xcoff_obj_data field to tdata union.
+       * bfd-in2.h, libcoff.h: Rebuild.
+       * coff-rs6000.c (xcoff_mkobject): New static function.
+       (coff_mkobject): Define.
+       (xcoff_copy_private_bfd_data): New static function.
+       (coff_bfd_copy_private_bfd_data): Define.
+       (rs6000coff_howto_table): Change R_TOC complain_on_overflow from
+       signed to bitfield.
+       (rs6000coff_vec): Add DYNAMIC to object_flags.
+       * coffcode.h (sec_to_styp_flags): If RS6000COFF_C, handle .pad and
+       .loader sections specially.
+       (coff_new_section_hook): If RS6000COFF_C, get the .text and .data
+       section alignment from the XCOFF tdata information.
+       (coff_mkobject_hook): If RS6000COFF_C, set DYNAMIC based on
+       F_SHROBJ, and copy the extra a.out header information into the
+       XCOFF tdata structure.
+       (coff_write_object_contents): If RS6000COFF_C, set F_SHROBJ,
+       F_DYNLOAD and the extra a.out header information.
+       (coff_slurp_symbol_table): Set BSF_NOT_AT_END for a C_EXT or
+       C_HIDEXT symbol with attached csect information.
+       * coffswap.h (coff_swap_aouthdr_in): If RS6000COFF_C, swap
+       in the o_maxdata field.
+       (coff_swap_aouthdr_out): If RS6000COFF_C, swap extra XCOFF fields.
+       * coffgen.c (coff_renumber_symbols): Don't move any symbol to the
+       end if BSF_NOT_AT_END is set.
 
        * targets.c (bfd_target): Rename _bfd_read_ar_hdr field to
        _bfd_read_ar_hdr_fn.
index eabbc4c..85665c6 100644 (file)
@@ -368,6 +368,16 @@ sec_to_styp_flags (sec_name, sec_flags)
       styp_flags = STYP_DATA;
     }
 #endif
+#ifdef RS6000COFF_C
+  else if (!strcmp (sec_name, _PAD))
+    {
+      styp_flags = STYP_PAD;
+    }
+  else if (!strcmp (sec_name, _LOADER))
+    {
+      styp_flags = STYP_LOADER;
+    }
+#endif
   /* Try and figure out what it should be */
   else if (sec_flags & SEC_CODE)
     {
@@ -858,6 +868,15 @@ coff_new_section_hook (abfd, section)
 {
   section->alignment_power = COFF_DEFAULT_SECTION_ALIGNMENT_POWER;
 
+#ifdef RS6000COFF_C
+  if (xcoff_data (abfd)->text_align_power != 0
+      && strcmp (bfd_get_section_name (abfd, section), ".text") == 0)
+    section->alignment_power = xcoff_data (abfd)->text_align_power;
+  if (xcoff_data (abfd)->data_align_power != 0
+      && strcmp (bfd_get_section_name (abfd, section), ".data") == 0)
+    section->alignment_power = xcoff_data (abfd)->data_align_power;
+#endif
+
   /* Allocate aux records for section symbols, to store size and
      related info.
 
@@ -964,6 +983,25 @@ coff_mkobject_hook (abfd, filehdr, aouthdr)
     obj_conv_table_size (abfd) =
       internal_f->f_nsyms;
 
+#ifdef RS6000COFF_C
+  if ((internal_f->f_flags & F_SHROBJ) != 0)
+    abfd->flags |= DYNAMIC;
+  if (aouthdr != NULL && internal_f->f_opthdr >= AOUTSZ)
+    {
+      struct internal_aouthdr *internal_a =
+       (struct internal_aouthdr *) aouthdr;
+      struct xcoff_tdata *xcoff;
+
+      xcoff = xcoff_data (abfd);
+      xcoff->toc = internal_a->o_toc;
+      xcoff->text_align_power = internal_a->o_algntext;
+      xcoff->data_align_power = internal_a->o_algndata;
+      xcoff->modtype = internal_a->o_modtype;
+      xcoff->maxdata = internal_a->o_maxdata;
+      xcoff->maxstack = internal_a->o_maxstack;
+    }
+#endif
+
   return (PTR) coff;
 }
 #endif
@@ -2036,6 +2074,13 @@ coff_write_object_contents (abfd)
      architectures.
      */
 
+#ifdef RS6000COFF_C
+  if ((abfd->flags & DYNAMIC) != 0)
+    internal_f.f_flags |= F_SHROBJ;
+  if (bfd_get_section_by_name (abfd, _LOADER) != NULL)
+    internal_f.f_flags |= F_DYNLOAD;
+#endif
+
   memset (&internal_a, 0, sizeof internal_a);
 
   /* Set up architecture-dependent stuff */
@@ -2180,6 +2225,72 @@ coff_write_object_contents (abfd)
   internal_a.entry = bfd_get_start_address (abfd);
   internal_f.f_nsyms = obj_raw_syment_count (abfd);
 
+#ifdef RS6000COFF_C
+  if ((abfd->flags & EXEC_P) != 0)
+    {
+      bfd_vma entry, toc;
+      asection *loader_sec;
+
+      entry = bfd_get_start_address (abfd);
+      if (text_sec != NULL
+         && entry >= text_sec->vma
+         && entry < text_sec->vma + bfd_section_size (abfd, text_sec))
+       internal_a.o_snentry = text_sec->target_index;
+      else if (data_sec != NULL
+              && entry >= data_sec->vma
+              && entry < data_sec->vma + bfd_section_size (abfd, data_sec))
+       internal_a.o_snentry = data_sec->target_index;
+      else
+       internal_a.o_snentry = 0;
+      if (text_sec != NULL)
+       {
+         internal_a.o_sntext = text_sec->target_index;
+         internal_a.o_algntext = bfd_get_section_alignment (abfd, text_sec);
+       }
+      else
+       {
+         internal_a.o_sntext = 0;
+         internal_a.o_algntext = 0;
+       }
+      if (data_sec != NULL)
+       {
+         internal_a.o_sndata = data_sec->target_index;
+         internal_a.o_algndata = bfd_get_section_alignment (abfd, data_sec);
+       }
+      else
+       {
+         internal_a.o_sndata = 0;
+         internal_a.o_algndata = 0;
+       }
+      loader_sec = bfd_get_section_by_name (abfd, ".loader");
+      if (loader_sec != NULL)
+       internal_a.o_snloader = loader_sec->target_index;
+      else
+       internal_a.o_snloader = 0;
+      if (bss_sec != NULL)
+       internal_a.o_snbss = bss_sec->target_index;
+      else
+       internal_a.o_snbss = 0;
+
+      toc = xcoff_data (abfd)->toc;
+      internal_a.o_toc = toc;
+      if (text_sec != NULL
+         && toc >= text_sec->vma
+         && toc < text_sec->vma + bfd_section_size (abfd, text_sec))
+       internal_a.o_sntoc = text_sec->target_index;
+      else if (data_sec != NULL
+              && toc >= data_sec->vma
+              && toc < data_sec->vma + bfd_section_size (abfd, data_sec))
+       internal_a.o_sntoc = data_sec->target_index;
+      else
+       internal_a.o_sntoc = 0;
+
+      internal_a.o_modtype = xcoff_data (abfd)->modtype;
+      internal_a.o_maxstack = xcoff_data (abfd)->maxstack;
+      internal_a.o_maxdata = xcoff_data (abfd)->maxdata;
+    }
+#endif
+
   /* now write them */
   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
     return false;
@@ -2476,15 +2587,9 @@ coff_slurp_symbol_table (abfd)
              /* A C_HIDEXT symbol is not global.  */
              if (src->u.syment.n_sclass == C_HIDEXT)
                dst->symbol.flags = BSF_LOCAL;
-             /* A XTY_LD symbol should not go at the end.  */
+             /* A symbol with a csect entry should not go at the end.  */
              if (src->u.syment.n_numaux > 0)
-               {
-                 combined_entry_type *auxp;
-
-                 auxp = src + src->u.syment.n_numaux;
-                 if (SMTYP_SMTYP (auxp->u.auxent.x_csect.x_smtyp) == XTY_LD)
-                   dst->symbol.flags |= BSF_NOT_AT_END;
-               }
+               dst->symbol.flags |= BSF_NOT_AT_END;
 #endif
 
              break;
index 0df46b7..2f36447 100644 (file)
@@ -487,11 +487,10 @@ coff_renumber_symbols (bfd_ptr, first_undef)
       }
     bfd_ptr->outsymbols = newsyms;
     for (i = 0; i < symbol_count; i++)
-      if (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
-         && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL
-                                          | BSF_NOT_AT_END
-                                          | BSF_FUNCTION))
-             != BSF_GLOBAL))
+      if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
+         || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
+             && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_FUNCTION))
+                 != BSF_GLOBAL)))
        *newsyms++ = symbol_ptr_ptr[i];
 
     for (i = 0; i < symbol_count; i++)
@@ -505,7 +504,8 @@ coff_renumber_symbols (bfd_ptr, first_undef)
     *first_undef = newsyms - bfd_ptr->outsymbols;
 
     for (i = 0; i < symbol_count; i++)
-      if (bfd_is_und_section (symbol_ptr_ptr[i]->section))
+      if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
+         && bfd_is_und_section (symbol_ptr_ptr[i]->section))
        *newsyms++ = symbol_ptr_ptr[i];
     *newsyms = (asymbol *) NULL;
     symbol_ptr_ptr = bfd_ptr->outsymbols;
index 4ab7340..75bbf32 100644 (file)
@@ -266,60 +266,6 @@ coff_swap_filehdr_out (abfd, in, out)
   bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
   bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
 
-#ifdef COFF_IMAGE_WITH_PE
-  /* put in extra dos header stuff.  This data remains essentially
-     constant, it just has to be tacked on to the beginning of all exes 
-     for NT */
-  bfd_h_put_16(abfd, filehdr_in->pe->e_magic, (bfd_byte *) filehdr_out->e_magic);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_cblp, (bfd_byte *) filehdr_out->e_cblp);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_cp, (bfd_byte *) filehdr_out->e_cp);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_crlc, (bfd_byte *) filehdr_out->e_crlc);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_cparhdr, 
-                     (bfd_byte *) filehdr_out->e_cparhdr);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_minalloc, 
-                     (bfd_byte *) filehdr_out->e_minalloc);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_maxalloc, 
-                     (bfd_byte *) filehdr_out->e_maxalloc);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_ss, (bfd_byte *) filehdr_out->e_ss);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_sp, (bfd_byte *) filehdr_out->e_sp);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_csum, (bfd_byte *) filehdr_out->e_csum);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_ip, (bfd_byte *) filehdr_out->e_ip);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_cs, (bfd_byte *) filehdr_out->e_cs);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_lfarlc, (bfd_byte *) filehdr_out->e_lfarlc);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_ovno, (bfd_byte *) filehdr_out->e_ovno);
-  {
-    int idx;
-    for (idx=0; idx < 4; idx++)
-      bfd_h_put_16(abfd, filehdr_in->pe->e_res[idx], 
-                         (bfd_byte *) filehdr_out->e_res[idx]);
-  }
-  bfd_h_put_16(abfd, filehdr_in->pe->e_oemid, (bfd_byte *) filehdr_out->e_oemid);
-  bfd_h_put_16(abfd, filehdr_in->pe->e_oeminfo,
-                     (bfd_byte *) filehdr_out->e_oeminfo);
-  {
-    int idx;
-    for (idx=0; idx < 10; idx++)
-      bfd_h_put_16(abfd, filehdr_in->pe->e_res2[idx],
-                         (bfd_byte *) filehdr_out->e_res2[idx]);
-  }
-  bfd_h_put_32(abfd, filehdr_in->pe->e_lfanew, (bfd_byte *) filehdr_out->e_lfanew);
-
-  {
-    int idx;
-    for (idx=0; idx < 16; idx++)
-      bfd_h_put_32(abfd, filehdr_in->pe->dos_message[idx],
-                         (bfd_byte *) filehdr_out->dos_message[idx]);
-  }
-
-  /* also put in the NT signature */
-  bfd_h_put_32(abfd, filehdr_in->pe->nt_signature, 
-                     (bfd_byte *) filehdr_out->nt_signature);
-
-
-#endif
-
-
-
   return sizeof(FILHDR);
 }
 
@@ -356,27 +302,6 @@ coff_swap_sym_in (abfd, ext1, in1)
   }
   in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
   in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
-
-#ifdef COFF_WITH_PE
-  /* The section symbols for the .idata$ sections have class 68, which MS
-     documentation indicates is a section symbol.  The problem is that the
-     value field in the symbol is simply a copy of the .idata section's flags
-     rather than something useful.  When these symbols are encountered, change
-     the value to 0 and the section number to 1 so that they will be handled
-     somewhat correctly in the bfd code. */
-  if (in->n_sclass == 0x68) {
-    in->n_value = 0x0;
-    in->n_scnum = 1;
-    /* I have tried setting the class to 3 and using the following to set
-       the section number.  This will put the address of the pointer to the
-       string kernel32.dll at addresses 0 and 0x10 off start of idata section
-       which is not correct */
-/*    if (strcmp (in->_n._n_name, ".idata$4") == 0) */
-/*      in->n_scnum = 3; */
-/*    else */
-/*      in->n_scnum = 2; */
-    }
-#endif
 }
 
 static unsigned int
@@ -697,6 +622,7 @@ coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
   aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
   aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
   aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
+  aouthdr_int->o_maxdata = bfd_h_get_32(abfd, aouthdr_ext->o_maxdata);
 #endif
 
 #ifdef MIPSECOFF
@@ -715,51 +641,6 @@ coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
   aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
   aouthdr_int->fprmask = bfd_h_get_32(abfd, aouthdr_ext->fprmask);
 #endif
-
-#ifdef COFF_IMAGE_WITH_PE
-
-  {
-    struct internal_extra_pe_aouthdr *a;
-    PEAOUTHDR *src = (PEAOUTHDR *)(aouthdr_ext);
-    a = aouthdr_int->pe = bfd_alloc (abfd, sizeof (*a));
-
-    a->ImageBase = bfd_h_get_32 (abfd, src->ImageBase);
-    a->SectionAlignment = bfd_h_get_32 (abfd, src->SectionAlignment);
-    a->FileAlignment = bfd_h_get_32 (abfd, src->FileAlignment);
-    a->MajorOperatingSystemVersion = 
-      bfd_h_get_16 (abfd, src->MajorOperatingSystemVersion);
-    a->MinorOperatingSystemVersion = 
-      bfd_h_get_16 (abfd, src->MinorOperatingSystemVersion);
-    a->MajorImageVersion = bfd_h_get_16 (abfd, src->MajorImageVersion);
-    a->MinorImageVersion = bfd_h_get_16 (abfd, src->MinorImageVersion);
-    a->MajorSubsystemVersion = bfd_h_get_16 (abfd, src->MajorSubsystemVersion);
-    a->MinorSubsystemVersion = bfd_h_get_16 (abfd, src->MinorSubsystemVersion);
-    a->Reserved1 = bfd_h_get_32 (abfd, src->Reserved1);
-    a->SizeOfImage = bfd_h_get_32 (abfd, src->SizeOfImage);
-    a->SizeOfHeaders = bfd_h_get_32 (abfd, src->SizeOfHeaders);
-    a->CheckSum = bfd_h_get_32 (abfd, src->CheckSum);
-    a->Subsystem = bfd_h_get_16 (abfd, src->Subsystem);
-    a->DllCharacteristics = bfd_h_get_16 (abfd, src->DllCharacteristics);
-    a->SizeOfStackReserve = bfd_h_get_32 (abfd, src->SizeOfStackReserve);
-    a->SizeOfStackCommit = bfd_h_get_32 (abfd, src->SizeOfStackCommit);
-    a->SizeOfHeapReserve = bfd_h_get_32 (abfd, src->SizeOfHeapReserve);
-    a->SizeOfHeapCommit = bfd_h_get_32 (abfd, src->SizeOfHeapCommit);
-    a->LoaderFlags = bfd_h_get_32 (abfd, src->LoaderFlags);
-    a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, src->NumberOfRvaAndSizes);
-
-    {
-      int idx;
-      for (idx=0; idx < 16; idx++)
-       {
-         a->DataDirectory[idx].VirtualAddress =
-           bfd_h_get_32 (abfd, src->DataDirectory[idx][0]);
-         a->DataDirectory[idx].Size =
-           bfd_h_get_32 (abfd, src->DataDirectory[idx][1]);
-       }
-    }
-  }
-#endif
-
 }
 
 static unsigned int
@@ -781,68 +662,28 @@ coff_swap_aouthdr_out (abfd, in, out)
                          (bfd_byte *) aouthdr_out->text_start);
   PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
                          (bfd_byte *) aouthdr_out->data_start);
-#ifdef COFF_IMAGE_WITH_PE
-  {
-  PEAOUTHDR *peaouthdr_out = (PEAOUTHDR *)aouthdr_out;
-  bfd_h_put_32 (abfd, aouthdr_in->pe->ImageBase, 
-                (bfd_byte *) peaouthdr_out->ImageBase);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SectionAlignment,
-                (bfd_byte *) peaouthdr_out->SectionAlignment);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->FileAlignment,
-                (bfd_byte *) peaouthdr_out->FileAlignment);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->MajorOperatingSystemVersion,
-                (bfd_byte *) peaouthdr_out->MajorOperatingSystemVersion);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->MinorOperatingSystemVersion,
-                (bfd_byte *) peaouthdr_out->MinorOperatingSystemVersion);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->MajorImageVersion,
-                (bfd_byte *) peaouthdr_out->MajorImageVersion);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->MinorImageVersion,
-                (bfd_byte *) peaouthdr_out->MinorImageVersion);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->MajorSubsystemVersion,
-                (bfd_byte *) peaouthdr_out->MajorSubsystemVersion);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->MinorSubsystemVersion,
-                (bfd_byte *) peaouthdr_out->MinorSubsystemVersion);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->Reserved1,
-                (bfd_byte *) peaouthdr_out->Reserved1);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SizeOfImage,
-                (bfd_byte *) peaouthdr_out->SizeOfImage);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SizeOfHeaders,
-                (bfd_byte *) peaouthdr_out->SizeOfHeaders);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->CheckSum,
-                (bfd_byte *) peaouthdr_out->CheckSum);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->Subsystem,
-                (bfd_byte *) peaouthdr_out->Subsystem);
-  bfd_h_put_16 (abfd, aouthdr_in->pe->DllCharacteristics,
-                (bfd_byte *) peaouthdr_out->DllCharacteristics);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SizeOfStackReserve,
-                (bfd_byte *) peaouthdr_out->SizeOfStackReserve);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SizeOfStackCommit,
-                (bfd_byte *) peaouthdr_out->SizeOfStackCommit);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SizeOfHeapReserve,
-                (bfd_byte *) peaouthdr_out->SizeOfHeapReserve);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->SizeOfHeapCommit,
-                (bfd_byte *) peaouthdr_out->SizeOfHeapCommit);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->LoaderFlags,
-                (bfd_byte *) peaouthdr_out->LoaderFlags);
-  bfd_h_put_32 (abfd, aouthdr_in->pe->NumberOfRvaAndSizes,
-                (bfd_byte *) peaouthdr_out->NumberOfRvaAndSizes);
-  {
-    int idx;
-    for (idx=0; idx < 16; idx++)
-    {
-      bfd_h_put_32 (abfd, aouthdr_in->pe->DataDirectory[idx].VirtualAddress,
-               (bfd_byte *) peaouthdr_out->DataDirectory[idx][0]);
-      bfd_h_put_32 (abfd, aouthdr_in->pe->DataDirectory[idx].Size,
-                (bfd_byte *) peaouthdr_out->DataDirectory[idx][1]);
-    }
-  }
-}
-#endif
 
 #ifdef I960
   bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
 #endif
 
+#ifdef RS6000COFF_C
+  bfd_h_put_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
+  bfd_h_put_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
+  bfd_h_put_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
+  bfd_h_put_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
+  bfd_h_put_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
+  bfd_h_put_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
+  bfd_h_put_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
+  bfd_h_put_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
+  bfd_h_put_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
+  bfd_h_put_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
+  bfd_h_put_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
+  bfd_h_put_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
+  memset (aouthdr_out->o_resv1, 0, sizeof aouthdr_out->o_resv1);
+  memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2);
+#endif
+
 #ifdef MIPSECOFF
   bfd_h_put_32(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
   bfd_h_put_32(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
@@ -900,13 +741,6 @@ coff_swap_scnhdr_in (abfd, ext, in)
 #ifdef I960
   scnhdr_int->s_align = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_align);
 #endif
-#ifdef COFF_IMAGE_WITH_PE
-#ifdef NT_EXE_IMAGE_BASE
-  if (scnhdr_int->s_vaddr != 0) {
-    scnhdr_int->s_vaddr += NT_EXE_IMAGE_BASE;
-  }
-#endif
-#endif
 }
 
 static unsigned int
@@ -921,38 +755,6 @@ coff_swap_scnhdr_out (abfd, in, out)
 
   memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
 
-#ifdef COFF_IMAGE_WITH_PE
-
-  {
-  bfd_link_pe_info *pe_info = coff_data (abfd)->link_info->pe_info;
-
-  PUT_SCNHDR_VADDR (abfd, 
-                   (scnhdr_int->s_vaddr 
-                    - pe_value (&pe_info->image_base,
-                                NT_EXE_IMAGE_BASE)),
-                   (bfd_byte *) scnhdr_ext->s_vaddr);
-
-
-  /* NT wants the physical address data to be the size (s_size data) of
-     the section */
-#if 1
-  PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_size,
-                   (bfd_byte *) scnhdr_ext->s_paddr);
-#endif
-  /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
-     value except for the BSS section, its s_size should be 0 */
-  if (strcmp (scnhdr_int->s_name, _BSS) == 0)
-    PUT_SCNHDR_SIZE (abfd, 0, (bfd_byte *) scnhdr_ext->s_size);
-  else
-    {
-      bfd_vma rounded_size;
-      rounded_size = ((scnhdr_int->s_size + NT_FILE_ALIGNMENT - 1) / 
-                     NT_FILE_ALIGNMENT) *
-                       NT_FILE_ALIGNMENT;
-      PUT_SCNHDR_SIZE (abfd, rounded_size, (bfd_byte *) scnhdr_ext->s_size);
-    }
-}
-#else
   PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr,
                    (bfd_byte *) scnhdr_ext->s_vaddr);
 
@@ -961,45 +763,14 @@ coff_swap_scnhdr_out (abfd, in, out)
                    (bfd_byte *) scnhdr_ext->s_paddr);
   PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size,
                   (bfd_byte *) scnhdr_ext->s_size);
-#endif
+
   PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
                     (bfd_byte *) scnhdr_ext->s_scnptr);
   PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
                     (bfd_byte *) scnhdr_ext->s_relptr);
   PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
                      (bfd_byte *) scnhdr_ext->s_lnnoptr);
-#ifdef COFF_IMAGE_WITH_PE
-  /* Extra flags must be set when dealing with NT.  All sections should also
-     have the IMAGE_SCN_MEM_READ (0x40000000) flag set.  In addition, the
-     .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
-     sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
-     (this is especially important when dealing with the .idata section since
-     the addresses for routines from .dlls must be overwritten).  If .reloc
-     section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
-     (0x02000000).  Also, the resource data should also be read and
-     writable.  */
-  {
-    int flags = scnhdr_int->s_flags;
-    if (strcmp (scnhdr_int->s_name, ".data")  == 0 ||
-       strcmp (scnhdr_int->s_name, ".CRT")   == 0 ||
-       strcmp (scnhdr_int->s_name, ".rsrc")  == 0 ||
-       strcmp (scnhdr_int->s_name, ".bss")   == 0)
-      flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
-    else if (strcmp (scnhdr_int->s_name, ".text") == 0)
-      flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE;
-    else if (strcmp (scnhdr_int->s_name, ".reloc") == 0)
-      flags = SEC_DATA| IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE;
-    else if (strcmp (scnhdr_int->s_name, ".idata") == 0)
-      flags = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | SEC_DATA;     
-    else if (strcmp (scnhdr_int->s_name, ".rdata") == 0
-            || strcmp (scnhdr_int->s_name, ".edata") == 0)
-      flags =  IMAGE_SCN_MEM_READ | SEC_DATA;     
-
-    PUTWORD(abfd, flags, (bfd_byte *) scnhdr_ext->s_flags);
-  }
-#else
   PUTWORD(abfd, scnhdr_int->s_flags, (bfd_byte *) scnhdr_ext->s_flags);
-#endif
 #if defined(M88)
   PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
   PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
index bb690bb..f8d9d16 100644 (file)
@@ -97,6 +97,33 @@ typedef struct pe_tdata
 
 #define pe_data(bfd)           ((bfd)->tdata.pe_obj_data)
 
+/* Tdata for XCOFF files.  */
+
+struct xcoff_tdata
+{
+  /* Basic COFF information.  */
+  coff_data_type coff;
+
+  /* TOC value.  */
+  bfd_vma toc;
+
+  /* .text alignment from optional header.  */
+  int text_align_power;
+
+  /* .data alignment from optional header.  */
+  int data_align_power;
+
+  /* modtype from optional header.  */
+  short modtype;
+
+  /* maxdata from optional header.  */
+  bfd_size_type maxdata;
+
+  /* maxstack from optional header.  */
+  bfd_size_type maxstack;
+};
+
+#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data)
 
 /* We take the address of the first element of a asymbol to ensure that the
  * macro is only ever applied to an asymbol.  */
@@ -115,6 +142,11 @@ struct coff_section_tdata
   bfd_byte *contents;
   /* If this is true, the contents entry may not be freed.  */
   boolean keep_contents;
+  /* Information cached by coff_find_nearest_line.  */
+  bfd_vma offset;
+  unsigned int i;
+  const char *function;
+  int line_base;
   /* Available for individual backends.  */
   PTR tdata;
 };
index 4650bfc..98eeaf3 100644 (file)
@@ -97,6 +97,33 @@ typedef struct pe_tdata
 
 #define pe_data(bfd)           ((bfd)->tdata.pe_obj_data)
 
+/* Tdata for XCOFF files.  */
+
+struct xcoff_tdata
+{
+  /* Basic COFF information.  */
+  coff_data_type coff;
+
+  /* TOC value.  */
+  bfd_vma toc;
+
+  /* .text alignment from optional header.  */
+  int text_align_power;
+
+  /* .data alignment from optional header.  */
+  int data_align_power;
+
+  /* modtype from optional header.  */
+  short modtype;
+
+  /* maxdata from optional header.  */
+  bfd_size_type maxdata;
+
+  /* maxstack from optional header.  */
+  bfd_size_type maxstack;
+};
+
+#define xcoff_data(abfd) ((abfd)->tdata.xcoff_obj_data)
 
 /* We take the address of the first element of a asymbol to ensure that the
  * macro is only ever applied to an asymbol.  */