binutils: dlltool DATA exports incompatible with auto-import

View: New views
2 Messages — Rating Filter:   Alert me  

binutils: dlltool DATA exports incompatible with auto-import

by Yaakov (Cygwin/X) :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

GNOME Evolution contains several interdependent libraries, so on
Cygwin/MinGW the build creates artificial import libraries with dlltool
from .def files.  While trying to build 2.28 I came across a possible
incompatibility between the implib generated by dlltool and auto-import
linkage:

$ gcc -shared -Wl,--out-implib,libtest.dll.a -o cygtest.dll libtest.c
Creating library file: libtest.dll.a

$ nm libtest.dll.a | grep -v ' [bdit] '

d000003.o:
00000000 I _cygtest_dll_iname

d000000.o:
00000000 I __head_cygtest_dll
          U _cygtest_dll_iname

d000002.o:
          U __head_cygtest_dll
00000000 I __imp__test_func
00000000 T _test_func

d000001.o:
          U __head_cygtest_dll
00000000 I __imp__test_data
00000000 I __nm__test_data

$ gcc -o test.exe test.c libtest.dll.a

# now let's try with dlltool
$ dlltool --dllname cygtest.dll --input-def libtest.def --output-lib
libtest.dll.a

$ nm libtest.dll.a | grep -v ' [bdit] '

deobt.o:
00000000 I __libtest_dll_a_iname

deobh.o:
00000000 I __head_libtest_dll_a
          U __libtest_dll_a_iname

deobs00001.o:
          U __head_libtest_dll_a
00000000 I __imp__test_func
00000000 T _test_func

deobs00000.o:
          U __head_libtest_dll_a
00000000 I __imp__test_data
# Note no __nm__test_data auto-import here

$ gcc -o test.exe test.c libtest.dll.a
fu000001.o:(.idata$2+0xc): undefined reference to `_libtest_dll_a_iname'
nmth000000.o:(.idata$4+0x0): undefined reference to `__nm__test_data'
collect2: ld returned 1 exit status


Yaakov

__declspec(dllexport) int test_data = 42;
__declspec(dllexport) int test_func(void) { return test_data; }

EXPORTS
test_func
test_data DATA

extern int test_data;
extern int test_func(void);

int
main(void) {
        int foo = test_data;
        test_func();
        return 0;
}


--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

Re: binutils: dlltool DATA exports incompatible with auto-import

by Dave Korn-6 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Yaakov (Cygwin/X) wrote:

>   While trying to build 2.28 I came across a possible
> incompatibility between the implib generated by dlltool and auto-import
> linkage:

  Thanks for the STC.  I'm pretty sure this is a real binutils bug, Kai and I
were discussing the amount of overlapping code between ld and dlltool just the
other day and it's no surprise that something has become inconsistent over the
years.  I'll use your testcase to generate a patch over on the binutils list
sometime in the next week.

    cheers,
      DaveK

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple