Require 'tk' SEGV with Ruby embedded in C


#1

Hi there,

I’m having trouble trying to embed Ruby in a C program.

$ cat test.c
#include <ruby.h>

int main()
{
ruby_init();
ruby_script(“test”);
ruby_init_loadpath();
rb_eval_string(“require ‘tk’”);
return 0;
}
$ gcc -o test test.c -L/opt/ruby-1.8.4/lib -lruby
-I/opt/ruby-1.8.4/lib/ruby/1.8/i686-linux
$ ./test
/opt/ruby-1.8.4/lib/ruby/site_ruby/1.8/i686-linux/tcltklib.so: [BUG]
Segmentation fault
ruby 1.8.4 (2005-12-24) [i686-linux]

zsh: abort ./test
$ ruby -e “require ‘tk’”
$

As you can check require ‘tk’ works fine using ruby -e, but it fails
with the C version. I’ve check requiring others files such as
thread.rb, pathname.rb, digest.so, readline.so, dl.so, … and they
all work with both ruby -e and my C program. I don’t understand what
I’m doing wrong in my C code.

Any help, would be great,

Cheers,


#2

On 3/24/06, Nicolas Desprès removed_email_address@domain.invalid wrote:

I’m having trouble trying to embed Ruby in a C program.

Patching the program this way, solve the problem:

$ cat test.c
#include <ruby.h>

EXTERN VALUE rb_progname;
EXTERN VALUE rb_argv0;

int main()
{
ruby_init();
ruby_script(“test”);
rb_argv0 = rb_progname;
ruby_init_loadpath();
rb_eval_string(“require ‘tk’”);
return 0;
}

I’m looking for a cleaner solution.

Regards,


#3

On 3/24/06, Nicolas Desprès removed_email_address@domain.invalid wrote:

EXTERN VALUE rb_progname;

}

I’m looking for a cleaner solution.

Indeed the problem comes from the tcltklib.c line 7932 and the program
fails since rb_argv0 is not initialized. I think the ruby_script
function should have initialized it since this function initializes
rb_progname and ruby_sourcefile.

Using ruby_options also solves the problem but ruby_options reads
stdin if no arguments are given and in fact I don’t want to give
arguments since I just want to use ruby as a library. Finally, when I
look at ruby_process_options (called by ruby_options) I saw these two
lines at the beginning:

ruby_script(argv[0]); /* for the time being */
rb_argv0 = rb_progname;

I’m wondering why the second statements is not included in the
ruby_script function. If it were, it may have saved me a lot of time
by avoiding me the problem I mentioned above.

Any further commentaries about this issue is welcome,

Best regards,