Bug #6498

Cygwin needs $(DEFFILE) for extension libraries.

Added by koba (Shinji Kobayashi) almost 8 years ago. Updated almost 8 years ago.

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
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
/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
/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.


cygwin-deffile.patch (745 Bytes) cygwin-deffile.patch A possible patch koba (Shinji Kobayashi), 05/26/2012 10:28 AM
atk-gem_make.out (67.6 KB) atk-gem_make.out Error log (gem_make.out) koba (Shinji Kobayashi), 05/26/2012 10:28 AM

Updated by mame (Yusuke Endoh) almost 8 years ago

  • Status changed from Open to Assigned
  • Assignee set to nobu (Nobuyoshi Nakada)

Looks acceptable to me because the proposed patch affects just cygwin.
(Note that cygwin is not supported now)

Nobu, what do you think?

Yusuke Endoh

Updated by nobu (Nobuyoshi Nakada) almost 8 years ago

  • Status changed from Assigned to Rejected

It makes no sense.

Symbols defined by dynamically loaded library cannot be visible from another dynamically loaded library on all platforms.

Updated by koba (Shinji Kobayashi) almost 8 years ago

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 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 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 (, 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?

Also available in: Atom PDF