# Require 'tk' SEGV with Ruby embedded in C

**URL:** <https://www.ruby-forum.com/t/require-tk-segv-with-ruby-embedded-in-c/55850>\
**Category:** Ruby\
**Created:** [March 24, 2006, 8:49am UTC](https://www.ruby-forum.com/t/require-tk-segv-with-ruby-embedded-in-c/55850 "2006-03-24T08:49:32Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nicolas\_DesprSSSSs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/74df32/32.png) [@Nicolas\_DesprSSSSs](https://www.ruby-forum.com/u/Nicolas_DesprSSSSs)\
**Post date:** [March 24, 2006, 8:49am UTC](https://www.ruby-forum.com/t/require-tk-segv-with-ruby-embedded-in-c/55850/1 "2006-03-24T08:49:32Z")

</div>

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,

---

<div class="post-metadata">

**Author:** ![Nicolas\_DesprSSSSs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/74df32/32.png) [@Nicolas\_DesprSSSSs](https://www.ruby-forum.com/u/Nicolas_DesprSSSSs)\
**Post date:** [March 24, 2006, 10:48am UTC](https://www.ruby-forum.com/t/require-tk-segv-with-ruby-embedded-in-c/55850/2 "2006-03-24T10:48:13Z")

</div>

On 3/24/06, Nicolas Desprès [removed\_email\_address@domain.invalid](mailto: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,

---

<div class="post-metadata">

**Author:** ![Nicolas\_DesprSSSSs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/74df32/32.png) [@Nicolas\_DesprSSSSs](https://www.ruby-forum.com/u/Nicolas_DesprSSSSs)\
**Post date:** [March 24, 2006, 11:41am UTC](https://www.ruby-forum.com/t/require-tk-segv-with-ruby-embedded-in-c/55850/3 "2006-03-24T11:41:07Z")

</div>

On 3/24/06, Nicolas Desprès [removed\_email\_address@domain.invalid](mailto: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,
