Error "collect2: error: ld returned 213 exit status" when build Dovecot 2.3.13 on CentOS 7&8 with Valgrind

Duc Anh Do doducanh2710 at gmail.com
Fri Jan 22 12:04:52 EET 2021


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>


More information about the dovecot mailing list