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