Issue #16117 has been updated by whdukewu (Kewu DU).


Problem solved:
the dll i used compiled by MinGW, the dll need libstdc++-6.dll, after I add **-static-libgcc -static-libstdc++** compile flag to the dll, problem solved!

----------------------------------------
Bug #16117: ruby2.6.3(x86) use fiddle faild to load dll in windows7
https://bugs.ruby-lang.org/issues/16117#change-80934

* Author: whdukewu (Kewu DU)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.3p62 (2019-04-16 revision 67580) [i386-mingw32]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
I have a dll build by MinGW32 in windows7, in ruby2.2, I could use fiddle dlload this dll success, but in the same system, use 2.6.3 failed to dlload this dll, always report No such file or direcoty.

**///////// Ruby2.2 success load the dll and call function in dll /////////**

```text
F:\TOOLCODE\coreclr_win\Navigator2-linux\src\ProtocolHost\HostTest\ruby\Mml>C:\TestTools\impeller\lib\Ruby\bin\ruby -v
ruby 2.2.6p396 (2016-11-15 revision 56800) [i386-mingw32]

F:\TOOLCODE\coreclr_win\Navigator2-linux\src\ProtocolHost\HostTest\ruby\Mml>C:\TestTools\impeller\lib\Ruby\bin\ruby testmml_win.rb F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\
Demo for invoke C# code from ruby...
F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\
F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\libhostprotocol.dll
Load CoreCLR from F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\ success
CoreCLR Started success.

F:\TOOLCODE\coreclr_win\Navigator2-linux\src\ProtocolHost\HostTest\ruby\Mml>
```

**///////// Ruby2.6.3 success load the dll and call function in dll /////////**

```text
F:\TOOLCODE\coreclr_win\Navigator2-linux\src\ProtocolHost\HostTest\ruby\Mml>ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [i386-mingw32]

F:\TOOLCODE\coreclr_win\Navigator2-linux\src\ProtocolHost\HostTest\ruby\Mml>ruby testmml_win.rb F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x
86\publish\
Demo for invoke C# code from ruby...
F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\
F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\libhostprotocol.dll
Traceback (most recent call last):
        7: from testmml_win.rb:24:in `<main>'
        6: from testmml_win.rb:26:in `<module:ProtocolTest>'
        5: from C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:77:in `dlload'
        4: from C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:77:in `collect'
        3: from C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:87:in `block in dlload'
        2: from C:/Ruby26/lib/ruby/2.6.0/fiddle.rb:47:in `dlopen'
        1: from C:/Ruby26/lib/ruby/2.6.0/fiddle.rb:47:in `new'
C:/Ruby26/lib/ruby/2.6.0/fiddle.rb:47:in `initialize': No such file or directory (Fiddle::DLError)
        5: from testmml_win.rb:24:in `<main>'
        4: from testmml_win.rb:26:in `<module:ProtocolTest>'
        3: from C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:77:in `dlload'
        2: from C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:77:in `collect'
        1: from C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:86:in `block in dlload'
C:/Ruby26/lib/ruby/2.6.0/fiddle/import.rb:89:in `rescue in block in dlload': can't load F:\TOOLCODE\coreclr_win\Navigator2-linux\src\CSharpAdapter\CSharpAdapter\bin\Release\netcoreapp3.0\win-x86\publish\libhostprotocol.dll (Fiddle::DLError)

F:\TOOLCODE\coreclr_win\Navigator2-linux\src\ProtocolHost\HostTest\ruby\Mml>
```

**the same testmml_win.rb in the same system, ruby2.2 works, ruby2.6.3 failed!**

**below is the test ruby code:**

```ruby
require 'fiddle'
require 'fiddle/import'


if ARGV.length < 1
   puts "Missing libPath argument..."
   puts "Usage:  ruby HostTest2.rb libPath"
   puts "Sample: ruby HostTest2.rb /home/ProtocolAdapter/output"
   exit
end   

puts "Demo for invoke C# code from ruby..."


String libPath = ARGV[0]
if libPath[libPath.length - 1] != '\\'
    libPath = libPath + '\\'
end
puts libPath
$libCoreCLR_so_path = libPath + "libhostprotocol.dll"
puts $libCoreCLR_so_path


module ProtocolTest
    extend Fiddle::Importer
    dlload $libCoreCLR_so_path
	
    extern 'void Init(const char* libPath)'
end

ProtocolTest.Init(libPath);
```



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>