opening a shared object / failing with Undefined Symbol.
stapleton.41 at gmail.com
Tue Mar 29 21:58:32 UTC 2011
On Sat, Mar 26, 2011 at 11:31 PM, Giorgos Keramidas
<keramida at ceid.upatras.gr> wrote:
> On Tue, Mar 22, 2011 at 2:28 PM, Jim <stapleton.41 at gmail.com> wrote:
>> I have an application that opens two .so files with dlopen(3):
>> Both files exist
>> Running nm(1) against each produces a lot of output, showing all the
>> symbols I know to exist in each library.
>> My application gets a null return from dlopen on the libag_gui.so.
>> dlerror produces the following string:
>> "/usr/local/lib/libag_gui.so Undefined symbol "agTimingLock"
>> $ nm /usr/local/lib/libag_gui.so | grep agTiming
>> U agTimingLock
>> I'm guessing that means that agTimingLock is used in that library but
>> not defined?
>> $ nm /usr/local/lib/libag_core.so | grep agTiming
>> 0000000000141c00 B agTimingLock
>> And this would mean that it is defined in libag_core.so?
> Yes, but it's in the uninitialized data section:
> % man nm
> "b" The symbol is in the uninitialized data section (known as BSS).
> What is the "ag" library? Which version are you using? What sort of
> dlopen() call did you try to run?
The "ag" library is libagar ( http://libagar.org/ ):
The code amounts to the following:
void * coredl = dlopen("/usr/local/lib/libag_core.so", 0)
void * guidl = dlopen("/usr/local/lib/libag_gui.so", 0)
and the function:
int (*AG_InitCore)(const char * title, int flags);
int (*AG_InitGraphics)(const char * drv);
*((void *)AG_InitCore) = dlsym(coredl, "AG_InitCore");
*((void *)AG_InitGraphics) = dlsym(guidl, "AG_InitGraphics");
The prototypes for the AG_* functions match.
More information about the freebsd-questions