* dln.c (rb_w32_check_imported): skip ordinal entries. based on a

patch by phasis68 (Heesob Park) at [ruby-core:44381].
  [ruby-core:44371][Bug #6303]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35354 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2012-04-17 04:11:17 +00:00
Родитель 6655667d73
Коммит dad31f6e50
7 изменённых файлов: 69 добавлений и 6 удалений

Просмотреть файл

@ -1,7 +1,8 @@
Mon Apr 16 21:25:24 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
Tue Apr 17 13:11:14 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* dln.c (rb_w32_check_imported): skip ordinal entries. patched by
phasis68 (Heesob Park) at [ruby-core:44381]. [Bug #6303]
* dln.c (rb_w32_check_imported): skip ordinal entries. based on a
patch by phasis68 (Heesob Park) at [ruby-core:44381].
[ruby-core:44371][Bug #6303]
Mon Apr 16 18:22:14 2012 NARUSE, Yui <naruse@ruby-lang.org>

4
dln.c
Просмотреть файл

@ -1214,7 +1214,7 @@ rb_w32_check_imported(HMODULE ext, HMODULE mine)
while (desc->Name) {
PIMAGE_THUNK_DATA pint = (PIMAGE_THUNK_DATA)((char *)ext + desc->Characteristics);
PIMAGE_THUNK_DATA piat = (PIMAGE_THUNK_DATA)((char *)ext + desc->FirstThunk);
while (piat->u1.Function) {
for (; piat->u1.Function; piat++, pint++) {
static const char prefix[] = "rb_";
PIMAGE_IMPORT_BY_NAME pii;
const char *name;
@ -1226,8 +1226,6 @@ rb_w32_check_imported(HMODULE ext, HMODULE mine)
FARPROC addr = GetProcAddress(mine, name);
if (addr) return (FARPROC)piat->u1.Function == addr;
}
piat++;
pint++;
}
desc++;
}

Просмотреть файл

@ -0,0 +1,17 @@
#include <ruby.h>
extern __declspec(dllimport) void dlntest_ordinal(void);
static VALUE
dln_dlntest(VALUE self)
{
dlntest_ordinal();
return self;
}
void
Init_dln(void)
{
VALUE m = rb_define_module_under(rb_define_module("Bug"), "Win32");
rb_define_module_function(m, "dlntest", dln_dlntest, 0);
}

Просмотреть файл

@ -0,0 +1,28 @@
if /mswin|mingw/ =~ RUBY_PLATFORM
$objs = ["dlntest.o"]
target_prefix = "-test-/win32/"
create_makefile(target_prefix+"dln")
m = File.read("Makefile")
m.sub!(/^OBJS =.*/) {$&+" dlntest.#{$LIBEXT}"}
open("Makefile", "wb") do |mf|
mf.puts m, "\n"
sodir = $extout ? "$(RUBYARCHDIR)/" : ''
mf.print "#{sodir}$(DLLIB): dlntest.#{$LIBEXT}"
mf.puts
mf.puts "dlntest.#{$LIBEXT}: $(topdir)/dlntest.dll"
mf.puts
mf.puts depend_rules("$(topdir)/dlntest.dll: libdlntest.o libdlntest.def")
mf.puts "\t$(ECHO) linking shared-object $(@F)\n"
mf.print "\t-$(Q)$(RM) $@\n"
mf.print "\t-$(Q)$(MAKEDIRS) $(@D)\n" if $extout
link_so = LINK_SO.gsub(/^/, "\t$(Q) ")
link_so.sub!(/\$\(LOCAL_LIBS\)/, '')
link_so.gsub!(/-\$\(arch\)/, '')
link_so.gsub!(/:.so=/, ':.dll=')
link_so.sub!(/\$\(OBJS\)/, "libdlntest.#{$OBJEXT}")
link_so.sub!(/\$\(DEFFILE\)/, "$(srcdir)/libdlntest.def")
mf.puts link_so
mf.puts
end
end

Просмотреть файл

@ -0,0 +1,4 @@
extern __declspec(dllexport) void
dlntest_ordinal(void)
{
}

Просмотреть файл

@ -0,0 +1,2 @@
EXPORTS
dlntest_ordinal @1 NONAME

Просмотреть файл

@ -0,0 +1,13 @@
require 'test/unit'
require_relative '../../ruby/envutil'
module Bug
module Win32
class TestDln < Test::Unit::TestCase
def test_check_imported
bug = '[Bug #6303]'
assert_in_out_err(['-r-test-/win32/dln', '-eexit'], '', [], [], bug, timeout: 10)
end
end
end
end