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 actives
yncd 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/evolutio
n-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-0
7-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/evo
lution-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.
_______________________________________________
SyncEvolution mailing list
[email protected]
http://lists.syncevolution.org/listinfo/syncevolution