Duc Anh Do
2021-Jan-22 10:04 UTC
Error "collect2: error: ld returned 213 exit status" when build Dovecot 2.3.13 on CentOS 7&8 with Valgrind
Hi all, I'm building Dovecot from source of Dovecot 2.3.13. When doing make check, I saw an error: make[1]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' for bin in test-iostream-ssl; do \ if ! /bin/sh ../../run-test.sh ../.. ./$bin; then exit 1; fi; \ done collect2: error: ld returned 213 exit status Failed to run: ./test-iostream-ssl This is my configuration in spec file: %configure \ INSTALL_DATA="install -c -p -m644" \ --docdir=%{_docdir}/%{name} \ --disable-static \ --disable-rpath \ --with-nss \ --with-shadow \ --with-pam \ --with-gssapi=plugin \ --with-ldap=plugin \ --with-sql=plugin \ --with-pgsql \ --with-mysql \ --with-sqlite \ --with-zlib \ --with-libcap \ --with-ssl=openssl \ --with-ssldir=%{ssldir} \ --with-docs I installed OpenSSL and Valgrind: # yum list installed | egrep "valgrind|openssl" openssl-devel.x86_64 1:1.1.1g-12.el8_3 @BaseOS openssl-libs.x86_64 1:1.1.1g-12.el8_3 @BaseOS valgrind.x86_64 1:3.16.0-2.el8 @AppStream valgrind-devel.x86_64 1:3.16.0-2.el8 @AppStream I investigated the problem and found something: - Unlike other lib-xxx, libtool doesn't generate executable binary test-iostream-ssl inside lib-ssl-iostream directory. That's a shell script and actual executable binary is inside ./libs directory ( https://www.gnu.org/software/libtool/manual/libtool.html#Linking-executables ): $ pwd /home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream $ file test-iostream-ssl test-iostream-ssl: POSIX shell script, ASCII text executable, with very long lines $ file .libs/test-iostream-ssl .libs/test-iostream-ssl: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c6a800c253c38a7eb78886286ef779d871550a6c, with debug_info, not stripped, too many notes (256) That means when running make check, Valgrind will monitor the shell script generated by libtool instead of the actual test code. And error occurs. - To confirm, I changed Makefile a bit: $ pwd /home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream $ vim Makefile check-local: for bin in $(test_programs); do \ export LD_LIBRARY_PATH=./.libs; \ if ! $(RUN_TEST) ./.libs/$$bin; then exit 1; fi; \ done Then do make check: $ cd ~/rpmbuild/BUILD/xxx/dovecot-2.3.13 $ make -C src/lib-ssl-iostream/ clean $ make -C src/lib-ssl-iostream/ check make[1]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' for bin in test-iostream-ssl; do \ export LD_LIBRARY_PATH=./.libs; \ if ! /bin/sh -x ../../run-test.sh ../.. ./.libs/$bin; then exit 1; fi; \ #if ! /bin/sh -x ../../run-test.sh ../.. ./$bin; then exit 1; fi; \ done ssl: handshake ....................................................... : ok ssl: o_stream_get_buffer_avail_size .................................. : ok ssl: small packets ................................................... : ok 0 / 3 tests failed + ret=0 + test -s test.out~19257 + test 0 '!=' 0 + exit 0 + rm -f test.out~19257 make[1]: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' make: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' - According to the manual of libtool, if I use libtool to generate library and executable binary, I should use libtool to execute (or debug or anything else). That will avoid misconfiguration and unexpected errors: - https://www.gnu.org/software/libtool/manual/html_node/Debugging-executables.html#Debugging-executables - https://stackoverflow.com/a/14186488 My patch looks like this: diff --git a/src/lib-ssl-iostream/Makefile.am b/src/lib-ssl-iostream/Makefile.am index 5aaea5d..17ebf1d 100644 --- a/src/lib-ssl-iostream/Makefile.am +++ b/src/lib-ssl-iostream/Makefile.am @@ -56,6 +56,6 @@ noinst_PROGRAMS = $(test_programs) check-local: for bin in $(test_programs); do \ - if ! $(RUN_TEST) ./$$bin; then exit 1; fi; \ + if ! $(LIBTOOL) --mode execute $(RUN_TEST) ./$$bin; then exit 1; fi; \ done endif Result: make[2]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' make check-local make[3]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' for bin in test-iostream-ssl; do \ if ! /bin/sh ../../libtool --mode execute /bin/sh ../../run-test.sh ../.. ./$bin; then exit 1; fi; \ done ssl: handshake ....................................................... : ok ssl: o_stream_get_buffer_avail_size .................................. : ok ssl: small packets ................................................... : ok 0 / 3 tests failed make[3]: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' make[2]: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' Can anyone help to correct my understanding and my patch? Thanks, Anh Do -------------- next part -------------- An HTML attachment was scrubbed... URL: <https://dovecot.org/pipermail/dovecot/attachments/20210122/14cf2afc/attachment.html>
Aki Tuomi
2021-Jan-26 07:11 UTC
Error "collect2: error: ld returned 213 exit status" when build Dovecot 2.3.13 on CentOS 7&8 with Valgrind
> On 22/01/2021 12:04 Duc Anh Do <doducanh2710 at gmail.com> wrote: > > > Hi all, > > I'm building Dovecot from source of Dovecot 2.3.13. When doing make check, I saw an error: > make[1]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > for bin in test-iostream-ssl; do \ > if ! /bin/sh ../../run-test.sh ../.. ./$bin; then exit 1; fi; \ > done > collect2: error: ld returned 213 exit status > Failed to run: ./test-iostream-ssl > > This is my configuration in spec file: > %configure \ > INSTALL_DATA="install -c -p -m644" \ > --docdir=%{_docdir}/%{name} \ > --disable-static \ > --disable-rpath \ > --with-nss \ > --with-shadow \ > --with-pam \ > --with-gssapi=plugin \ > --with-ldap=plugin \ > --with-sql=plugin \ > --with-pgsql \ > --with-mysql \ > --with-sqlite \ > --with-zlib \ > --with-libcap \ > --with-ssl=openssl \ > --with-ssldir=%{ssldir} \ > --with-docs > > I installed OpenSSL and Valgrind: > # yum list installed | egrep "valgrind|openssl" > openssl-devel.x86_64 1:1.1.1g-12.el8_3 @BaseOS > openssl-libs.x86_64 1:1.1.1g-12.el8_3 @BaseOS > valgrind.x86_64 1:3.16.0-2.el8 @AppStream > valgrind-devel.x86_64 1:3.16.0-2.el8 @AppStream > > I investigated the problem and found something: > * Unlike other lib-xxx, libtool doesn't generate executable binary test-iostream-ssl inside lib-ssl-iostream directory. That's a shell script and actual executable binary is inside ./libs directory (https://www.gnu.org/software/libtool/manual/libtool.html#Linking-executables): > $ pwd > /home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream > $ file test-iostream-ssl > test-iostream-ssl: POSIX shell script, ASCII text executable, with very long lines > $ file .libs/test-iostream-ssl > .libs/test-iostream-ssl: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=c6a800c253c38a7eb78886286ef779d871550a6c, with debug_info, not stripped, too many notes (256) > > That means when running make check, Valgrind will monitor the shell script generated by libtool instead of the actual test code. And error occurs. > * To confirm, I changed Makefile a bit: > $ pwd > /home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream > $ vim Makefile > check-local: > for bin in $(test_programs); do \ > export LD_LIBRARY_PATH=./.libs; \ > if ! $(RUN_TEST) ./.libs/$$bin; then exit 1; fi; \ > done > > Then do make check: > $ cd ~/rpmbuild/BUILD/xxx/dovecot-2.3.13 > $ make -C src/lib-ssl-iostream/ clean > $ make -C src/lib-ssl-iostream/ check > make[1]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > for bin in test-iostream-ssl; do \ > export LD_LIBRARY_PATH=./.libs; \ > if ! /bin/sh -x ../../run-test.sh ../.. ./.libs/$bin; then exit 1; fi; \ > #if ! /bin/sh -x ../../run-test.sh ../.. ./$bin; then exit 1; fi; \ > done > ssl: handshake ....................................................... : ok > ssl: o_stream_get_buffer_avail_size .................................. : ok > ssl: small packets ................................................... : ok > 0 / 3 tests failed > + ret=0 > + test -s test.out~19257 > + test 0 '!=' 0 > + exit 0 > + rm -f test.out~19257 > make[1]: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > make: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > * According to the manual of libtool, if I use libtool to generate library and executable binary, I should use libtool to execute (or debug or anything else). That will avoid misconfiguration and unexpected errors: > * https://www.gnu.org/software/libtool/manual/html_node/Debugging-executables.html#Debugging-executables > * https://stackoverflow.com/a/14186488 > My patch looks like this: > diff --git a/src/lib-ssl-iostream/Makefile.am b/src/lib-ssl-iostream/Makefile.am > index 5aaea5d..17ebf1d 100644 > --- a/src/lib-ssl-iostream/Makefile.am > +++ b/src/lib-ssl-iostream/Makefile.am > @@ -56,6 +56,6 @@ noinst_PROGRAMS = $(test_programs) > > check-local: > for bin in $(test_programs); do \ > - if ! $(RUN_TEST) ./$$bin; then exit 1; fi; \ > + if ! $(LIBTOOL) --mode execute $(RUN_TEST) ./$$bin; then exit 1; fi; \ > done > endif > > Result: > make[2]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > make check-local > make[3]: Entering directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > for bin in test-iostream-ssl; do \ > if ! /bin/sh ../../libtool --mode execute /bin/sh ../../run-test.sh ../.. ./$bin; then exit 1; fi; \ > done > ssl: handshake ....................................................... : ok > ssl: o_stream_get_buffer_avail_size .................................. : ok > ssl: small packets ................................................... : ok > 0 / 3 tests failed > make[3]: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > make[2]: Leaving directory '/home/xxx/rpmbuild/BUILD/xxx/dovecot-2.3.13/src/lib-ssl-iostream' > > Can anyone help to correct my understanding and my patch? > > Thanks, > Anh Do >I think better fix is to change run-test.sh to use libtool instead. I'll submit patch. Aki