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


Reply via email to