aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog29
-rw-r--r--bfd/coffcode.h121
-rw-r--r--bfd/coffgen.c12
-rw-r--r--bfd/coffswap.h267
-rw-r--r--bfd/libcoff-in.h32
-rw-r--r--bfd/libcoff.h27
6 files changed, 224 insertions, 264 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b6de77e..6bda4ae 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index eabbc4c..85665c6 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -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;
diff --git a/bfd/coffgen.c b/bfd/coffgen.c
index 0df46b7..2f36447 100644
--- a/bfd/coffgen.c
+++ b/bfd/coffgen.c
@@ -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;
diff --git a/bfd/coffswap.h b/bfd/coffswap.h
index 4ab7340..75bbf32 100644
--- a/bfd/coffswap.h
+++ b/bfd/coffswap.h
@@ -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);
diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index bb690bb..f8d9d16 100644
--- a/bfd/libcoff-in.h
+++ b/bfd/libcoff-in.h
@@ -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;
};
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index 4650bfc..98eeaf3 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -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. */