Hi,

If source files use __attribute__ ((dllexport)) to export symbols, the
result DLL looks fine.

But if not use __attribute__ ((dllexport)), the result DLL will export
an extra symbol
'InterlockedCompareExchange@12'. I had checked the compiled and link
files, do not know why.

------------------- use __attribute__ ((dllexport)) -------------------
$ cat << EOF > t-dll.c
__attribute__ ((dllexport))
int get_int()
{
return 1;
}
EOF

$ i686-w64-mingw32-gcc -c -o t-dll.o t-dll.c
$ i686-w64-mingw32-objdump -s t-dll.o | grep -A 5 "Contents of section
.drectve"

Contents of section .drectve:
0000 202d6578 706f7274 3a226765 745f696e -export:"get_in
0010 74220000 t"..

$ i686-w64-mingw32-gcc -shared -o t-dll.dll t-dll.o
$ i686-w64-mingw32-objdump -x t-dll.dll | grep -A 20 "The Export Tables"

The Export Tables (interpreted .edata section contents)

Export Flags 0
Time/Date stamp 51d43aff
Major/Minor 0/0
Name 0000a032 t-dll.dll
Ordinal Base 1
Number in:
Export Address Table 00000001
[Name Pointer/Ordinal] Table 00000001
Table Addresses
Export Address Table 0000a028
Name Pointer Table 0000a02c
Ordinal Table 0000a030

Export Address Table -- Ordinal Base 1
[ 0] +base[ 1] 14d0 Export RVA

[Ordinal/Name Pointer] Table
[ 0] get_int

Looks good !

------------------- without __attribute__ ((dllexport)) -------------------
$ cat << EOF > t-dll2.c
int get_int()
{
return 1;
}
EOF

$ i686-w64-mingw32-gcc -c -o t-dll2.o t-dll2.c
$ i686-w64-mingw32-objdump -s t-dll2.o | grep -A 5 "Contents of section"
Contents of section .text:
0000 5589e5b8 01000000 5dc39090 U.......]...
Contents of section .rdata$zzz:
0000 4743433a 2028474e 55292034 2e382e32 GCC: (GNU) 4.8.2
0010 20323031 33303730 33202870 72657265 20130703 (prere
0020 6c656173 65290000 lease)..

<<< no section .drectve >>>

$ i686-w64-mingw32-gcc -shared -o t-dll2.dll t-dll2.o
$ i686-w64-mingw32-objdump -x t-dll2.dll | grep -A 22 "The Export Tables"

The Export Tables (interpreted .edata section contents)

Export Flags 0
Time/Date stamp 51d4440b
Major/Minor 0/0
Name 0000a03c t-dll2.dll
Ordinal Base 1
Number in:
Export Address Table 00000002
[Name Pointer/Ordinal] Table 00000002
Table Addresses
Export Address Table 0000a028
Name Pointer Table 0000a030
Ordinal Table 0000a038

Export Address Table -- Ordinal Base 1
[ 0] +base[ 1] 6f50 Export RVA
[ 1] +base[ 2] 14d0 Export RVA

[Ordinal/Name Pointer] Table
[ 0] InterlockedCompareExchange@12
[ 1] get_int

What happened ? Why we have an extra export
"InterlockedCompareExchange@12" ?
Let's check the link details:


cauchy@CRM-SYSLOG:/tmp$ i686-w64-mingw32-gcc -v -shared -o t-dll2.dll
t-dll2.o
Using built-in specs.
COLLECT_GCC=i686-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/home/cauchy/cross/i686-windows-gcc48/libexec/gcc/i686-w64-mingw32/4.8.2/lto-wrapper
Target: i686-w64-mingw32
Configured with:
/home/cauchy/vcs/svn/gcc/branches/gcc-4_8-branch/configure
--prefix=/home/cauchy/cross/i686-windows-gcc48
--with-sysroot=/home/cauchy/cross/i686-windows-gcc48
--build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu
--target=i686-w64-mingw32 --disable-multilib --disable-nls
--enable-checking=release --enable-languages=c,c++,fortran
--with-arch=i686 --with-tune=generic
Thread model: win32
gcc version 4.8.2 20130703 (prerelease) (GCC)
COMPILER_PATH=/home/cauchy/cross/i686-windows-gcc48/libexec/gcc/i686-w64-mingw32/4.8.2/:/home/cauchy/cross/i686-windows-gcc48/libexec/gcc/i686-w64-mingw32/4.8.2/:/home/cauchy/cross/i686-windows-gcc48/libexec/gcc/i686-w64-mingw32/:/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/:/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/:/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/
LIBRARY_PATH=/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/:/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/lib/../lib/:/home/cauchy/cross/i686-windows-gcc48/mingw/lib/../lib/:/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/lib/:/home/cauchy/cross/i686-windows-gcc48/mingw/lib/
COLLECT_GCC_OPTIONS='-v' '-shared' '-o' 't-dll2.dll' '-mtune=generic'
'-march=i686'
/home/cauchy/cross/i686-windows-gcc48/libexec/gcc/i686-w64-mingw32/4.8.2/collect2
--sysroot=/home/cauchy/cross/i686-windows-gcc48 -m i386pe --shared
-Bdynamic -e _DllMainCRTStartup@12 --enable-auto-image-base -o
t-dll2.dll
/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/lib/../lib/dllcrt2.o
/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/crtbegin.o
-L/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2
-L/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/lib/../lib
-L/home/cauchy/cross/i686-windows-gcc48/mingw/lib/../lib
-L/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/lib
-L/home/cauchy/cross/i686-windows-gcc48/mingw/lib t-dll2.o -lmingw32
-lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32
-luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex
-lmsvcrt
/home/cauchy/cross/i686-windows-gcc48/lib/gcc/i686-w64-mingw32/4.8.2/crtend.o

OK, let's check dllcrt2.o, crtbegin.o, t-empty.o, crtend.o, and these libs:
-lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32
-lshell32 -luser32 -lkernel32

$ i686-w64-mingw32-objdump -s i686-w64-mingw32/lib/dllcrt2.o | grep -A 5
"Contents of section .drectve"
$ i686-w64-mingw32-objdump -s lib/gcc/i686-w64-mingw32/4.8.2/crtbegin.o
| grep -A 5 "Contents of section .drectve"
$ i686-w64-mingw32-objdump -s lib/gcc/i686-w64-mingw32/4.8.2/crtend.o |
grep -A 5 "Contents of section .drectve"
...
$ i686-w64-mingw32-objdump -s i686-w64-mingw32/lib/libkernel32.a | grep
-A 5 "Contents of section .drectve"

No one export "InterlockedCompareExchange@12", where does it come from ?

Regards,
Dongsheng




Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to