Forum: Ruby require 'tk' SEGV with Ruby embedded in C

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Nicolas Desprès (Guest)
on 2006-03-24 09:49
(Received via mailing list)
Hi there,

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

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

int main()
  rb_eval_string("require 'tk'");
  return 0;
$ gcc -o test test.c -L/opt/ruby-1.8.4/lib -lruby
$ ./test
/opt/ruby-1.8.4/lib/ruby/site_ruby/1.8/i686-linux/ [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,,,, ... 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,

Nicolas Desprès (Guest)
on 2006-03-24 11:48
(Received via mailing list)
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.

Nicolas Desprès (Guest)
on 2006-03-24 12:41
(Received via mailing list)
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,
This topic is locked and can not be replied to.