!RE: [PATCH] gcc3/ld patch for direct-linking-to-dll and
Ralf.Habacker at freenet.de
Mon Sep 8 09:18:50 CEST 2003
> > From: Nick Clifton <nickc at redhat dot com>
> > Hi Ralf,
> > > while compiling trolltechs qt/xfree library with gcc3 (3.2x) on
> > > cygwin I recognized, that the auto-import stuff in combination of
> > > recent ld does not work in case of const variables in a dll when
> > > using direct linking to a dll, because gcc put those variables into
> > > a readonly, that means the .text section.
> > >
> > > The patch and a testcase is appended. A documentation could be found
> > > in the patch file.
> > Are you sure that the current linker does not work ?
> > When I tried it, using the test case you supplied, but without the
> > patch applied, I got this:
> > % make
> > ../gcc/g++ -B ../gcc/ -g -save-temps -c -o dll.o dll.cc
> > ../gcc/g++ -B ../gcc/ -g --shared -L ../i686-pc-cygwin/newlib -L
> ../i686-pc-cygwin/libstdc++-v3/src/.libs dll.o -o dll.dll
> > ../gcc/g++ -B ../gcc/ -g -save-temps -c -o client.o client.cc
> > ../gcc/g++ -B ../gcc/ -g -o client client.o -L
> ../i686-pc-cygwin/newlib -L
> ../i686-pc-cygwin/libstdc++-v3/src/.libs -L. -ldll
> > Info: resolving _var by linking to __imp__var (auto-import)
> > Info: resolving test::var by linking to __imp___ZN4test3varE
There must be four auto imported vars.
> Yes, but try running ./client.exe. Since the const data variables are
> in .text section they are treated as functions, not data. They are
> imported without warning, but not as data.
> Ralf, what about a less intrusive approach? Compile dll
> code with -fdata-sections. This will put const data in
> .rdata$foo sections. Then, make pe_implied_import_dll()
> scan .rdata as well as .data and .bss. for data symbols
> I've tried that with your testcase and it seems to work.
What gcc release you are using ? It seems that gcc3.2 (which is the recent
cygwin release) does not support this. (See the ! below)
Are there any other gcc options to archive this ?
$ gcc --version
gcc (GCC) 3.2 20020927 (prerelease)
g++ -save-temps -fdata-sections -c -o dll.o dll.cc
$ less dll.s
! .section .text$constvar,""
! .section .text$_ZZ4funcvE14staticconstvar,""
.def __Z4funcv; .scl 2; .type 32; .endef
movl %esp, %ebp
subl $4, %esp
movl $3, -4(%ebp)
movl $1, %eax
! .section .text$_ZN4test14staticconstvarE,""
More information about the kde-cygwin