Hello!
I'm running into a baffling link error when rebuilding activesyncd
f72a6ce from today:
make[1]: Entering directory `/home/pohly/work/activesyncd/eas-daemon/src'
/bin/bash ../../libtool --tag=CC --mode=link gcc -g -Wall -DG_DISABLE_DEPRECATED
-DDISABLE_EAS_DAEMON -g -Wall -Wextra -Wno-missing-field-initializers -Wno-sign-compare
-Wno-unused-parameter -Werror=pointer-to-int-cast -Wdeclaration-after-statement
-Werror-implicit-function-declaration -Wformat-nonliteral -Wformat-security -Winit-self
-Wmissing-declarations -Wmissing-include-dirs -Wmissing-noreturn -Wnested-externs
-Wpointer-arith -Wundef -Wwrite-strings -L/usr/local/evolution-2.32-2011-07-05/lib
-lglib-2.0 -pthread -L/usr/local/evolution-2.32-2011-07-05/lib -ledataserver-1.2 -lxml2
-lgconf-2 -lsoup-2.4 -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0
-ldbus-1 -lpthread -lrt -pthread -L/usr/local/evolution-2.32-2011-07-05/lib
-ldbus-glib-1 -ldbus-1 -lpthread -lgobject-2.0 -lgthread-2.0 -lrt -lglib-2.0 -pthread
-L/usr/local/evolution-2.32-2011-07-05/lib -lsoup-2.4 -lgio-2.0 -lgobject-2.0
-lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -o activesyncd
activesyncd-activesyncd-server.o activesyncd-eas-sync.o activesyncd-eas-common.o
activesyncd-eas-mail.o activesyncd-eas-test.o activesyncd-eas-marshal.o
activesyncd-eas-interface-base.o ../../logger/libeaslogger.la ../libeas/libeas.la
../../libeasmail/src/libeasmail.la ../../libeassync/src/libeassync.la
../../libeastest/src/libeastest.la
libtool: link: gcc -g -Wall -DG_DISABLE_DEPRECATED -DDISABLE_EAS_DAEMON -g -Wall -Wextra
-Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter
-Werror=pointer-to-int-cast -Wdeclaration-after-statement
-Werror-implicit-function-declaration -Wformat-nonliteral -Wformat-security -Winit-self
-Wmissing-declarations -Wmissing-include-dirs -Wmissing-noreturn -Wnested-externs
-Wpointer-arith -Wundef -Wwrite-strings -pthread -pthread -pthread -o .libs/activesyncd
activesyncd-activesyncd-server.o activesyncd-eas-sync.o activesyncd-eas-common.o
activesyncd-eas-mail.o activesyncd-eas-test.o activesyncd-eas-marshal.o
activesyncd-eas-interface-base.o -L/usr/local/evolution-2.32-2011-07-05/lib
/usr/local/evolution-2.32-2011-07-05/lib/libedataserver-1.2.so /usr/lib/libxml2.so
/usr/lib/libgconf-2.so -ldbus-glib-1 -ldbus-1 -lpthread -lsoup-2.4
/usr/local/evolution-2.32-2011-07-05/lib/libgio-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgobject-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgmodule-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgthread-2.0.so -lrt
/usr/local/evolution-2.32-2011-07-05/lib/libglib-2.0.so ../../logger/.libs/libeaslogger.so
../libeas/.libs/libeas.so ../../libeasmail/src/.libs/libeasmail.so
../../libeassync/src/.libs/libeassync.so ../../libeastest/src/.libs/libeastest.so -pthread
-Wl,-rpath -Wl,/usr/local/evolution-2.32-2011-07-05/lib -Wl,-rpath
-Wl,/tmp/activesyncd/lib
../libeas/.libs/libeas.so: undefined reference to `eas_account_set_server_protocols'
collect2: ld returned 1 exit status
make[1]: *** [activesyncd] Error 1
make[1]: Leaving directory `/home/pohly/work/activesyncd/eas-daemon/src'
What confuses me is that eas_account_set_server_protocols is in
libeasaccounts.so and libeas.so was linked against that library:
$ ldd ../libeas/.libs/libeas.so | grep account
libeasaccount.so.0 =>
/home/pohly/work/activesyncd/libeasaccount/src/.libs/libeasaccount.so.0
(0x00007f2797caf000)
$ objdump -T /home/pohly/work/activesyncd/libeasaccount/src/.libs/libeasaccount.so.0 |
grep eas_account_set_server_protocols
000000000000413f g DF .text 00000000000003de Base
eas_account_set_server_protocols
$ objdump -T ../libeas/.libs/libeas.so | grep eas_account_set_server_protocols
0000000000000000 DF *UND* 0000000000000000
eas_account_set_server_protocols
There's also no other reference to that symbol:
$ gcc -g -Wall -DG_DISABLE_DEPRECATED -DDISABLE_EAS_DAEMON -g -Wall -Wextra
-Wno-missing-field-initializers -Wno-sign-compare -Wno-unused-parameter
-Werror=pointer-to-int-cast -Wdeclaration-after-statement
-Werror-implicit-function-declaration -Wformat-nonliteral -Wformat-security -Winit-self
-Wmissing-declarations -Wmissing-include-dirs -Wmissing-noreturn -Wnested-externs
-Wpointer-arith -Wundef -Wwrite-strings -pthread -pthread -pthread -o .libs/activesyncd
activesyncd-activesyncd-server.o activesyncd-eas-sync.o activesyncd-eas-common.o
activesyncd-eas-mail.o activesyncd-eas-test.o activesyncd-eas-marshal.o
activesyncd-eas-interface-base.o -L/usr/local/evolution-2.32-2011-07-05/lib
/usr/local/evolution-2.32-2011-07-05/lib/libedataserver-1.2.so /usr/lib/libxml2.so
/usr/lib/libgconf-2.so -ldbus-glib-1 -ldbus-1 -lpthread -lsoup-2.4
/usr/local/evolution-2.32-2011-07-05/lib/libgio-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgobject-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgmodule-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgthread-2.0.so -lrt
/usr/local/evolution-2.32-2011-07-05/lib/libglib-2.0.so ../../logger/.libs/libeaslogger.so
../libeas/.libs/libeas.so ../../libeasmail/src/.libs/libeasmail.so
../../libeassync/src/.libs/libeassync.so ../../libeastest/src/.libs/libeastest.so -pthread
-Wl,-rpath -Wl,/usr/local/evolution-2.32-2011-07-05/lib -Wl,-rpath
-Wl,/tmp/activesyncd/lib -Wl,-trace-symbol=eas_account_set_server_protocols
../libeas/.libs/libeas.so: reference to eas_account_set_server_protocols
../libeas/.libs/libeas.so: undefined reference to `eas_account_set_server_protocols'
collect2: ld returned 1 exit status
Why doesn't the linker consider libeasaccount.so.0 when checking for
this symbol? Why does it care in the first place?
[a bit later]
Found it. stracing the final ld invocation shows that it looks at an old
libeasaccount.so.0 in my /tmp/activesyncd install dir. Wiping that out
first avoided the issue.
I still don't know why ld considers those old libs at all. Does setting
the rpath have that effect? That is the only reference
to /tmp/activesyncd/lib.
Here's the final ld:
$ /usr/bin/ld -v --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=both -dynamic-linker
/lib64/ld-linux-x86-64.so.2 -o .libs/activesyncd
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crti.o
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtbegin.o -L/usr/local/evolution-2.32-2011-07-05/lib
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5 -L/usr/lib/gcc/x86_64-linux-gnu/4.4.5
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib -L/lib/../lib -L/usr/lib/../lib
-L/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../.. -L/usr/lib/x86_64-linux-gnu
activesyncd-activesyncd-server.o activesyncd-eas-sync.o activesyncd-eas-common.o
activesyncd-eas-mail.o activesyncd-eas-test.o activesyncd-eas-marshal.o
activesyncd-eas-interface-base.o
/usr/local/evolution-2.32-2011-07-05/lib/libedataserver-1.2.so /usr/lib/libxml2.so
/usr/lib/libgconf-2.so -ldbus-glib-1 -ldbus-1 -lpthread -lsoup-2.4
/usr/local/evolution-2.32-2011-07-05/lib/libgio-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgobject-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgmodule-2.0.so
/usr/local/evolution-2.32-2011-07-05/lib/libgthread-2.0.so -lrt
/usr/local/evolution-2.32-2011-07-05/lib/libglib-2.0.so ../../logger/.libs/libeaslogger.so
../libeas/.libs/libeas.so ../../libeasmail/src/.libs/libeasmail.so
../../libeassync/src/.libs/libeassync.so ../../libeastest/src/.libs/libeastest.so -rpath
/usr/local/evolution-2.32-2011-07-05/lib -rpath /tmp/activesyncd/lib
-trace-symbol=eas_account_set_server_protocols -lgcc --as-needed -lgcc_s --no-as-needed
-lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/crtend.o
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crtn.o
--
Best Regards, Patrick Ohly
The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.