Initialise $idata2 and $idata5 in case bfd_coff_final_link is not called.

This commit is contained in:
Nick Clifton 2003-03-20 09:02:09 +00:00
parent d1360fb06a
commit c25cfdf8a2
2 changed files with 31 additions and 15 deletions

View File

@ -1,3 +1,8 @@
2003-03-20 Nick Clifton <nickc@redhat.com>
* peXXigen.c (_bfd_XXi_swap_aouthdr_out): Initialise $idata2 and
$idata5 in case bfd_coff_final_link is not called.
2003-03-19 Jakub Jelinek <jakub@redhat.com> 2003-03-19 Jakub Jelinek <jakub@redhat.com>
* elf64-sparc.c (struct sparc64_elf_section_data): Add reloc_count * elf64-sparc.c (struct sparc64_elf_section_data): Add reloc_count

View File

@ -570,6 +570,8 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out)
struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out; PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
bfd_vma sa, fa, ib; bfd_vma sa, fa, ib;
IMAGE_DATA_DIRECTORY idata2, idata5;
if (pe->force_minimum_alignment) if (pe->force_minimum_alignment)
{ {
@ -586,6 +588,9 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out)
fa = extra->FileAlignment; fa = extra->FileAlignment;
ib = extra->ImageBase; ib = extra->ImageBase;
idata2 = pe->pe_opthdr.DataDirectory[1];
idata5 = pe->pe_opthdr.DataDirectory[12];
if (aouthdr_in->tsize) if (aouthdr_in->tsize)
{ {
aouthdr_in->text_start -= ib; aouthdr_in->text_start -= ib;
@ -614,28 +619,34 @@ _bfd_XXi_swap_aouthdr_out (abfd, in, out)
#define SA(x) (((x) + sa -1 ) & (- sa)) #define SA(x) (((x) + sa -1 ) & (- sa))
/* We like to have the sizes aligned. */ /* We like to have the sizes aligned. */
aouthdr_in->bsize = FA (aouthdr_in->bsize); aouthdr_in->bsize = FA (aouthdr_in->bsize);
extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES; extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
/* first null out all data directory entries .. */ /* First null out all data directory entries. */
memset (extra->DataDirectory, 0, sizeof (extra->DataDirectory)); memset (extra->DataDirectory, 0, sizeof (extra->DataDirectory));
add_data_entry (abfd, extra, 0, ".edata", ib); add_data_entry (abfd, extra, 0, ".edata", ib);
/* Don't call add_data_entry for .idata$2 or .idata$5. It's done in
bfd_coff_final_link where all the required information is
available. */
/* However, until other .idata fixes are made (pending patch), the
entry for .idata is needed for backwards compatability. FIXME. */
add_data_entry (abfd, extra, 1, ".idata", ib);
add_data_entry (abfd, extra, 2, ".rsrc", ib); add_data_entry (abfd, extra, 2, ".rsrc", ib);
add_data_entry (abfd, extra, 3, ".pdata", ib); add_data_entry (abfd, extra, 3, ".pdata", ib);
/* In theory we do not need to call add_data_entry for .idata$2 or
.idata$5. It will be done in bfd_coff_final_link where all the
required information is available. If however, we are not going
to perform a final link, eg because we have been invoked by objcopy
or strip, then we need to make sure that these Data Directory
entries are initialised properly.
So - we copy the input values into the output values, and then, if
a final link is going to be performed, it can overwrite them. */
extra->DataDirectory[1] = idata2;
extra->DataDirectory[12] = idata5;
if (extra->DataDirectory[1].VirtualAddress == 0)
/* Until other .idata fixes are made (pending patch), the entry for
.idata is needed for backwards compatability. FIXME. */
add_data_entry (abfd, extra, 1, ".idata", ib);
/* For some reason, the virtual size (which is what's set by /* For some reason, the virtual size (which is what's set by
add_data_entry) for .reloc is not the same as the size recorded add_data_entry) for .reloc is not the same as the size recorded
in this slot by MSVC; it doesn't seem to cause problems (so far), in this slot by MSVC; it doesn't seem to cause problems (so far),