https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112012-07-25T16:37:32ZRuby Issue Tracking SystemRuby master - Bug #6790: mingw-w64: rb_libruby_handle and libruby changes when extensions are loadedhttps://bugs.ruby-lang.org/issues/6790?journal_id=284222012-07-25T16:37:32Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul></ul><p>Seems it occurs only in x64-mingw; and does not occur when loading the DLL by x64-mswin ruby.exe.<br>
Needs more investigation.</p> Ruby master - Bug #6790: mingw-w64: rb_libruby_handle and libruby changes when extensions are loadedhttps://bugs.ruby-lang.org/issues/6790?journal_id=284432012-07-26T05:35:52Zluislavena (Luis Lavena)luislavena@gmail.com
<ul></ul><p>nobu (Nobuyoshi Nakada) wrote:</p>
<blockquote>
<p>Seems it occurs only in x64-mingw; and does not occur when loading the DLL by x64-mswin ruby.exe.<br>
Needs more investigation.</p>
</blockquote>
<p>Do you think this simplification is good enough?</p>
<p><a href="https://github.com/luislavena/experiments/tree/master/dll-handles" class="external">https://github.com/luislavena/experiments/tree/master/dll-handles</a></p>
<p>DllMain is only invoked once on this example, which might indicate something going on on Ruby.</p>
<p>After a GDB session, seems that dln.c line 1271 (LoadLibrary) is causing x64-msvcrt-ruby200.dll be loaded again.</p>
<p>Will keep investigating on this.</p> Ruby master - Bug #6790: mingw-w64: rb_libruby_handle and libruby changes when extensions are loadedhttps://bugs.ruby-lang.org/issues/6790?journal_id=284612012-07-27T00:13:23Zphasis68 (Heesob Park)phasis@gmail.com
<ul></ul><p>After some investigating, I found this bug is due to exporting "DllMain" symbol of x64-msvcrt-ruby200.dll.</p>
<p>You can see the following line in the x64-msvcrt-ruby200.def.</p>
<p>VERSION 2.0<br>
EXPORTS<br>
DllMain<br>
FD_CLR=rb_w32_fdclr<br>
FD_ISSET=rb_w32_fdisset<br>
...</p>
<p>I think that DllMain should not be exported.</p>
<p>Here is a simple workaround for win32/mkexports.rb</p>
<p>diff --git a/mkexports.rb b/mkexports.rb.new<br>
index 3a1a91a..9dc8a19 100644<br>
--- a/mkexports.rb<br>
+++ b/mkexports.rb.new<br>
@@ -38,6 +38,7 @@ class Exports<br>
winapis = {}<br>
syms["ruby_sysinit_real"] = "ruby_sysinit"<br>
each_export(objs) do |internal, export|</p>
<ul>
<li>
<pre><code> next if internal == 'DllMain'
syms[internal] = export
winapis[$1] = internal if /^_?(rb_w32_\w+)(?:@\d+)?$/ =~ internal
</code></pre>
end</li>
</ul>
<p>With the patched and rebuilt version, I confirmed this bug is solved.</p> Ruby master - Bug #6790: mingw-w64: rb_libruby_handle and libruby changes when extensions are loadedhttps://bugs.ruby-lang.org/issues/6790?journal_id=284682012-07-27T11:28:31Zusa (Usaku NAKAMURA)usa@garbagecollect.jp
<ul></ul><p>=begin<br>
Hmm, I see.</p>
<p>Is this patch OK?</p>
<a name="Index-win32mkexportsrb"></a>
<h1 >Index: win32/mkexports.rb<a href="#Index-win32mkexportsrb" class="wiki-anchor">¶</a></h1>
<p>--- win32/mkexports.rb (revision 36541)<br>
+++ win32/mkexports.rb (working copy)<br>
@@ -116,7 +116,7 @@ class Exports::Mswin < Exports<br>
is_data = !$1<br>
if noprefix or /^[@_]/ =~ l<br>
next if /(?!^)@.*@/ =~ l || /@[[:xdigit:]]{8,16}$/ =~ l ||</p>
<ul>
<li>
<pre><code> /^_(?:Init_|.*_threadptr_|DllMain@)/ =~ l
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> /^_?(?:Init_|.*_threadptr_|DllMain\b)/ =~ l
</code></pre>
</li>
</ul>
<p>l.sub!(/^[@_]/, '') if /@\d+$/ !~ l<br>
elsif !l.sub!(/^(\S+) ([^@?\`\']*)$/, '\1')<br>
next<br>
@@ -150,7 +150,7 @@ class Exports::Cygwin < Exports<br>
def each_export(objs)<br>
symprefix = RbConfig::CONFIG["SYMBOL_PREFIX"]<br>
symprefix.strip! if symprefix</p>
<ul>
<li>re = /\s(?:(T)|[[:upper:]])\s#{symprefix}((?!Init_|.<em><em>threadptr</em>|DllMain@).</em>)$/</li>
</ul>
<ul>
<li>re = /\s(?:(T)|[[:upper:]])\s#{symprefix}((?!Init_|.<em><em>threadptr</em>|DllMain\b).</em>)$/<br>
objdump(objs) do |l|<br>
next if /@.*@/ =~ l<br>
yield $2, !$1 if re =~ l</li>
</ul>
<p>=end</p> Ruby master - Bug #6790: mingw-w64: rb_libruby_handle and libruby changes when extensions are loadedhttps://bugs.ruby-lang.org/issues/6790?journal_id=284692012-07-27T12:15:15Zusa (Usaku NAKAMURA)usa@garbagecollect.jp
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>This issue was solved with changeset r36544.<br>
Luis, thank you for reporting this issue.<br>
Your contribution to Ruby is greatly appreciated.<br>
May Ruby be with you.</p>
<hr>
<ul>
<li>win32/mkexports.rb: should not export DllMain().<br>
reported by luis at <a href="/issues/6790">[ruby-core:46743]</a> [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: mingw-w64: rb_libruby_handle and libruby changes when extensions are loaded (Closed)" href="https://bugs.ruby-lang.org/issues/6790">#6790</a>], solved by<br>
Heesob Park, and confirmed by nobu.</li>
</ul> Ruby master - Bug #6790: mingw-w64: rb_libruby_handle and libruby changes when extensions are loadedhttps://bugs.ruby-lang.org/issues/6790?journal_id=284882012-07-27T22:55:20Zluislavena (Luis Lavena)luislavena@gmail.com
<ul></ul><p>Thank you Heesob Park, Usaku Nakamura and Nobu for fixing this!</p>