opening a shared object / failing with Undefined Symbol.
Jim
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):
>> /usr/local/lib/libag_core.so
>> /usr/local/lib/libag_gui.so
>>
>> 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"
> "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.
Thanks,
-Jim Stapleton
More information about the freebsd-questions
mailing list