Hi,
I have hard time getting the following fine ODP application linked
against the shared ODP library when ODP has been configured with
--disable-abi-compat. It seems to me that the problem is in the
'local' binding of the _odp_packet_inline symbol in the .so, caused
by the -fvisibility=hidden argument in the ODP compilation.
$ cat test.c
#include <odp_api.h>
int main(void)
{
return !odp_packet_user_ptr(0);
}
$ gcc -pthread -I../ODP/include test.c -L../ODP/lib -lodp-linux
/tmp/cc8GPUfA.o: In function `_odp_packet_user_ptr':
test.c:(.text+0xb): undefined reference to `_odp_packet_inline'
collect2: error: ld returned 1 exit status
Makefile:10: recipe for target 'dynamic2' failed
make: *** [dynamic2] Error 1
$ objdump -t ../ODP/lib/libodp-linux.so | grep _odp_packet_inline
000000000003b040 l O .rodata 0000000000000070
_odp_packet_inline
Linking statically works. In the archive the symbol is global,
although marked hidden:
$ objdump -t ../ODP/lib/libodp-linux.a | grep 'rodata.*_odp_packet_inline'
0000000000000080 g O .rodata 0000000000000070 .hidden
_odp_packet_inline
I have no idea what the right fix is, but I got things working
with this:
diff --git a/platform/linux-generic/odp_packet.c
b/platform/linux-generic/odp_packet.c
index 60eef3a..10a99ca 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -25,7 +25,7 @@
#define BASE_LEN CONFIG_PACKET_MAX_SEG_LEN
/* Fill in packet header field offsets for inline functions */
-const _odp_packet_inline_offset_t _odp_packet_inline ODP_ALIGNED_CACHE = {
+const _odp_packet_inline_offset_t _odp_packet_inline ODP_ALIGNED_CACHE
__attribute__ ((visibility ("default"))) = {
.data = offsetof(odp_packet_hdr_t, buf_hdr.seg[0].data),
.seg_len = offsetof(odp_packet_hdr_t, buf_hdr.seg[0].len),
.frame_len = offsetof(odp_packet_hdr_t, frame_len),
After this patch:
$ objdump -t ../ODP/lib/libodp-linux.so | grep _odp_packet_inline
000000000003b080 g O .rodata 0000000000000070
_odp_packet_inline
So, should this now be fixed in ODP or should I do something
differently when compiling and linking ODP apps against ODP
without ABI compatibility?
Janne