[libvirt] [PATCH] compile: fix undefined reference to gnutls_x509_crt_get_dn with gcc-4.6.1

From: soulxu <soulxu@soulxu-ThinkPad-T410.(none)> When I compile libvirt with gcc-4.6.1 in ubuntu 11.10, got error as below: CCLD libvirtd /usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_migration.o): undefined reference to symbol 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' /usr/bin/ld: note: 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' is defined in DSO /usr/lib/x86_64-linux-gnu/libgnutls.so so try adding it to the linker command line /usr/lib/x86_64-linux-gnu/libgnutls.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make[3]: *** [libvirtd] Error 1 It can compile with gcc-4.5.2 in ubuntu 11.04, but it can not compile with gcc-4.6.1 in ubuntu 11.10. I didn't find reason. Does Anyone know the reason or the different between gcc-4.5.2 and gcc-4.6.1? I still provide a patch for this. Just make it is working now. Signed-off-by: soulxu <soulxu@soulxu-ThinkPad-T410.(none)> --- src/Makefile.am | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 87d91ed..104efc6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -776,10 +776,14 @@ noinst_LTLIBRARIES += libvirt_driver_qemu.la #libvirt_la_BUILT_LIBADD += libvirt_driver_qemu.la endif libvirt_driver_qemu_la_CFLAGS = $(NUMACTL_CFLAGS) \ + $(GNUTLS_CFLAGS) \ + $(LIBXML_CFLAGS) \ -I@top_srcdir@/src/conf $(AM_CFLAGS) libvirt_driver_qemu_la_LDFLAGS = $(AM_LDFLAGS) libvirt_driver_qemu_la_LIBADD = $(NUMACTL_LIBS) \ - $(CAPNG_LIBS) + $(CAPNG_LIBS) \ + $(GNUTLS_LIBS) \ + $(LIBXML_LIBS) if WITH_DRIVER_MODULES libvirt_driver_qemu_la_LIBADD += ../gnulib/lib/libgnu.la libvirt_driver_qemu_la_LDFLAGS += -module -avoid-version -- 1.7.5.4

On 10/18/2011 02:06 AM, Xu He Jie wrote:
From: soulxu<soulxu@soulxu-ThinkPad-T410.(none)>
When I compile libvirt with gcc-4.6.1 in ubuntu 11.10, got error as below:
CCLD libvirtd /usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_migration.o): undefined reference to symbol 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' /usr/bin/ld: note: 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' is defined in DSO /usr/lib/x86_64-linux-gnu/libgnutls.so so try adding it to the linker command line /usr/lib/x86_64-linux-gnu/libgnutls.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make[3]: *** [libvirtd] Error 1
It can compile with gcc-4.5.2 in ubuntu 11.04, but it can not compile with gcc-4.6.1 in ubuntu 11.10.
I didn't find reason. Does Anyone know the reason or the different between gcc-4.5.2 and gcc-4.6.1?
More likely, the difference is not in gcc, but in ld policy - Ubuntu recently changed policy to no longer allow implicit link dependencies by default (that is, if A links against B, and B links against C, older distros allowed A to use symbols from C without explicitly linking against C, while newer distros require the explicit link).
I still provide a patch for this. Just make it is working now.
Signed-off-by: soulxu<soulxu@soulxu-ThinkPad-T410.(none)> --- src/Makefile.am | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am index 87d91ed..104efc6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -776,10 +776,14 @@ noinst_LTLIBRARIES += libvirt_driver_qemu.la #libvirt_la_BUILT_LIBADD += libvirt_driver_qemu.la endif libvirt_driver_qemu_la_CFLAGS = $(NUMACTL_CFLAGS) \ + $(GNUTLS_CFLAGS) \ + $(LIBXML_CFLAGS) \
I understand the addition of GNUTLS_CFLAGS, but why LIBXML_CFLAGS? Did you get a second link error?
-I@top_srcdir@/src/conf $(AM_CFLAGS) libvirt_driver_qemu_la_LDFLAGS = $(AM_LDFLAGS) libvirt_driver_qemu_la_LIBADD = $(NUMACTL_LIBS) \ - $(CAPNG_LIBS) + $(CAPNG_LIBS) \ + $(GNUTLS_LIBS) \ + $(LIBXML_LIBS)
Likewise. Your approach to a fix is correct, but I need to know whether to use the patch as-is or whether we just need one library rather than two. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

