This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] Silence ld auto-import warnings for pe-i386.
- From: Kai Tietz <ktietz70 at googlemail dot com>
- To: Dave Korn <dave dot korn dot cygwin at googlemail dot com>
- Cc: binutils at sourceware dot org
- Date: Thu, 26 Feb 2009 15:14:43 +0100
- Subject: Re: [PATCH] Silence ld auto-import warnings for pe-i386.
- References: <49A6A10B.4030000@gmail.com>
Hi Dave,
2009/2/26 Dave Korn <dave.korn.cygwin@googlemail.com>:
>
> ? Hi all,
>
> ?PE linkers implement a feature for automatic import of symbols exported from
> DLLs, which is widely used on Win32 platforms (Cygwin, MinGW) in the absence
> of full support for symbol versioning scripts (from which import DEF files
> could be generated) and in light of the fact that an awful lot of DLLs out
> there don't have the exported symbols correctly annotated with dllimport
> attributes in their associated header files.
>
> ?There are two aspects to this behaviour: ld generates a lot of import stubs
> with load-time relocs pointing at them, and (since relocs can't be applied by
> the loader against a read-only section) it selects an alternative linker
> script that outputs all .rdata sections into .data so they can be fixed up at
> runtime by the native windows dynamic loader without SEGVs.
>
> ?This feature can be enabled or disabled by supplying a command-line option,
> but, for historical reasons[*], it has evolved so that the default behaviour
> if no option is supplied is to automtically generate the required import stubs
> and relocs. ?However, in this case, it does not know that it will be
> auto-importing until it starts reading the input BFDs, by which time it is
> already too late to select the alternative linker script. ?This will work OK
> as long as none of the auto-imported symbols are referenced from within the
> .rdata section, but any const data items referencing auto-imported symbols
> will end up in .rdata and blow up at runtime. ?In order to warn the user that
> this switch-on-as-needed mode isn't guaranteed to work, ld currently issues
> the following warning:
>
> ?einfo (_("%P: warning: auto-importing has been activated without
> --enable-auto-import specified on the command line.\n\
> This should work unless it involves constant data structures referencing
> symbols from auto-imported DLLs.\n"));
>
> ?As Cygwin is switching to shared libgcc after having statically linked it
> until now, these once-rare warnings are now becoming increasingly common, and
> although still generally over-cautious, the situation where failures can occur
> is becoming a more and more real problem.
>
> ?Accordingly after much discussion on the cygwin-apps list we've decided that
> the best thing to do for now is to take the minor performance impact that may
> arise from less sharing of R/O data pages between images of the same
> executable in different processes, and just turn the feature fully on by
> default. ?Other PE targets may want to do likewise. ?(Our longer-term plan is
> to resolve the problem by using Kai's v2. runtime pseudo-relocs, which can
> obviate the need to make .rdata writable).
>
> ?The attached patch enables auto-import fully by default, conditioned on
> testing $target in the emultempl script when generating the emulation .c file.
>
> ?Tested natively on i686-pc-cygwin with no regressions and by inspecting
> generted ei386pe.c and by manually running a link command with before and
> after linkers and observing no warning. ?Cross tests running from
> i686-pc-linux-gnu to {arm-epoc-pe, arm-wince-pe, i386-pc-netbsdpe, i386-pc-pe,
> i586-pc-interix, i586-unknown-beospe, i686-pc-cygwin, i686-pc-mingw32,
> mcore-unknown-pe, powerpcle-unknown-pe, sh-unknown-pe, thumb-epoc-pe,
> x86_64-pc-freebsd, x86_64-pc-linux-gnu, x86_64-pc-mingw32}.
>
> ?Assuming all clear, OK for HEAD?
>
>
> ld/ChangeLog
>
> ? ? ? ?* emultempl/pe.em (gld_${EMULATION_NAME}_before_parse): ?Set
> ? ? ? ?default state of auto-import flag based on $target.
>
> ? ?cheers,
> ? ? ?DaveK
>
> [*] ?- See PR linker/4844 for development.
> [**] - See http://www.cygwin.com/ml/cygwin-apps/2009-02/threads.html#00141
>
>
> Index: ld/emultempl/pe.em
> ===================================================================
> RCS file: /cvs/src/src/ld/emultempl/pe.em,v
> retrieving revision 1.144
> diff -p -u -r1.144 pe.em
> --- ld/emultempl/pe.em ?18 Feb 2009 18:23:07 -0000 ? ? ?1.144
> +++ ld/emultempl/pe.em ?26 Feb 2009 13:27:09 -0000
> @@ -145,7 +145,21 @@ gld_${EMULATION_NAME}_before_parse (void
> ?#ifdef DLL_SUPPORT
> ? config.dynamic_link = TRUE;
> ? config.has_shared = 1;
> - ?link_info.pei386_auto_import = -1;
> +EOF
> +
> +# Cygwin no longer wants these noisy warnings. ?Other PE
> +# targets might like to consider adding themselves here.
> +case ${target} in
> + ?*-*-cygwin*)
> + ? ?default_auto_import=1
> + ? ?;;
> + ?*)
> + ? ?default_auto_import=-1
> + ? ?;;
> +esac
> +
> +fragment <<EOF
> + ?link_info.pei386_auto_import = ${default_auto_import};
> ? link_info.pei386_runtime_pseudo_reloc = 1; /* Use by default version 1. ?*/
>
> ?#if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2)
>
>
>
Just to make sure not to miss one important point. At the moment
pe(p)-coff ld - reasoned by the old pseudo-relocator code - makes
.text writable, too. This isn't anymore necessary by using the new
implementation of pseudo-reloc.c. Even for v1, there will be no more
the need to modify section flags for this, because new relocation code
makes sure, that the write permission is granted (and reset
afterwards) while relocation for both variant.
Cheers,
Kai
--
| (\_/) This is Bunny. Copy and paste
| (='.'=) Bunny into your signature to help
| (")_(") him gain world domination