[LLVMdev] Trouble Resolving Objective-C Symbols in lli

Ralph Corderoy
Fri, 20 Jul 2007 09:38:30 -0000

Hi Chris,

> Once you have that, you are hitting another problem.  Specifically,
> the JIT::getPointerToNamedFunction method in
> lib/ExecutionEngine/JIT/Intercept.cpp just does a dlsym on missing
> symbols.  If dlsym returns null, you get the error message.
>
> The problem here is that .objc_class_name_* are special symbols that
> are used by the objc linker support and they have magic meaning.  This
> itself isn't a problem, the problem is that they are absolute symbols
> (which is why nm prints 'A' for the symbol) and their absolute
value
> is 0.  When dlsym correctly returns the address of this symbol, it
> returns a null pointer (which is the address of the symbol) and lli
> aborts because it thinks dlsym returned failure.
>
> After consulting with our dynamic linker guru, I don't think there is
> a wonderful clean way to do this.

I could be missing something, but shouldn't the use of dlsym() be

    char *err;
    void *p;

    if ((err = dlerror())) {
        error("earlier undetected dlerror: %s\n", err);
    }
    p = dlsym(handle, sym);
    if ((err = dlerror())) {
        error("dlsym failed: %s\n", err);
    }

    return p;

The authors of dlsym() realised the return value was overloaded AFAICS.

Cheers,


Ralph.