于 2011年10月18日 22:45, Eric Blake 写道:
On 10/18/2011 02:06 AM, Xu He Jie wrote:
From: soulxu<soulxu@soulxu-ThinkPad-T410.(none)>
When I compile libvirt with gcc-4.6.1 in ubuntu 11.10, got error as below:
CCLD libvirtd /usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_migration.o): undefined reference to symbol 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' /usr/bin/ld: note: 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' is defined in DSO /usr/lib/x86_64-linux-gnu/libgnutls.so so try adding it to the linker command line /usr/lib/x86_64-linux-gnu/libgnutls.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make[3]: *** [libvirtd] Error 1
It can compile with gcc-4.5.2 in ubuntu 11.04, but it can not compile with gcc-4.6.1 in ubuntu 11.10.
I didn't find reason. Does Anyone know the reason or the different between gcc-4.5.2 and gcc-4.6.1?
More likely, the difference is not in gcc, but in ld policy - Ubuntu recently changed policy to no longer allow implicit link dependencies by default (that is, if A links against B, and B links against C, older distros allowed A to use symbols from C without explicitly linking against C, while newer distros require the explicit link).
I still provide a patch for this. Just make it is working now.
Signed-off-by: soulxu<soulxu@soulxu-ThinkPad-T410.(none)>
Just found I forgot configuring git. The Signed-off-by should be: Signed-off-by: Xu He Jie <xuhj@linux.vnet.ibm.com>
--- src/Makefile.am | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am index 87d91ed..104efc6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -776,10 +776,14 @@ noinst_LTLIBRARIES += libvirt_driver_qemu.la #libvirt_la_BUILT_LIBADD += libvirt_driver_qemu.la endif libvirt_driver_qemu_la_CFLAGS = $(NUMACTL_CFLAGS) \ + $(GNUTLS_CFLAGS) \ + $(LIBXML_CFLAGS) \
I understand the addition of GNUTLS_CFLAGS, but why LIBXML_CFLAGS? Did you get a second link error? Yes, I get a second link error. When I just add GNUTLS_LIBS to there, I get another error, as below:
/usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_domain.o): undefined reference to symbol 'xmlXPathRegisterNs@@LIBXML2_2.4.30' /usr/bin/ld: note: 'xmlXPathRegisterNs@@LIBXML2_2.4.30' is defined in DSO /usr/lib/libxml2.so so try adding it to the linker command line /usr/lib/libxml2.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make[3]: *** [libvirtd] Error 1 So I add LIBXML_CFLAGS and LIBXML_LIBS to there too.
-I@top_srcdir@/src/conf $(AM_CFLAGS) libvirt_driver_qemu_la_LDFLAGS = $(AM_LDFLAGS) libvirt_driver_qemu_la_LIBADD = $(NUMACTL_LIBS) \ - $(CAPNG_LIBS) + $(CAPNG_LIBS) \ + $(GNUTLS_LIBS) \ + $(LIBXML_LIBS)
Likewise.
Your approach to a fix is correct, but I need to know whether to use the patch as-is or whether we just need one library rather than two.

