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

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
3da82a61d5fbd74242cc6f671a5a32e4?d=identicon&s=25 Nicolas Desprès (Guest)
on 2006-03-24 08: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()
{
  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,
3da82a61d5fbd74242cc6f671a5a32e4?d=identicon&s=25 Nicolas Desprès (Guest)
on 2006-03-24 10:48
(Received via mailing list)
On 3/24/06, Nicolas Desprès <nicolas.despres@gmail.com> 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,
3da82a61d5fbd74242cc6f671a5a32e4?d=identicon&s=25 Nicolas Desprès (Guest)
on 2006-03-24 11:41
(Received via mailing list)
On 3/24/06, Nicolas Desprès <nicolas.despres@gmail.com> 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.