* peXXigen.c: Updates for PE/COFF V8.0, and clarification
(dir_names): Added CLR Runtime Header to dir_names[]. (_bfd_XX_print_private_bfd_data_common): Added EFI_ROM and XBOX subsystem names (_bfd_XXi_swap_aouthdr_in, _bfd_XXi_swap_aouthdr_out) (pe_print_idata, pe_print_edata) (_bfd_XX_bfd_copy_private_bfd_data_common) (_bfd_XXi_final_link_postscript): Use #DEFINEs for index into DataDirectory. * pe.h: Added defines for IMAGE_SUBSYSTEM_EFI_ROM and IMAGE_SUBSYSTEM_XBOX. * internal.h: Added defines for PE directory entry types. NB: in internal.h because IMAGE_NUMBEROF_DIRECTORY_ENTRYIES is in pe.h
This commit is contained in:
parent
25fe350bd9
commit
6c73cbb1d9
|
@ -484,9 +484,9 @@ _bfd_XXi_swap_aouthdr_in (bfd * abfd,
|
|||
/* These three fields are normally set up by ppc_relocate_section.
|
||||
In the case of reading a file in, we can pick them up from the
|
||||
DataDirectory. */
|
||||
first_thunk_address = a->DataDirectory[12].VirtualAddress;
|
||||
thunk_size = a->DataDirectory[12].Size;
|
||||
import_table_size = a->DataDirectory[1].Size;
|
||||
first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
|
||||
thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
|
||||
import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -544,9 +544,9 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
|
|||
fa = extra->FileAlignment;
|
||||
ib = extra->ImageBase;
|
||||
|
||||
idata2 = pe->pe_opthdr.DataDirectory[1];
|
||||
idata5 = pe->pe_opthdr.DataDirectory[12];
|
||||
tls = pe->pe_opthdr.DataDirectory[9];
|
||||
idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
|
||||
idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
|
||||
tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
|
||||
|
||||
if (aouthdr_in->tsize)
|
||||
{
|
||||
|
@ -596,11 +596,11 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
|
|||
|
||||
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;
|
||||
extra->DataDirectory[9] = tls;
|
||||
extra->DataDirectory[PE_IMPORT_TABLE] = idata2;
|
||||
extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5;
|
||||
extra->DataDirectory[PE_TLS_TABLE] = tls;
|
||||
|
||||
if (extra->DataDirectory[1].VirtualAddress == 0)
|
||||
if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0)
|
||||
/* Until other .idata fixes are made (pending patch), the entry for
|
||||
.idata is needed for backwards compatibility. FIXME. */
|
||||
add_data_entry (abfd, extra, 1, ".idata", ib);
|
||||
|
@ -1021,7 +1021,7 @@ static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
|
|||
N_("Bound Import Directory"),
|
||||
N_("Import Address Table Directory"),
|
||||
N_("Delay Import Directory"),
|
||||
N_("Reserved"),
|
||||
N_("CLR Runtime Header"),
|
||||
N_("Reserved")
|
||||
};
|
||||
|
||||
|
@ -1055,9 +1055,9 @@ pe_print_idata (bfd * abfd, void * vfile)
|
|||
|
||||
bfd_vma addr;
|
||||
|
||||
addr = extra->DataDirectory[1].VirtualAddress;
|
||||
addr = extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
|
||||
|
||||
if (addr == 0 && extra->DataDirectory[1].Size == 0)
|
||||
if (addr == 0 && extra->DataDirectory[PE_IMPORT_TABLE].Size == 0)
|
||||
{
|
||||
/* Maybe the extra header isn't there. Look for the section. */
|
||||
section = bfd_get_section_by_name (abfd, ".idata");
|
||||
|
@ -1175,7 +1175,7 @@ pe_print_idata (bfd * abfd, void * vfile)
|
|||
bfd_size_type j;
|
||||
char *dll;
|
||||
|
||||
/* Print (i + extra->DataDirectory[1].VirtualAddress). */
|
||||
/* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */
|
||||
fprintf (file, " %08lx\t", (unsigned long) (i + adj + dataoff));
|
||||
hint_addr = bfd_get_32 (abfd, data + i + dataoff);
|
||||
time_stamp = bfd_get_32 (abfd, data + i + 4 + dataoff);
|
||||
|
@ -1216,8 +1216,8 @@ pe_print_idata (bfd * abfd, void * vfile)
|
|||
ft_data = data;
|
||||
ft_idx = first_thunk - adj;
|
||||
ft_allocated = 0;
|
||||
|
||||
if (first_thunk != hint_addr)
|
||||
|
||||
if (first_thunk != hint_addr)
|
||||
{
|
||||
/* Find the section which contains the first thunk. */
|
||||
for (ft_section = abfd->sections;
|
||||
|
@ -1372,9 +1372,9 @@ pe_print_edata (bfd * abfd, void * vfile)
|
|||
|
||||
bfd_vma addr;
|
||||
|
||||
addr = extra->DataDirectory[0].VirtualAddress;
|
||||
addr = extra->DataDirectory[PE_EXPORT_TABLE].VirtualAddress;
|
||||
|
||||
if (addr == 0 && extra->DataDirectory[0].Size == 0)
|
||||
if (addr == 0 && extra->DataDirectory[PE_EXPORT_TABLE].Size == 0)
|
||||
{
|
||||
/* Maybe the extra header isn't there. Look for the section. */
|
||||
section = bfd_get_section_by_name (abfd, ".edata");
|
||||
|
@ -1403,7 +1403,7 @@ pe_print_edata (bfd * abfd, void * vfile)
|
|||
}
|
||||
|
||||
dataoff = addr - section->vma;
|
||||
datasize = extra->DataDirectory[0].Size;
|
||||
datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
|
||||
if (datasize > section->size - dataoff)
|
||||
{
|
||||
fprintf (file,
|
||||
|
@ -1873,6 +1873,16 @@ _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
|
|||
case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
|
||||
subsystem_name = "EFI runtime driver";
|
||||
break;
|
||||
// These are from revision 8.0 of the MS PE/COFF spec
|
||||
case IMAGE_SUBSYSTEM_EFI_ROM:
|
||||
subsystem_name = "EFI ROM";
|
||||
break;
|
||||
case IMAGE_SUBSYSTEM_XBOX:
|
||||
subsystem_name = "XBOX";
|
||||
break;
|
||||
// Added default case for clarity - subsystem_name is NULL anyway.
|
||||
default:
|
||||
subsystem_name = NULL;
|
||||
}
|
||||
|
||||
fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
|
||||
|
@ -1925,8 +1935,8 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
|
|||
if we don't remove this entry as well. */
|
||||
if (! pe_data (obfd)->has_reloc_section)
|
||||
{
|
||||
pe_data (obfd)->pe_opthdr.DataDirectory[5].VirtualAddress = 0;
|
||||
pe_data (obfd)->pe_opthdr.DataDirectory[5].Size = 0;
|
||||
pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
|
||||
pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -2004,7 +2014,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
|
|||
message for any sections tht could not be found. */
|
||||
if (h1->root.u.def.section != NULL
|
||||
&& h1->root.u.def.section->output_section != NULL)
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[1].VirtualAddress =
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
|
||||
(h1->root.u.def.value
|
||||
+ h1->root.u.def.section->output_section->vma
|
||||
+ h1->root.u.def.section->output_offset);
|
||||
|
@ -2021,11 +2031,11 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
|
|||
if (h1 != NULL
|
||||
&& h1->root.u.def.section != NULL
|
||||
&& h1->root.u.def.section->output_section != NULL)
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[1].Size =
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
|
||||
((h1->root.u.def.value
|
||||
+ h1->root.u.def.section->output_section->vma
|
||||
+ h1->root.u.def.section->output_offset)
|
||||
- pe_data (abfd)->pe_opthdr.DataDirectory[1].VirtualAddress);
|
||||
- pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
|
||||
else
|
||||
{
|
||||
_bfd_error_handler
|
||||
|
@ -2041,7 +2051,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
|
|||
if (h1 != NULL
|
||||
&& h1->root.u.def.section != NULL
|
||||
&& h1->root.u.def.section->output_section != NULL)
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[12].VirtualAddress =
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
|
||||
(h1->root.u.def.value
|
||||
+ h1->root.u.def.section->output_section->vma
|
||||
+ h1->root.u.def.section->output_offset);
|
||||
|
@ -2058,15 +2068,15 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
|
|||
if (h1 != NULL
|
||||
&& h1->root.u.def.section != NULL
|
||||
&& h1->root.u.def.section->output_section != NULL)
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[12].Size =
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
|
||||
((h1->root.u.def.value
|
||||
+ h1->root.u.def.section->output_section->vma
|
||||
+ h1->root.u.def.section->output_offset)
|
||||
- pe_data (abfd)->pe_opthdr.DataDirectory[12].VirtualAddress);
|
||||
- pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
|
||||
else
|
||||
{
|
||||
_bfd_error_handler
|
||||
(_("%B: unable to fill in DataDictionary[12] because .idata$6 is missing"),
|
||||
(_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
|
||||
abfd);
|
||||
result = FALSE;
|
||||
}
|
||||
|
@ -2078,7 +2088,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
|
|||
{
|
||||
if (h1->root.u.def.section != NULL
|
||||
&& h1->root.u.def.section->output_section != NULL)
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[9].VirtualAddress =
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
|
||||
(h1->root.u.def.value
|
||||
+ h1->root.u.def.section->output_section->vma
|
||||
+ h1->root.u.def.section->output_offset
|
||||
|
@ -2091,7 +2101,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
|
|||
result = FALSE;
|
||||
}
|
||||
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[9].Size = 0x18;
|
||||
pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
|
||||
}
|
||||
|
||||
/* If we couldn't find idata$2, we either have an excessively
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2006-11-14 Phil Lello <phil.lello@homecall.co.uk>
|
||||
|
||||
* pe.h: Added defines for IMAGE_SUBSYSTEM_EFI_ROM and
|
||||
IMAGE_SUBSYSTEM_XBOX.
|
||||
* internal.h: Added defines for PE directory entry types.
|
||||
NB: in internal.h because IMAGE_NUMBEROF_DIRECTORY_ENTRYIES is in
|
||||
pe.h
|
||||
|
||||
2006-09-20 Kai Tietz <Kai.Tietz@onevision.com>
|
||||
|
||||
* external.h: Add proper external_aouthdr64 structure (without
|
||||
|
|
|
@ -103,6 +103,22 @@ typedef struct _IMAGE_DATA_DIRECTORY
|
|||
bfd_vma VirtualAddress;
|
||||
long Size;
|
||||
} IMAGE_DATA_DIRECTORY;
|
||||
#define PE_EXPORT_TABLE 0
|
||||
#define PE_IMPORT_TABLE 1
|
||||
#define PE_RESOURCE_TABLE 2
|
||||
#define PE_EXCEPTION_TABLE 3
|
||||
#define PE_CERTIFICATE_TABLE 4
|
||||
#define PE_BASE_RELOCATION_TABLE 5
|
||||
#define PE_DEBUG_DATA 6
|
||||
#define PE_ARCHITECTURE 7
|
||||
#define PE_GLOBAL_PTR 8
|
||||
#define PE_TLS_TABLE 9
|
||||
#define PE_LOAD_CONFIG_TABLE 10
|
||||
#define PE_BOUND_IMPORT_TABLE 11
|
||||
#define PE_IMPORT_ADDRESS_TABLE 12
|
||||
#define PE_DELAY_IMPORT_DESCRIPTOR 13
|
||||
#define PE_CLR_RUNTIME_HEADER 14
|
||||
/* DataDirectory[15] is currently reserved, so no define. */
|
||||
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
|
||||
|
||||
/* Default image base for NT. */
|
||||
|
|
|
@ -130,6 +130,8 @@
|
|||
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
|
||||
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
|
||||
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
|
||||
#define IMAGE_SUBSYSTEM_EFI_ROM 13
|
||||
#define IMAGE_SUBSYSTEM_XBOX 14
|
||||
|
||||
/* Magic values that are true for all dos/nt implementations. */
|
||||
#define DOSMAGIC 0x5a4d
|
||||
|
|
Loading…
Reference in New Issue