From: "koba (Shinji Kobayashi)" Date: 2012-05-29T22:44:35+09:00 Subject: [ruby-core:45305] [ruby-trunk - Bug #6498] Cygwin needs $(DEFFILE) for extension libraries. Issue #6498 has been updated by koba (Shinji Kobayashi). nobu-san, I'm not sure if I fully understand what you said, but this is an issue of linking a static import library into a DLL. Please let me clarify. The command line which fails looks like this: gcc -shared -o atk.so atkobj.o -Wl,--enable-auto-image-base,--enable-auto-import -Wl,--out-implib=libruby-atk.a -lruby191 -lruby-glib2 -latk-1.0 -lglib-2.0 It fails with undefined references of symbols which are expected to be in the static import library "libruby-glib2.a" created by the command like follows: gcc -shared -o glib2.so glib2obj.o -Wl,--enable-auto-image-base,--enable-auto-import -Wl,--out-implib=libruby-glib2.a -lruby191 -lglib-2.0 The issue is that the symbols are not visible in the static import library "libruby-glib2.a". This issue is caused by both Windows specific GNU ld behavior and the way glib2 is written. According to the GNU ld documentation (http://sourceware.org/binutils/docs-2.22/ld/WIN32.html), it exports all non-local symbols in DLL by default. However, if some symbols are explicitly exported using a DEF file or __declspec(dllexport) attributes, the other symbols are not exported. glib2 uses both a DEF file and __declspec(dllexport) attributes, but current Ruby 1.9 extconf.rb for Cygwin does not include the DEF file in the build process. As a result, the symbols listed in the DEF file are not exported, and it leads to undefined references explained above. There are some ways to cope with this issue: (1) Change glib2 coding. (2) Specify "--export-all-symbols" when linking an DLL. (3) Include the DEF file when linking an DLL. Method (2) is adopted for Ruby 1.8.x and Ruby 1.9.1. "--export-all" was removed by Revision 21685 for both Cygwin and MinGW. Method (3) is introduced by Revision 26467 for MinGW, but not for Cygwin. So, adopting the method (3) for Cygwin seemed to be reasonable for me. Is there any reason for the method (3) was introduced only for MinGW? ---------------------------------------- Bug #6498: Cygwin needs $(DEFFILE) for extension libraries. https://bugs.ruby-lang.org/issues/6498#change-26887 Author: koba (Shinji Kobayashi) Status: Rejected Priority: Normal Assignee: nobu (Nobuyoshi Nakada) Category: build Target version: ruby -v: ruby 1.9.3p231 (2012-05-25 revision 35794) [i386-cygwin] It seems that Bug #2684 is also valid for Cygwin. For example, "gem install glib2 atk" fails with many undefined references: ... linking shared-object atk.so Creating library file: libruby-atk.arbatkaction.o: In function `rg_set_description': /usr/local/lib/ruby/gems/1.9.1/gems/atk-1.1.3/ext/atk/rbatkaction.c:68: undefined reference to `_rbg_rval2cstr' /usr/local/lib/ruby/gems/1.9.1/gems/atk-1.1.3/ext/atk/rbatkaction.c:68: undefined reference to `_rbgobj_instance_from_ruby_object' rbatkaction.o: In function `rg_get_keybinding': /usr/local/lib/ruby/gems/1.9.1/gems/atk-1.1.3/ext/atk/rbatkaction.c:62: undefined reference to `_rbgobj_instance_from_ruby_object' ... Cygwin version: CYGWIN_NT-6.1-WOW64 nodename 1.7.15(0.260/5/3) 2012-05-09 10:25 i686 Cygwin Ruby configuration: CPPFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib ../ruby/configure --enable-shared --program-suffix=1.9 A possible patch and the error log is attached. -- http://bugs.ruby-lang.org/