dynamic library problem (shl_load) (291 Views)
Reply
Frequent Advisor
Ulrich Deiters
Posts: 71
Registered: ‎05-07-2000
Message 1 of 6 (291 Views)
Accepted Solution

dynamic library problem (shl_load)

Condider the following case:
file1.c contains the main program and
some subroutines. file2.c contains subroutines only, which need to go into a shared library. I compile like this:
cc -Aa -c +z -g file2.c
ld -b -o libxyz.sl file2.o
cc -Aa -g file1.c -ldld
The mainprogram loads libxyz by means of shl_load.
If I run a.out and file2.c contains external variables (extern int something ...), the shl_findsym fails. Without external variables the subroutines from file2 are loaded correctly - but then it is not possible to invoke a subroutine from file1 any longer (dld error).

The dlopen method works, but that is not available on my system (HP-UX 10.20).

Any ideas what went wrong?
Please use plain text.
Trusted Contributor
Manish Srivastava
Posts: 170
Registered: ‎05-24-2004
Message 2 of 6 (291 Views)

Re: dynamic library problem (shl_load)

Hi,

Could you give the dld error message.

manish
Please use plain text.
Frequent Advisor
Ulrich Deiters
Posts: 71
Registered: ‎05-07-2000
Message 3 of 6 (291 Views)

Re: dynamic library problem (shl_load)

... something like "dld error, symbol not found.

This is funny, because the missing subroutine had been linked statically.
Please use plain text.
Honored Contributor
Mike Stroyan
Posts: 888
Registered: ‎11-22-1996
Message 4 of 6 (291 Views)

Re: dynamic library problem (shl_load)

A declaration like
extern int my_symbol;
does not allocate any storage for "my_symbol".
If you want the shared library to provide a
symbol you need to declare it as
int my_symbol;
somewhere in the shared library.

If you meant to declare a symbol in the a.out
and access it from the shared library, then
you may need to add a -Wl,-E option when
linking the a.out. That tells ld to export
all symbols for use by shared libraries even
if they are not used by code in the a.out
itself.
Please use plain text.
Frequent Advisor
Ulrich Deiters
Posts: 71
Registered: ‎05-07-2000
Message 5 of 6 (291 Views)

Re: dynamic library problem (shl_load)

The exact error message was
"/usr/lib/dld.sl: Unresolved symbol: parse_global (code) from /home/ukd/architex
/lib/libbibliography.sl",
where parse_global() is a statically linked
subroutine (or rather, it is compiled together with main()).

I do not quite understand why the program forgets its static subroutine table. But whatever the reason is,"-Wl,-E" did the trick! Thank you for your help.
Please use plain text.
Esteemed Contributor
ranganath ramachandra
Posts: 375
Registered: ‎05-16-2003
Message 6 of 6 (291 Views)

Re: dynamic library problem (shl_load)

by default, symbols are not exported from the application program ('a.out') unless they are being imported by a shared library seen at link-time (not one that may dynamically loaded by the user). so in your case the precise solution is to add this to your compile line : '-Wl,+ee,parse_global'

the -E flag makes the linker export all symbols from a.out, that is how it fixed your problem.
Please use plain text.
The opinions expressed above are the personal opinions of the authors, not of HP. By using this site, you accept the Terms of Use and Rules of Participation