This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: PATCH: allow PE executables to have an export table
- From: Charles Wilson <cwilson at ece dot gatech dot edu>
- To: binutils at sources dot redhat dot com
- Date: Fri, 03 Jan 2003 07:07:31 -0500
- Subject: Re: PATCH: allow PE executables to have an export table
Tested on cygwin, works as advertised. Updated patch attached (to apply
cleanly to current CVS, and hopefully address the formatting issues).
Also, I found that there is a symbol that appears in .exe's that
auto-export picks up on, but shouldn't. So, this patch adds
'cygwin_crt0' to the list of exclusions.
--Chuck
2002-12-10 Fabrizio Gennari <fabrizio.ge@tiscalinet.it>
* ld/pe-dll.c (process_def_file): don't create an export
section if there are no exports and we're building an exe
(pe_dll_build_sections): ditto
(pe_dll_fill_sections): since this now gets called
even when we're building an exe, conditionalize setting
abfd->dll true on info->shared
* ld/emultempl/pe.em (gld_${EMULATION_NAME}_after_open):
if i386pe or armpe, call pe_dll_build_section()
for both exe's and dll's, not just dll's.
(gld_${EMULATION_NAME}_finish): for all targets except
shpe and mipspe, call pe_dll_fill_sections() for both
exe's and dll's, not just dll's.
2003-01-03 Charles Wilson <cwilson@ece.gatech.edu>
* ld/pe-dll.c (autofilter_symbollist): add cygwin_crt0
Index: pe-dll.c
===================================================================
RCS file: /cvs/src/src/ld/pe-dll.c,v
retrieving revision 1.52
diff -u -u -r1.52 pe-dll.c
--- pe-dll.c 2 Jan 2003 10:26:41 -0000 1.52
+++ pe-dll.c 3 Jan 2003 11:50:21 -0000
@@ -225,6 +225,7 @@
{ "impure_ptr", 10 },
{ "_pei386_runtime_relocator", 25 },
{ "do_pseudo_reloc", 15 },
+ { "cygwin_crt0", 11 },
{ NULL, 0 }
};
@@ -563,6 +564,12 @@
}
}
+ /* If we are not building a DLL, when there are no exports
+ * we do not build an export table at all */
+
+ if (!pe_dll_export_everything && pe_def_file->num_exports == 0 && !(info->shared))
+ return;
+
/* Now, maybe export everything else the default way. */
if (pe_dll_export_everything || pe_def_file->num_exports == 0)
{
@@ -2655,6 +2662,9 @@
pe_dll_id_target (bfd_get_target (abfd));
process_def_file (abfd, info);
+ if (pe_def_file->num_exports == 0 && !(info->shared))
+ return;
+
generate_edata (abfd, info);
build_filler_bfd (1);
}
@@ -2696,7 +2706,8 @@
fill_edata (abfd, info);
- pe_data (abfd)->dll = 1;
+ if (info->shared)
+ pe_data (abfd)->dll = 1;
edata_s->contents = edata_d;
reloc_s->contents = reloc_d;
Index: emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.74
diff -u -u -r1.74 pe.em
--- emultempl/pe.em 17 Dec 2002 12:16:38 -0000 1.74
+++ emultempl/pe.em 3 Jan 2003 11:52:04 -0000
@@ -1022,8 +1022,11 @@
pe_process_import_defs (output_bfd, & link_info);
pe_find_data_imports ();
-
+#ifndef TARGET_IS_i386pe
+#ifndef TARGET_IS_armpe
if (link_info.shared)
+#endif
+#endif
pe_dll_build_sections (output_bfd, &link_info);
#ifndef TARGET_IS_i386pe
@@ -1460,7 +1463,11 @@
#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) */
#ifdef DLL_SUPPORT
- if (link_info.shared)
+ if (link_info.shared
+#if !defined(TARGET_IS_shpe) && !defined(TARGET_IS_mipspe)
+ || pe_def_file->num_exports != 0
+#endif
+ )
{
pe_dll_fill_sections (output_bfd, &link_info);
if (pe_implib_filename)