Today, the same error encounters on my Ubuntu 11.10. After apply this patch, I can make Libvirt successfully. , Xu He Jie wrote:
于 2011年10月18日 22:45, Eric Blake 写道:
On 10/18/2011 02:06 AM, Xu He Jie wrote:
From: soulxu<soulxu@soulxu-ThinkPad-T410.(none)>
When I compile libvirt with gcc-4.6.1 in ubuntu 11.10, got error as below:
CCLD libvirtd /usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_migration.o): undefined reference to symbol 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' /usr/bin/ld: note: 'gnutls_x509_crt_get_dn@@GNUTLS_1_4' is defined in DSO /usr/lib/x86_64-linux-gnu/libgnutls.so so try adding it to the linker command line /usr/lib/x86_64-linux-gnu/libgnutls.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make[3]: *** [libvirtd] Error 1
It can compile with gcc-4.5.2 in ubuntu 11.04, but it can not compile with gcc-4.6.1 in ubuntu 11.10.
I didn't find reason. Does Anyone know the reason or the different between gcc-4.5.2 and gcc-4.6.1?
More likely, the difference is not in gcc, but in ld policy - Ubuntu recently changed policy to no longer allow implicit link dependencies by default (that is, if A links against B, and B links against C, older distros allowed A to use symbols from C without explicitly linking against C, while newer distros require the explicit link).
I still provide a patch for this. Just make it is working now.
Signed-off-by: soulxu<soulxu@soulxu-ThinkPad-T410.(none)>
Just found I forgot configuring git. The Signed-off-by should be: Signed-off-by: Xu He Jie <xuhj@linux.vnet.ibm.com>
--- src/Makefile.am | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am index 87d91ed..104efc6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -776,10 +776,14 @@ noinst_LTLIBRARIES += libvirt_driver_qemu.la #libvirt_la_BUILT_LIBADD += libvirt_driver_qemu.la endif libvirt_driver_qemu_la_CFLAGS = $(NUMACTL_CFLAGS) \ + $(GNUTLS_CFLAGS) \ + $(LIBXML_CFLAGS) \
I understand the addition of GNUTLS_CFLAGS, but why LIBXML_CFLAGS? Did you get a second link error? Yes, I get a second link error. When I just add GNUTLS_LIBS to there, I get another error, as below:
/usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_domain.o): undefined reference to symbol 'xmlXPathRegisterNs@@LIBXML2_2.4.30' /usr/bin/ld: note: 'xmlXPathRegisterNs@@LIBXML2_2.4.30' is defined in DSO /usr/lib/libxml2.so so try adding it to the linker command line /usr/lib/libxml2.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make[3]: *** [libvirtd] Error 1
So I add LIBXML_CFLAGS and LIBXML_LIBS to there too.
-I@top_srcdir@/src/conf $(AM_CFLAGS) libvirt_driver_qemu_la_LDFLAGS = $(AM_LDFLAGS) libvirt_driver_qemu_la_LIBADD = $(NUMACTL_LIBS) \ - $(CAPNG_LIBS) + $(CAPNG_LIBS) \ + $(GNUTLS_LIBS) \ + $(LIBXML_LIBS)
Likewise.
Your approach to a fix is correct, but I need to know whether to use the patch as-is or whether we just need one library rather than two.
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On 10/18/2011 08:06 PM, Xu He Jie wrote:
More likely, the difference is not in gcc, but in ld policy - Ubuntu recently changed policy to no longer allow implicit link dependencies by default (that is, if A links against B, and B links against C, older distros allowed A to use symbols from C without explicitly linking against C, while newer distros require the explicit link).
Likewise.
Your approach to a fix is correct, but I need to know whether to use the patch as-is or whether we just need one library rather than two.
Yes, I get a second link error. When I just add GNUTLS_LIBS to there, I get another error, as below:
/usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_domain.o): undefined reference to symbol 'xmlXPathRegisterNs@@LIBXML2_2.4.30' /usr/bin/ld: note: 'xmlXPathRegisterNs@@LIBXML2_2.4.30' is defined in DSO /usr/lib/libxml2.so so try adding it to the linker command line
In which case, ACK and pushed. Your original patch was (mistakenly) attributed to <soulxu@soulxu-ThinkPad-T410.(none)>, which is not a valid address; you should probably fix your ~/.gitconfig settings on that computer. Hopefully I was correct in re-attributing authorship to the email you used for previous patches. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

于 2011年10月19日 21:08, Eric Blake 写道:
On 10/18/2011 08:06 PM, Xu He Jie wrote:
More likely, the difference is not in gcc, but in ld policy - Ubuntu recently changed policy to no longer allow implicit link dependencies by default (that is, if A links against B, and B links against C, older distros allowed A to use symbols from C without explicitly linking against C, while newer distros require the explicit link).
Likewise.
Your approach to a fix is correct, but I need to know whether to use the patch as-is or whether we just need one library rather than two.
Yes, I get a second link error. When I just add GNUTLS_LIBS to there, I get another error, as below:
/usr/bin/ld: ../src/.libs/libvirt_driver_qemu.a(libvirt_driver_qemu_la-qemu_domain.o): undefined reference to symbol 'xmlXPathRegisterNs@@LIBXML2_2.4.30' /usr/bin/ld: note: 'xmlXPathRegisterNs@@LIBXML2_2.4.30' is defined in DSO /usr/lib/libxml2.so so try adding it to the linker command line
In which case, ACK and pushed.
Your original patch was (mistakenly) attributed to <soulxu@soulxu-ThinkPad-T410.(none)>, which is not a valid address; you should probably fix your ~/.gitconfig settings on that computer. Hopefully I was correct in re-attributing authorship to the email you used for previous patches.
Thanks!
participants (3)
-
Eric Blake
-
ShaoHe Feng
-
Xu He Jie