On 03/09/2017 01:31 PM, Bill Fischofer wrote:
This also points out a problem with our CI loops in that they don't do test
builds from installed copies of the ODP shared library.

we do it somewhere but results are not very visible. At least we do not see them on main page and do not test all functions. It makes sense to compile odp examples based on installed odp library. Not just providing include/link paths to build dir. I think only in that case we can be sure that all symbols
are present in result library.


Maxim.

On Thu, Mar 9, 2017 at 11:30 AM, Bill Fischofer <[email protected]>
wrote:

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) <
[email protected]> 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