diff options
-rw-r--r-- | bfd/ChangeLog | 29 | ||||
-rw-r--r-- | bfd/coffcode.h | 121 | ||||
-rw-r--r-- | bfd/coffgen.c | 12 | ||||
-rw-r--r-- | bfd/coffswap.h | 267 | ||||
-rw-r--r-- | bfd/libcoff-in.h | 32 | ||||
-rw-r--r-- | bfd/libcoff.h | 27 |
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. */ |