Looks like you found a legit bug, however I'd fix this by adding an ODP_VISIBLE macro and using that rather than directly using the __attribute__ on this struct. That keeps things consistent with other ODP indirect specification of attributes.
On Wed, Mar 8, 2017 at 5:57 PM, Peltonen, Janne (Nokia - FI/Espoo) < janne.pelto...@nokia.com> wrote: > 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 > > >