[Ruby] Native extensions on OS X

Aaron Patterson aaron at tenderlovemaking.com
Mon Jul 9 07:26:40 PDT 2007


On Mon, Jul 09, 2007 at 08:57:07AM -0700, Eric Hodel wrote:
> On Jul 8, 2007, at 19:21, Aaron Patterson wrote:
> 
> > Alright, I'm not sure what I'm doing wrong....
> >
> > I'm writing a native extension that loads a shared object.  But for  
> > some
> > reason, it can't find the symbols from the shared object!  Everything
> > works on linux, but for some reason OS X doesn't seem to work.
> >
> > Here's my compile output:
> >
> > [aaron at aaron-pattersons-powerbook58 ext]$ make
> > gcc -fno-common  -arch ppc -g -Os -pipe -fno-common  -arch ppc - 
> > pipe -pipe -fno-common  -I. -I/usr/lib/ruby/1.8/powerpc-darwin8.0 - 
> > I/usr/lib/ruby/1.8/powerpc-darwin8.0 -I. -DHAVE_LAME_LAME_H  -c  
> > decoder.c
> > gcc -fno-common  -arch ppc -g -Os -pipe -fno-common  -arch ppc - 
> > pipe -pipe -fno-common  -I. -I/usr/lib/ruby/1.8/powerpc-darwin8.0 - 
> > I/usr/lib/ruby/1.8/powerpc-darwin8.0 -I. -DHAVE_LAME_LAME_H  -c  
> > get_audio.c
> > gcc -fno-common  -arch ppc -g -Os -pipe -fno-common  -arch ppc - 
> > pipe -pipe -fno-common  -I. -I/usr/lib/ruby/1.8/powerpc-darwin8.0 - 
> > I/usr/lib/ruby/1.8/powerpc-darwin8.0 -I. -DHAVE_LAME_LAME_H  -c  
> > lollame.c
> > gcc -fno-common  -arch ppc -g -Os -pipe -fno-common  -arch ppc - 
> > pipe -pipe -fno-common  -I. -I/usr/lib/ruby/1.8/powerpc-darwin8.0 - 
> > I/usr/lib/ruby/1.8/powerpc-darwin8.0 -I. -DHAVE_LAME_LAME_H  -c  
> > syncword.c
> > cc -dynamic -bundle -undefined suppress -flat_namespace  -L"/usr/ 
> > lib" -o lollame.bundle decoder.o get_audio.o lollame.o syncword.o  - 
> > lpthread -ldl -lobjc
> >
> >
> > When I run my test script:
> >
> > dyld: NSLinkModule() error
> > dyld: Symbol not found: _lame_get_num_channels
> >   Referenced from: ./lollame.bundle
> >   Expected in: flat namespace
> >
> > Trace/BPT trap
> >
> > My dlopen line from my code:
> >
> >     dlopen("libmp3lame.dylib", RTLD_NOW | RTLD_GLOBAL);
> >
> > Does anyone have any ideas with what might be wrong?
> 
> Is it static?  I always get that wrong.
> 
> nm lollame.bundle | grep -i ' t '
> 
> Big T is dynamically linkable.  Little t is not.

I don't think so....  lame_get_num_channels is defined in
libmp3lame.bundle:

[aaron at amac ext]$ nm /usr/local/lib/libmp3lame.dylib | grep -i ' t ' | grep get_num_channels
00033cd5 T _lame_get_num_channels

I tried running ktrace on the process, and I don't see it open
libmp3lame.dylib.  It seems like its trying to resolve symbols before I
load my shared object!

-- 
Aaron Patterson
http://tenderlovemaking.com/


More information about the Ruby mailing list