aboutsummaryrefslogtreecommitdiff
path: root/bfd/coffswap.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1995-10-09 21:19:53 +0000
committerIan Lance Taylor <ian@airs.com>1995-10-09 21:19:53 +0000
commit5f710a3a892886e442bc24a5a05a56550693abdc (patch)
tree82c4e30223b551f7a92b9a402477fe873cf98065 /bfd/coffswap.h
parent531f86b422809ddca80d367aeb8cf4154401f534 (diff)
downloadgdb-5f710a3a892886e442bc24a5a05a56550693abdc.zip
gdb-5f710a3a892886e442bc24a5a05a56550693abdc.tar.gz
gdb-5f710a3a892886e442bc24a5a05a56550693abdc.tar.bz2
* 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.
Diffstat (limited to 'bfd/coffswap.h')
-rw-r--r--bfd/coffswap.h267
1 files changed, 19 insertions, 248 deletions
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);