From: Lyle Johnson Date: 2006-09-14T04:25:00+09:00 Subject: Re: building extension modules, and linking On 9/13/06, John Gabriele wrote: > When you load an extension module, what's the mechanism that makes > those C calls (the ones that call into the Ruby API) actually get > connected to the currently-running instance of ruby? When you use the "require" method to load an extension module, Ruby takes the name of the feature that you're trying to require and looks for a shared library of that name somewhere in its library load path. So for example, if you type: require 'foobar' Ruby's going to try to find foobar.so (or foobar.bundle, or whatever's appropriate for your operating system) somewhere in the $LOAD_PATH. Ruby uses an OS-specific function call to dynamically load that shared library into memory, and another OS-specific function call to obtain a pointer to a function in that library named "Init_foobar". (If you want more specifics about which functions Ruby users, check out the dln.c file in the Ruby source code). If Ruby fails to get a pointer to that Init_foobar() function, the require operation's going to fail. One Ruby has a pointer to the Init_foobar() function that's defined in the foobar.so shared library -- it calls it! And that's where you, the extension writer come in. You are the person who actually defines the Init_foobar() function for initializing your extension module. In that function, you should make various calls into Ruby's extension API to define the modules, classes and methods that make up your extension module. Hope this helps, Lyle