Static functions, extensions, linkage

D

Daniel Berger

Hi,

How do you get at a static function from within a C extension? I tried
this snippet where I attempt to use flo_plus from numeric.c:

/* foo.c */
#include <ruby.h>

extern VALUE flo_plus(VALUE, VALUE);

static VALUE foo_test(VALUE x, VALUE y){
return flo_plus(x, y);
}

void Init_foo(){
VALUE cFoo = rb_define_class("Foo", rb_cObject);
rb_define_method(cFoo, "test", foo_test, 2);
}

# test.rb
$:unshift Dir.pwd
require 'foo'
f = Foo.new
f.test

This result is:

ruby: symbol lookup error:
/home/djberge/programming/ruby/extensions/foo.so: undefined symbol:
flo_plus

I tried linking explicitly against -lruby but that didn't help.

Regards,

Dan
 
T

Timothy Hunter

Daniel said:
Hi,

How do you get at a static function from within a C extension? I tried
this snippet where I attempt to use flo_plus from numeric.c:

/* foo.c */
#include <ruby.h>

extern VALUE flo_plus(VALUE, VALUE);

static VALUE foo_test(VALUE x, VALUE y){
return flo_plus(x, y);
}

void Init_foo(){
VALUE cFoo = rb_define_class("Foo", rb_cObject);
rb_define_method(cFoo, "test", foo_test, 2);
}

# test.rb
$:unshift Dir.pwd
require 'foo'
f = Foo.new
f.test

This result is:

ruby: symbol lookup error:
/home/djberge/programming/ruby/extensions/foo.so: undefined symbol:
flo_plus

I tried linking explicitly against -lruby but that didn't help.

Regards,

Dan
Where is 'flo_plus' defined?
 
T

Timothy Hunter

Daniel said:
In numeric.c. Note that it *builds* fine, it just doesn't *run*.

Regards,

Dan
I see. Since flo_plus has static linkage in numeric.c you can't call it
from your extension. It builds okay because you supplied a declaration
for it, and it links okay because Linux does lazy linking (that is,
external symbols aren't resolved until the .so gets loaded), but it
won't run because there's no external definition of flo_plus to match
your external reference.

You'll have to use rb_funcall to call "+".
 
L

Logan Capaldo

Hi,

How do you get at a static function from within a C extension? I
tried
this snippet where I attempt to use flo_plus from numeric.c:

I could be wrong, but I believe the entire purpose of a static
function is to _not_ be get at able from other code (sort of like
private in ruby).
 
V

Vincent Fourmond

Hello !
This result is:

ruby: symbol lookup error:
/home/djberge/programming/ruby/extensions/foo.so: undefined symbol:
flo_plus

I tried linking explicitly against -lruby but that didn't help.

By the way, if you're interested to know which symbols are exported
from a library, just do

nm -D /usr/lib/library.so

A look to that on my computer shows no references to flo_plus, only:
nm -D /usr/lib/libruby1.8.so | grep flo
U flock
U floor
0000000000057ef0 T rb_float_new

Cheers

Vincent
 
T

Tim Hunter

Vincent said:
By the way, if you're interested to know which symbols are exported
from a library, just do

nm -D /usr/lib/library.so

A look to that on my computer shows no references to flo_plus, only:
nm -D /usr/lib/libruby1.8.so | grep flo
U flock
U floor
0000000000057ef0 T rb_float_new


In Ruby, the functions that are intended for use by extensions start
with the prefix "rb_" and are declared in either ruby.h or intern.h.
Since flo_plus doesn't start with "rb_" it isn't intended to be
available to extensions.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top