* peicode.h (coff_swap_aouthdr_out): For PPC PE, start isize at 0,
not at the file position of the first section. * coffcode.h (coff_compute_section_file_positions): Avoid using unportable #elif. (coff_write_object_contents): When generating a PPC PE executable with no symbols, round up the file size to a COFF_PAGE_SIZE boundary. * cofflink.c (_bfd_coff_final_link): If there are no symbols, don't write out a string table.
This commit is contained in:
parent
631b10f44e
commit
4b71e164cd
2 changed files with 401 additions and 10 deletions
|
@ -1,5 +1,15 @@
|
||||||
Tue Nov 14 11:52:23 1995 Ian Lance Taylor <ian@cygnus.com>
|
Tue Nov 14 11:52:23 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* peicode.h (coff_swap_aouthdr_out): For PPC PE, start isize at 0,
|
||||||
|
not at the file position of the first section.
|
||||||
|
* coffcode.h (coff_compute_section_file_positions): Avoid using
|
||||||
|
unportable #elif.
|
||||||
|
(coff_write_object_contents): When generating a PPC PE executable
|
||||||
|
with no symbols, round up the file size to a COFF_PAGE_SIZE
|
||||||
|
boundary.
|
||||||
|
* cofflink.c (_bfd_coff_final_link): If there are no symbols,
|
||||||
|
don't write out a string table.
|
||||||
|
|
||||||
* elf.c (bfd_section_from_shdr): When using a different section
|
* elf.c (bfd_section_from_shdr): When using a different section
|
||||||
header, pass the new one to _bfd_elf_make_section_from_shdr.
|
header, pass the new one to _bfd_elf_make_section_from_shdr.
|
||||||
(elf_fake_sections): Don't set sh_info and sh_entsize fields.
|
(elf_fake_sections): Don't set sh_info and sh_entsize fields.
|
||||||
|
|
399
bfd/peicode.h
399
bfd/peicode.h
|
@ -188,7 +188,6 @@ coff_swap_reloc_in (abfd, src, dst)
|
||||||
reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
|
reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
|
||||||
(bfd_byte *) reloc_src->r_offset);
|
(bfd_byte *) reloc_src->r_offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -247,7 +246,8 @@ coff_swap_filehdr_in (abfd, src, dst)
|
||||||
filehdr_dst->f_flags &= ~HAS_SYMS;
|
filehdr_dst->f_flags &= ~HAS_SYMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
|
filehdr_dst->f_opthdr = bfd_h_get_16(abfd,
|
||||||
|
(bfd_byte *)filehdr_src-> f_opthdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef COFF_IMAGE_WITH_PE
|
#ifdef COFF_IMAGE_WITH_PE
|
||||||
|
@ -326,7 +326,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_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
|
||||||
bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
|
bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
|
||||||
|
|
||||||
|
|
||||||
/* put in extra dos header stuff. This data remains essentially
|
/* put in extra dos header stuff. This data remains essentially
|
||||||
constant, it just has to be tacked on to the beginning of all exes
|
constant, it just has to be tacked on to the beginning of all exes
|
||||||
for NT */
|
for NT */
|
||||||
|
@ -426,6 +425,7 @@ coff_swap_sym_in (abfd, ext1, in1)
|
||||||
memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
|
memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
|
in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
|
||||||
in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
|
in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
|
||||||
if (sizeof(ext->e_type) == 2){
|
if (sizeof(ext->e_type) == 2){
|
||||||
|
@ -455,6 +455,10 @@ coff_swap_sym_in (abfd, ext1, in1)
|
||||||
/* else */
|
/* else */
|
||||||
/* in->n_scnum = 2; */
|
/* in->n_scnum = 2; */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef coff_swap_sym_in_hook
|
||||||
|
coff_swap_sym_in_hook(abfd, ext1, in1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
|
@ -476,6 +480,7 @@ coff_swap_sym_out (abfd, inp, extp)
|
||||||
memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
|
memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
|
bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
|
||||||
bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
|
bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
|
||||||
if (sizeof(ext->e_type) == 2)
|
if (sizeof(ext->e_type) == 2)
|
||||||
|
@ -488,6 +493,7 @@ coff_swap_sym_out (abfd, inp, extp)
|
||||||
}
|
}
|
||||||
bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
|
bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
|
||||||
bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
|
bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
|
||||||
|
|
||||||
return sizeof(SYMENT);
|
return sizeof(SYMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -771,7 +777,6 @@ static void add_data_entry (abfd, aout, idx, name, base)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned int
|
static unsigned int
|
||||||
coff_swap_aouthdr_out (abfd, in, out)
|
coff_swap_aouthdr_out (abfd, in, out)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
@ -809,12 +814,39 @@ coff_swap_aouthdr_out (abfd, in, out)
|
||||||
add_data_entry (abfd, extra, 0, ".edata", ib);
|
add_data_entry (abfd, extra, 0, ".edata", ib);
|
||||||
add_data_entry (abfd, extra, 1, ".idata", ib);
|
add_data_entry (abfd, extra, 1, ".idata", ib);
|
||||||
add_data_entry (abfd, extra, 2, ".rsrc" ,ib);
|
add_data_entry (abfd, extra, 2, ".rsrc" ,ib);
|
||||||
|
|
||||||
|
#ifdef POWERPC_LE_PE
|
||||||
|
/* FIXME: do other PE platforms use this? */
|
||||||
|
add_data_entry (abfd, extra, 3, ".pdata" ,ib);
|
||||||
|
#endif
|
||||||
|
|
||||||
add_data_entry (abfd, extra, 5, ".reloc", ib);
|
add_data_entry (abfd, extra, 5, ".reloc", ib);
|
||||||
|
|
||||||
|
#ifdef POWERPC_LE_PE
|
||||||
|
/* On the PPC NT system, this field is set up as follows. It is
|
||||||
|
not an "officially" reserved field, so it currently has no title.
|
||||||
|
first_thunk_address is idata$5, and the thunk_size is the size
|
||||||
|
of the idata$5 chunk of the idata section.
|
||||||
|
*/
|
||||||
|
extra->DataDirectory[12].VirtualAddress = first_thunk_address;
|
||||||
|
extra->DataDirectory[12].Size = thunk_size;
|
||||||
|
|
||||||
|
/* On the PPC NT system, the size of the directory entry is not the
|
||||||
|
size of the entire section. It's actually offset to the end of
|
||||||
|
the idata$3 component of the idata section. This is the size of
|
||||||
|
the entire import table. (also known as the start of idata$4)
|
||||||
|
*/
|
||||||
|
extra->DataDirectory[1].Size = import_table_size;
|
||||||
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
asection *sec;
|
asection *sec;
|
||||||
bfd_vma dsize= 0;
|
bfd_vma dsize= 0;
|
||||||
bfd_vma isize = SA(abfd->sections->filepos);
|
bfd_vma isize = SA(abfd->sections->filepos);
|
||||||
bfd_vma tsize= 0;
|
bfd_vma tsize= 0;
|
||||||
|
#ifdef PPC
|
||||||
|
isize = 0;
|
||||||
|
#endif
|
||||||
for (sec = abfd->sections; sec; sec = sec->next)
|
for (sec = abfd->sections; sec; sec = sec->next)
|
||||||
{
|
{
|
||||||
int rounded = FA(sec->_raw_size);
|
int rounded = FA(sec->_raw_size);
|
||||||
|
@ -832,7 +864,15 @@ coff_swap_aouthdr_out (abfd, in, out)
|
||||||
|
|
||||||
extra->SizeOfHeaders = abfd->sections->filepos;
|
extra->SizeOfHeaders = abfd->sections->filepos;
|
||||||
bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic);
|
bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic);
|
||||||
|
|
||||||
|
#ifdef POWERPC_LE_PE
|
||||||
|
/* this little piece of magic sets the "linker version" field to 2.60 */
|
||||||
|
bfd_h_put_16(abfd, 2 + 60 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
|
||||||
|
#else
|
||||||
|
/* this little piece of magic sets the "linker version" field to 2.55 */
|
||||||
bfd_h_put_16(abfd, 2 + 55 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
|
bfd_h_put_16(abfd, 2 + 55 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
|
||||||
|
#endif
|
||||||
|
|
||||||
PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize);
|
PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize);
|
||||||
PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize);
|
PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize);
|
||||||
PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize);
|
PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize);
|
||||||
|
@ -897,7 +937,6 @@ coff_swap_aouthdr_out (abfd, in, out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return sizeof(AOUTHDR);
|
return sizeof(AOUTHDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -953,7 +992,6 @@ coff_swap_scnhdr_out (abfd, in, out)
|
||||||
|
|
||||||
memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
|
memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
|
||||||
|
|
||||||
|
|
||||||
PUT_SCNHDR_VADDR (abfd,
|
PUT_SCNHDR_VADDR (abfd,
|
||||||
(scnhdr_int->s_vaddr
|
(scnhdr_int->s_vaddr
|
||||||
- pe_data(abfd)->pe_opthdr.ImageBase),
|
- pe_data(abfd)->pe_opthdr.ImageBase),
|
||||||
|
@ -1021,7 +1059,9 @@ coff_swap_scnhdr_out (abfd, in, out)
|
||||||
else if (strcmp (scnhdr_int->s_name, ".pdata") == 0)
|
else if (strcmp (scnhdr_int->s_name, ".pdata") == 0)
|
||||||
flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES |
|
flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES |
|
||||||
IMAGE_SCN_MEM_READ ;
|
IMAGE_SCN_MEM_READ ;
|
||||||
else if (strcmp (scnhdr_int->s_name, ".reldata") == 0)
|
/* Remember this field is a max of 8 chars, so the null is _not_ there
|
||||||
|
for an 8 character name like ".reldata". (yep. Stupid bug) */
|
||||||
|
else if (strncmp (scnhdr_int->s_name, ".reldata", strlen(".reldata")) == 0)
|
||||||
flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES |
|
flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES |
|
||||||
IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
|
IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
|
||||||
else if (strcmp (scnhdr_int->s_name, ".ydata") == 0)
|
else if (strcmp (scnhdr_int->s_name, ".ydata") == 0)
|
||||||
|
@ -1058,7 +1098,341 @@ coff_swap_scnhdr_out (abfd, in, out)
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
|
||||||
|
{
|
||||||
|
"Export Directory [.edata]",
|
||||||
|
"Import Directory [parts of .idata]",
|
||||||
|
"Resource Directory [.rsrc]",
|
||||||
|
"Exception Directory [.pdata]",
|
||||||
|
"Security Directory",
|
||||||
|
"Base Relocation Directory [.reloc]",
|
||||||
|
"Debug Directory",
|
||||||
|
"Description Directory",
|
||||||
|
"Special Directory",
|
||||||
|
"Thread Storage Directory [.tls]",
|
||||||
|
"Load Configuration Directory",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved [first thunk address on PPC]",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved",
|
||||||
|
"Reserved"
|
||||||
|
};
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
static boolean
|
||||||
|
pe_print_idata(abfd, vfile)
|
||||||
|
bfd*abfd;
|
||||||
|
void *vfile;
|
||||||
|
{
|
||||||
|
FILE *file = vfile;
|
||||||
|
bfd_byte *data = 0;
|
||||||
|
asection *section = bfd_get_section_by_name (abfd, ".idata");
|
||||||
|
|
||||||
|
#ifdef POWERPC_LE_PE
|
||||||
|
asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bfd_size_type datasize = 0;
|
||||||
|
bfd_size_type i;
|
||||||
|
bfd_size_type start, stop;
|
||||||
|
int onaline = 20;
|
||||||
|
bfd_vma addr_value;
|
||||||
|
bfd_vma loadable_toc_address;
|
||||||
|
bfd_vma toc_address;
|
||||||
|
bfd_vma start_address;
|
||||||
|
|
||||||
|
pe_data_type *pe = pe_data (abfd);
|
||||||
|
struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
|
||||||
|
|
||||||
|
if (section == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
#ifdef POWERPC_LE_PE
|
||||||
|
if (rel_section != 0 && bfd_section_size (abfd, rel_section) != 0)
|
||||||
|
{
|
||||||
|
/* The toc address can be found by taking the starting address,
|
||||||
|
which on the PPC locates a function descriptor. The descriptor
|
||||||
|
consists of the function code starting address followed by the
|
||||||
|
address of the toc. The starting address we get from the bfd,
|
||||||
|
and the descriptor is supposed to be in the .reldata section.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bfd_byte *data = 0;
|
||||||
|
int offset;
|
||||||
|
data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd,
|
||||||
|
rel_section));
|
||||||
|
datasize = bfd_section_size (abfd, rel_section);
|
||||||
|
|
||||||
|
bfd_get_section_contents (abfd,
|
||||||
|
rel_section,
|
||||||
|
(PTR) data, 0,
|
||||||
|
bfd_section_size (abfd, rel_section));
|
||||||
|
|
||||||
|
offset = abfd->start_address - rel_section->vma;
|
||||||
|
|
||||||
|
start_address = bfd_get_32(abfd, data+offset);
|
||||||
|
loadable_toc_address = bfd_get_32(abfd, data+offset+4);
|
||||||
|
toc_address = loadable_toc_address - 32768;
|
||||||
|
fprintf(file,
|
||||||
|
"\nFunction descriptor located at the start address:\n");
|
||||||
|
fprintf (file,
|
||||||
|
" %04lx code-base %08lx toc (loadable) %08lx toc (actual) %08lx\n",
|
||||||
|
(unsigned long int) (abfd->start_address),
|
||||||
|
start_address, loadable_toc_address, toc_address);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loadable_toc_address = 0;
|
||||||
|
toc_address = 0;
|
||||||
|
start_address = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fprintf(file,
|
||||||
|
"\nThe Import Tables (interpreted .idata section contents)\n");
|
||||||
|
fprintf(file,
|
||||||
|
" vma: Hint Time Forward DLL First\n");
|
||||||
|
fprintf(file,
|
||||||
|
" Table Stamp Chain Name Thunk\n");
|
||||||
|
|
||||||
|
if (bfd_section_size (abfd, section) == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
|
||||||
|
datasize = bfd_section_size (abfd, section);
|
||||||
|
|
||||||
|
bfd_get_section_contents (abfd,
|
||||||
|
section,
|
||||||
|
(PTR) data, 0,
|
||||||
|
bfd_section_size (abfd, section));
|
||||||
|
|
||||||
|
start = 0;
|
||||||
|
|
||||||
|
stop = bfd_section_size (abfd, section);
|
||||||
|
|
||||||
|
for (i = start; i < stop; i += onaline)
|
||||||
|
{
|
||||||
|
bfd_vma hint_addr;
|
||||||
|
bfd_vma time_stamp;
|
||||||
|
bfd_vma forward_chain;
|
||||||
|
bfd_vma dll_name;
|
||||||
|
bfd_vma first_thunk;
|
||||||
|
int idx;
|
||||||
|
int j;
|
||||||
|
char *dll;
|
||||||
|
int adj = extra->ImageBase - section->vma;
|
||||||
|
|
||||||
|
fprintf (file,
|
||||||
|
" %04lx\t",
|
||||||
|
(unsigned long int) (i + section->vma));
|
||||||
|
|
||||||
|
if (i+20 > stop)
|
||||||
|
{
|
||||||
|
/* check stuff */
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
hint_addr = bfd_get_32(abfd, data+i);
|
||||||
|
time_stamp = bfd_get_32(abfd, data+i+4);
|
||||||
|
forward_chain = bfd_get_32(abfd, data+i+8);
|
||||||
|
dll_name = bfd_get_32(abfd, data+i+12);
|
||||||
|
first_thunk = bfd_get_32(abfd, data+i+16);
|
||||||
|
|
||||||
|
fprintf(file, "%08lx %08lx %08lx %08lx %08lx\n",
|
||||||
|
hint_addr,
|
||||||
|
time_stamp,
|
||||||
|
forward_chain,
|
||||||
|
dll_name,
|
||||||
|
first_thunk);
|
||||||
|
|
||||||
|
if (hint_addr ==0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the image base is present in the section->vma */
|
||||||
|
dll = data + dll_name + adj;
|
||||||
|
fprintf(file, "\n\tDLL Name: %s\n", dll);
|
||||||
|
fprintf(file, "\tvma: Ordinal Member-Name\n");
|
||||||
|
|
||||||
|
idx = hint_addr + adj;
|
||||||
|
|
||||||
|
for (j=0;j<stop;j+=4)
|
||||||
|
{
|
||||||
|
int ordinal;
|
||||||
|
char *member_name;
|
||||||
|
bfd_vma member = bfd_get_32(abfd, data + idx + j);
|
||||||
|
if (member == 0)
|
||||||
|
break;
|
||||||
|
ordinal = bfd_get_16(abfd,
|
||||||
|
data + member + adj);
|
||||||
|
member_name = data + member + adj + 2;
|
||||||
|
fprintf(file, "\t%04lx\t %4d %s\n",
|
||||||
|
member, ordinal, member_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hint_addr != first_thunk)
|
||||||
|
{
|
||||||
|
int differ = 0;
|
||||||
|
int idx2;
|
||||||
|
|
||||||
|
idx2 = first_thunk + adj;
|
||||||
|
|
||||||
|
for (j=0;j<stop;j+=4)
|
||||||
|
{
|
||||||
|
int ordinal;
|
||||||
|
char *member_name;
|
||||||
|
bfd_vma hint_member = bfd_get_32(abfd, data + idx + j);
|
||||||
|
bfd_vma iat_member = bfd_get_32(abfd, data + idx2 + j);
|
||||||
|
if (hint_member != iat_member)
|
||||||
|
{
|
||||||
|
if (differ == 0)
|
||||||
|
{
|
||||||
|
fprintf(file,
|
||||||
|
"\tThe Import Address Table (difference found)\n");
|
||||||
|
fprintf(file, "\tvma: Ordinal Member-Name\n");
|
||||||
|
differ = 1;
|
||||||
|
}
|
||||||
|
if (iat_member == 0)
|
||||||
|
{
|
||||||
|
fprintf(file,
|
||||||
|
"\t>>> Ran out of IAT members!\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ordinal = bfd_get_16(abfd,
|
||||||
|
data + iat_member + adj);
|
||||||
|
member_name = data + iat_member + adj + 2;
|
||||||
|
fprintf(file, "\t%04lx\t %4d %s\n",
|
||||||
|
iat_member, ordinal, member_name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (hint_member == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (differ == 0)
|
||||||
|
{
|
||||||
|
fprintf(file,
|
||||||
|
"\tThe Import Address Table is identical\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(file, "\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
free (data);
|
||||||
|
}
|
||||||
|
static boolean
|
||||||
|
pe_print_pdata(abfd, vfile)
|
||||||
|
bfd*abfd;
|
||||||
|
void *vfile;
|
||||||
|
{
|
||||||
|
FILE *file = vfile;
|
||||||
|
bfd_byte *data = 0;
|
||||||
|
asection *section = bfd_get_section_by_name (abfd, ".pdata");
|
||||||
|
bfd_size_type datasize = 0;
|
||||||
|
bfd_size_type i;
|
||||||
|
bfd_size_type start, stop;
|
||||||
|
int onaline = 20;
|
||||||
|
bfd_vma addr_value;
|
||||||
|
|
||||||
|
if (section == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
fprintf(file,
|
||||||
|
"\nThe Function Table (interpreted .pdata section contents)\n");
|
||||||
|
fprintf(file,
|
||||||
|
" vma: Begin End EH EH PrologEnd\n");
|
||||||
|
fprintf(file,
|
||||||
|
" Address Address Handler Data Address\n");
|
||||||
|
|
||||||
|
if (bfd_section_size (abfd, section) == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
data = (bfd_byte *) xmalloc ((size_t) bfd_section_size (abfd, section));
|
||||||
|
datasize = bfd_section_size (abfd, section);
|
||||||
|
|
||||||
|
bfd_get_section_contents (abfd,
|
||||||
|
section,
|
||||||
|
(PTR) data, 0,
|
||||||
|
bfd_section_size (abfd, section));
|
||||||
|
|
||||||
|
start = 0;
|
||||||
|
|
||||||
|
stop = bfd_section_size (abfd, section);
|
||||||
|
|
||||||
|
for (i = start; i < stop; i += onaline)
|
||||||
|
{
|
||||||
|
bfd_vma begin_addr;
|
||||||
|
bfd_vma end_addr;
|
||||||
|
bfd_vma eh_handler;
|
||||||
|
bfd_vma eh_data;
|
||||||
|
bfd_vma prolog_end_addr;
|
||||||
|
|
||||||
|
if (i+20 > stop)
|
||||||
|
break;
|
||||||
|
|
||||||
|
begin_addr = bfd_get_32(abfd, data+i);
|
||||||
|
end_addr = bfd_get_32(abfd, data+i+4);
|
||||||
|
eh_handler = bfd_get_32(abfd, data+i+8);
|
||||||
|
eh_data = bfd_get_32(abfd, data+i+12);
|
||||||
|
prolog_end_addr = bfd_get_32(abfd, data+i+16);
|
||||||
|
|
||||||
|
if (begin_addr == 0)
|
||||||
|
{
|
||||||
|
/* We are probably into the padding of the
|
||||||
|
section now */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf (file,
|
||||||
|
" %04lx\t",
|
||||||
|
(unsigned long int) (i + section->vma));
|
||||||
|
|
||||||
|
fprintf(file, "%08lx %08lx %08lx %08lx %08lx",
|
||||||
|
begin_addr,
|
||||||
|
end_addr,
|
||||||
|
eh_handler,
|
||||||
|
eh_data,
|
||||||
|
prolog_end_addr);
|
||||||
|
|
||||||
|
#ifdef POWERPC_LE_PE
|
||||||
|
if (eh_handler == 0 && eh_data != 0)
|
||||||
|
{
|
||||||
|
/* Special bits here, although the meaning may */
|
||||||
|
/* be a little mysterious. The only one I know */
|
||||||
|
/* for sure is 0x03. */
|
||||||
|
/* Code Significance */
|
||||||
|
/* 0x00 None */
|
||||||
|
/* 0x01 Register Save Millicode */
|
||||||
|
/* 0x02 Register Restore Millicode */
|
||||||
|
/* 0x03 Glue Code Sequence */
|
||||||
|
switch (eh_data)
|
||||||
|
{
|
||||||
|
case 0x01:
|
||||||
|
fprintf(file, " Register save millicode");
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
fprintf(file, " Register restore millicode");
|
||||||
|
break;
|
||||||
|
case 0x03:
|
||||||
|
fprintf(file, " Glue code sequence");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
fprintf(file, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free (data);
|
||||||
|
}
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
pe_print_private_bfd_data (abfd, vfile)
|
pe_print_private_bfd_data (abfd, vfile)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
|
@ -1068,6 +1442,7 @@ pe_print_private_bfd_data (abfd, vfile)
|
||||||
int j;
|
int j;
|
||||||
pe_data_type *pe = pe_data (abfd);
|
pe_data_type *pe = pe_data (abfd);
|
||||||
struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
|
struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
|
||||||
|
|
||||||
fprintf (file,"\nImageBase\t\t");
|
fprintf (file,"\nImageBase\t\t");
|
||||||
fprintf_vma (file, i->ImageBase);
|
fprintf_vma (file, i->ImageBase);
|
||||||
fprintf (file,"\nSectionAlignment\t");
|
fprintf (file,"\nSectionAlignment\t");
|
||||||
|
@ -1097,13 +1472,18 @@ pe_print_private_bfd_data (abfd, vfile)
|
||||||
fprintf (file,"\nLoaderFlags\t\t%08lx\n", i->LoaderFlags);
|
fprintf (file,"\nLoaderFlags\t\t%08lx\n", i->LoaderFlags);
|
||||||
fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes);
|
fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes);
|
||||||
|
|
||||||
|
fprintf (file,"\nThe Data Directory\n");
|
||||||
for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
|
for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
|
||||||
{
|
{
|
||||||
fprintf (file, "Entry %2d ", j);
|
fprintf (file, "Entry %1x ", j);
|
||||||
fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
|
fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
|
||||||
fprintf (file, " %08lx\n", i->DataDirectory[j].Size);
|
fprintf (file, " %08lx ", i->DataDirectory[j].Size);
|
||||||
|
fprintf (file, "%s\n", dir_names[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pe_print_idata(abfd, vfile);
|
||||||
|
pe_print_pdata(abfd, vfile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1158,6 +1538,7 @@ pe_mkobject_hook (abfd, filehdr, aouthdr)
|
||||||
obj_conv_table_size (abfd) =
|
obj_conv_table_size (abfd) =
|
||||||
internal_f->f_nsyms;
|
internal_f->f_nsyms;
|
||||||
|
|
||||||
|
pe->real_flags = internal_f->f_flags;
|
||||||
|
|
||||||
#ifdef COFF_IMAGE_WITH_PE
|
#ifdef COFF_IMAGE_WITH_PE
|
||||||
if (aouthdr)
|
if (aouthdr)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue