Discussion:
help with dl module and clang
Daniel Braniss
2018-11-03 14:51:58 UTC
Permalink
Hi,
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.

when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140


thanks,
danny
PS: I’m running FreeBSD 11.2
Dimitry Andric
2018-11-03 15:47:37 UTC
Permalink
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol 

BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.

I think this will also help with the exporting of the symbols of your
main program.

-Dimitry
Daniel Braniss
2018-11-03 15:58:17 UTC
Permalink
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
i had tried that before but i had -WI (upper case i) but re-reading the manual
it should be-Wl (lower case l as in lima :-))!!!!!

thanks!!!!!!

and now have to try profiling (gprof) which started this mess,

thanks again!!

danny
Post by Dimitry Andric
I think this will also help with the exporting of the symbols of your
main program.
-Dimitry
Daniel Braniss
2018-11-03 16:11:19 UTC
Permalink
Post by Daniel Braniss
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
i had tried that before but i had -WI (upper case i) but re-reading the manual
it should be-Wl (lower case l as in lima :-))!!!!!
thanks!!!!!!
and now have to try profiling (gprof) which started this mess,
thanks again!!
danny
Post by Dimitry Andric
I think this will also help with the exporting of the symbols of your
main program.
-Dimitry
ok, new problem, it also happens with gcc:

when compiling the main program with flag -pg (gprof)
dlopen fails with dlerror: Service unavailable

what magic is needed now?

danny
Post by Daniel Braniss
_______________________________________________
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
Dimitry Andric
2018-11-03 16:22:52 UTC
Permalink
On 3 Nov 2018, at 17:11, Daniel Braniss <***@cs.huji.ac.il> wrote:
...
Post by Daniel Braniss
when compiling the main program with flag -pg (gprof)
dlopen fails with dlerror: Service unavailable
what magic is needed now?
Usually, this occurs when you attempt to dlopen from a statically linked
executable. Is this executable statically linked?

-Dimitry
Konstantin Belousov
2018-11-03 16:35:08 UTC
Permalink
Post by Daniel Braniss
Post by Daniel Braniss
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
i had tried that before but i had -WI (upper case i) but re-reading the manual
it should be-Wl (lower case l as in lima :-))!!!!!
thanks!!!!!!
and now have to try profiling (gprof) which started this mess,
thanks again!!
danny
Post by Dimitry Andric
I think this will also help with the exporting of the symbols of your
main program.
-Dimitry
when compiling the main program with flag -pg (gprof)
dlopen fails with dlerror: Service unavailable
This means that your binary is linked statically.
dlopen(3) is not supported for static linking, ld-elf.so.1 is required
for dynamic loading to work.
Post by Daniel Braniss
what magic is needed now?
danny
Post by Daniel Braniss
_______________________________________________
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
_______________________________________________
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers
Daniel Braniss
2018-11-03 17:31:33 UTC
Permalink
Post by Konstantin Belousov
Post by Daniel Braniss
Post by Daniel Braniss
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
i had tried that before but i had -WI (upper case i) but re-reading the manual
it should be-Wl (lower case l as in lima :-))!!!!!
thanks!!!!!!
and now have to try profiling (gprof) which started this mess,
thanks again!!
danny
Post by Dimitry Andric
I think this will also help with the exporting of the symbols of your
main program.
-Dimitry
when compiling the main program with flag -pg (gprof)
dlopen fails with dlerror: Service unavailable
This means that your binary is linked statically.
dlopen(3) is not supported for static linking, ld-elf.so.1 is required
for dynamic loading to work.
as far as I can tell, it’s NOT statically linked:
l
e-kots-b# ldd /vol/src/libexec/idng/idngd/idngd
/vol/src/libexec/idng/idngd/idngd:
libpq.so.5 => /usr/local/lib/libpq.so.5 (0x800932000)
libcrypto.so.8 => /lib/libcrypto.so.8 (0x800c00000)
libldap-2.4.so.2 => /usr/local/lib/libldap-2.4.so.2 (0x801070000)
libthr.so.3 => /lib/libthr.so.3 (0x8012b7000)
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x8014df000)
libssl.so.8 => /usr/lib/libssl.so.8 (0x8016ea000)
libc.so.7 => /lib/libc.so.7 (0x80195d000)
liblber-2.4.so.2 => /usr/local/lib/liblber-2.4.so.2 (0x801d18000)
e-kots-b# file !$
file /vol/src/libexec/idng/idngd/idngd
/vol/src/libexec/idng/idngd/idngd: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 11.2 (1102501 <tel:1102501>), FreeBSD-style, not stripped
Post by Konstantin Belousov
Post by Daniel Braniss
what magic is needed now?
danny
Post by Daniel Braniss
_______________________________________________
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers <https://lists.freebsd.org/mailman/listinfo/freebsd-hackers>
_______________________________________________
https://lists.freebsd.org/mailman/listinfo/freebsd-hackers <https://lists.freebsd.org/mailman/listinfo/freebsd-hackers>
Konstantin Belousov
2018-11-04 17:22:07 UTC
Permalink
Post by Daniel Braniss
Post by Konstantin Belousov
Post by Daniel Braniss
Post by Daniel Braniss
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
i had tried that before but i had -WI (upper case i) but re-reading the manual
it should be-Wl (lower case l as in lima :-))!!!!!
thanks!!!!!!
and now have to try profiling (gprof) which started this mess,
thanks again!!
danny
Post by Dimitry Andric
I think this will also help with the exporting of the symbols of your
main program.
-Dimitry
when compiling the main program with flag -pg (gprof)
dlopen fails with dlerror: Service unavailable
This means that your binary is linked statically.
dlopen(3) is not supported for static linking, ld-elf.so.1 is required
for dynamic loading to work.
l
e-kots-b# ldd /vol/src/libexec/idng/idngd/idngd
libpq.so.5 => /usr/local/lib/libpq.so.5 (0x800932000)
libcrypto.so.8 => /lib/libcrypto.so.8 (0x800c00000)
libldap-2.4.so.2 => /usr/local/lib/libldap-2.4.so.2 (0x801070000)
libthr.so.3 => /lib/libthr.so.3 (0x8012b7000)
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x8014df000)
libssl.so.8 => /usr/lib/libssl.so.8 (0x8016ea000)
libc.so.7 => /lib/libc.so.7 (0x80195d000)
liblber-2.4.so.2 => /usr/local/lib/liblber-2.4.so.2 (0x801d18000)
e-kots-b# file !$
file /vol/src/libexec/idng/idngd/idngd
/vol/src/libexec/idng/idngd/idngd: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 11.2 (1102501 <tel:1102501>), FreeBSD-style, not stripped
I suppose that dlopen(3) is called from the text of the idngd binary ?
Put the readelf -a idngd output somewhere.
Daniel Braniss
2018-11-04 17:30:39 UTC
Permalink
Post by Konstantin Belousov
Post by Daniel Braniss
Post by Konstantin Belousov
Post by Daniel Braniss
Post by Daniel Braniss
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
i had tried that before but i had -WI (upper case i) but re-reading the manual
it should be-Wl (lower case l as in lima :-))!!!!!
thanks!!!!!!
and now have to try profiling (gprof) which started this mess,
thanks again!!
danny
Post by Dimitry Andric
I think this will also help with the exporting of the symbols of your
main program.
-Dimitry
when compiling the main program with flag -pg (gprof)
dlopen fails with dlerror: Service unavailable
This means that your binary is linked statically.
dlopen(3) is not supported for static linking, ld-elf.so.1 is required
for dynamic loading to work.
l
e-kots-b# ldd /vol/src/libexec/idng/idngd/idngd
libpq.so.5 => /usr/local/lib/libpq.so.5 (0x800932000)
libcrypto.so.8 => /lib/libcrypto.so.8 (0x800c00000)
libldap-2.4.so.2 => /usr/local/lib/libldap-2.4.so.2 (0x801070000)
libthr.so.3 => /lib/libthr.so.3 (0x8012b7000)
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x8014df000)
libssl.so.8 => /usr/lib/libssl.so.8 (0x8016ea000)
libc.so.7 => /lib/libc.so.7 (0x80195d000)
liblber-2.4.so.2 => /usr/local/lib/liblber-2.4.so.2 (0x801d18000)
e-kots-b# file !$
file /vol/src/libexec/idng/idngd/idngd
/vol/src/libexec/idng/idngd/idngd: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 11.2 (1102501 <tel:1102501>), FreeBSD-style, not stripped
I suppose that dlopen(3) is called from the text of the idngd binary ?
correct
Post by Konstantin Belousov
Put the readelf -a idngd output somewhere.
www.cs.huji.ac.il/~danny/idngd.elf.out <http://www.cs.huji.ac.il/~danny/idngd.elf.out>
Joerg Sonnenberger
2018-11-08 21:31:52 UTC
Permalink
Post by Dimitry Andric
Post by Daniel Braniss
I have a program that loads some modules via dlopen(), these modules call some routines
which are in the main program, this works when using gcc, but with cc it does not.
when compiling the main program I use -export-dynamic, and the modules link fine when compiled with
gcc, but when compiling with clang/cc i get dlerror: ...Undefined symbol …
BTW, when linking the main program with cc I get
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic; defaulting to 0000000000402140
Instead of using -export-dynamic (which is a linker flag) as a flag to
cc, try using -Wl,-export-dynamic instead. Now, the linker interprets
this as the -e flag, which is something totally different.
Or cc -rdynamic.

Joerg

Loading...