diff options
author | DJ Delorie <dj@redhat.com> | 2000-10-10 03:28:01 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2000-10-10 03:28:01 +0000 |
commit | 23a87948dded8c5a7b832e3f5f86dbdd442e7053 (patch) | |
tree | 5d7820a10987d8aa3fb810bfe1af758f8b44a284 /ld/pe-dll.c | |
parent | f3b6f7c34d3b6d5024a66ab4e35d115c1c207bec (diff) | |
download | gdb-23a87948dded8c5a7b832e3f5f86dbdd442e7053.zip gdb-23a87948dded8c5a7b832e3f5f86dbdd442e7053.tar.gz gdb-23a87948dded8c5a7b832e3f5f86dbdd442e7053.tar.bz2 |
* pe-dll.c (make_one): Do not generate code thunk for DATA
exports.
(process_def_file): deduce DATA flag for auto-export sumbols.
Diffstat (limited to 'ld/pe-dll.c')
-rw-r--r-- | ld/pe-dll.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/ld/pe-dll.c b/ld/pe-dll.c index da3bd9f..2553327 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -310,7 +310,12 @@ process_def_file (abfd, info) if (*sn == '_') sn++; if (auto_export (pe_def_file, sn)) - def_file_add_export (pe_def_file, sn, 0, -1); + { + def_file_export *p; + p=def_file_add_export (pe_def_file, sn, 0, -1); + /* Fill data flag properly, from dlltool.c */ + p->flag_data = !(symbols[j]->flags & BSF_FUNCTION); + } } } } @@ -1405,7 +1410,7 @@ make_one (exp, parent) bfd *parent; { asection *tx, *id7, *id5, *id4, *id6; - unsigned char *td, *d7, *d5, *d4, *d6 = NULL; + unsigned char *td = NULL, *d7, *d5, *d4, *d6 = NULL; int len; char *oname; bfd *abfd; @@ -1454,25 +1459,28 @@ make_one (exp, parent) quick_symbol (abfd, U ("__imp_"), exp->internal_name, "", id5, BSF_GLOBAL, 0); - bfd_set_section_size (abfd, tx, jmp_byte_count); - td = (unsigned char *) xmalloc (jmp_byte_count); - tx->contents = td; - memcpy (td, jmp_bytes, jmp_byte_count); - switch (pe_details->pe_arch) - { - case PE_ARCH_i386: - quick_reloc (abfd, 2, BFD_RELOC_32, 2); - break; - case PE_ARCH_sh: - quick_reloc (abfd, 8, BFD_RELOC_32, 2); - break; - case PE_ARCH_mips: - quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2); - quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */ - quick_reloc (abfd, 4, BFD_RELOC_LO16, 2); - break; - } - save_relocs (tx); + if (! exp->flag_data) + { + bfd_set_section_size (abfd, tx, jmp_byte_count); + td = (unsigned char *) xmalloc (jmp_byte_count); + tx->contents = td; + memcpy (td, jmp_bytes, jmp_byte_count); + switch (pe_details->pe_arch) + { + case PE_ARCH_i386: + quick_reloc (abfd, 2, BFD_RELOC_32, 2); + break; + case PE_ARCH_sh: + quick_reloc (abfd, 8, BFD_RELOC_32, 2); + break; + case PE_ARCH_mips: + quick_reloc (abfd, 0, BFD_RELOC_HI16_S, 2); + quick_reloc (abfd, 0, BFD_RELOC_LO16, 0); /* MIPS_R_PAIR */ + quick_reloc (abfd, 4, BFD_RELOC_LO16, 2); + break; + } + save_relocs (tx); + } bfd_set_section_size (abfd, id7, 4); d7 = (unsigned char *) xmalloc (4); |