diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-10-09 21:19:53 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-10-09 21:19:53 +0000 |
commit | 5f710a3a892886e442bc24a5a05a56550693abdc (patch) | |
tree | 82c4e30223b551f7a92b9a402477fe873cf98065 /bfd/coffswap.h | |
parent | 531f86b422809ddca80d367aeb8cf4154401f534 (diff) | |
download | gdb-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.h | 267 |
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); |