From: smeet@... Date: 1999-05-20T14:17:32+09:00 Subject: [ruby-dev:6925] Re: Ruby on Win32 ----Next_Part(Thu_May_20_14:16:43_1999_809)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit this is smeet. しろうとなもので、よくわからないのに、 1.2.5 の cygwin32 用の ext 以下の dllを作る ところの patch を作りました。 dll はできたのですが、 require すると tk.rb:7: [BUG] Segmentation fault になってしまいます。 dll の entry がまずいんでしょうね。 役には、たたないと思いますけど、 cygwin32_ld.rb の 変更点を添付しておきます。 # win32 て、ぼくも触りたくないんですけど、 # お仕事で、泣くなくいじっております。 --smeet ----Next_Part(Thu_May_20_14:16:43_1999_809)-- Content-Type: Text/Plain; charset=us-ascii Content-Disposition: attachment; filename="ruby-b20.diff" Content-Transfer-Encoding: 7bit diff -urN ruby-1.2.5/ext/cygwin32_ld.rb ruby-1.2.5-cygwinb20/ext/cygwin32_ld.rb --- ruby-1.2.5/ext/cygwin32_ld.rb Wed Feb 18 18:22:24 1998 +++ ruby-1.2.5-cygwinb20/ext/cygwin32_ld.rb Wed May 19 21:34:16 1999 @@ -5,6 +5,8 @@ args = ARGV.join(" ") objs = [] +libs = [] +libdir = [] flags = [] libname = '' Init = "../init" @@ -15,20 +17,37 @@ out = open("#{Init}.c", "w") out.print %q@ +#define WIN32_LEAN_AND_MEAN #include +#undef WIN32_LEAN_AND_MEAN #include -extern struct _reent *__imp_reent_data; -WINAPI dll_entry(int a, int b, int c) +BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, + LPVOID reserved /* Not used. */ ); + +BOOL APIENTRY +DllMain ( + HINSTANCE hInst /* Library instance handle. */ , + DWORD reason /* Reason this function is being called. */ , + LPVOID reserved /* Not used. */ ) { - _impure_ptr =__imp_reent_data; - return 1; + + switch (reason) + { + case DLL_PROCESS_ATTACH: + break; + + case DLL_PROCESS_DETACH: + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + } + return TRUE; } -main(){} -//void impure_setup(struct _reent *_impure_ptrMain) -//{ -// _impure_ptr =__imp_reent_data; -//} @ out.close end @@ -49,6 +68,10 @@ case arg when /\.[oa]$/i objs.push(arg) + when /-l(\w+)/i + libs.push(arg) + when /^-L\//i + libdir.push(arg) when /-o/, /\w+\.dll/i ; else @@ -68,20 +91,11 @@ xsystem "nm --extern-only " + objs.join(" ") + " | sed -n '/^........ [CDT] _/s///p' >> #{libname}.def" - command = "gcc -nostdlib -o junk.o -Wl,--base-file,#{libname}.base,--dll " + - objs.join(" ") + " #{Init}.o " - command.concat(flags.join(" ") + - " -Wl,-e,_dll_entry@12 -lcygwin -lkernel32 #{CONFIG['srcdir']}/libruby.a") - xsystem command - - command = "dlltool --as=as --dllname #{libname}.dll --def #{libname}.def --base-file #{libname}.base --output-exp #{libname}.exp" + command = "dllwrap -o #{libname}.dll --def #{libname}.def " + + objs.join(" ") + " #{Init}.o " + libdir.join(" ") + " " + libs.join(" ") + + " -lcygwin -lkernel32 #{CONFIG['srcdir']}/libruby.a" xsystem command - command = "gcc -s -nostdlib -o #{libname}.dll -Wl,--dll #{libname}.exp " + - objs.join(" ") + " #{Init}.o " - command.concat(flags.join(" ") + - " -Wl,-e,_dll_entry@12 -lcygwin -lkernel32 #{CONFIG['srcdir']}/libruby.a") - xsystem command File.unlink "junk.o" if FileTest.exist? "junk.o" else ----Next_Part(Thu_May_20_14:16:43_1999_809)----