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
>
>
>

Reply via email to