Require 'tk' SEGV with Ruby embedded in C

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,

On 3/24/06, Nicolas Desprès [email protected] 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,

On 3/24/06, Nicolas Desprès [email protected] 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,

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs