Different behavior of override weak function in shared library between OS X and Android

前端 未结 2 832
Happy的楠姐
Happy的楠姐 2020-12-10 09:16

I am encountering a different behavior between OS X and Android:

  • There is a weak function foo in my shared library,
  • I want to override it
相关标签:
2条回答
  • 2020-12-10 09:54

    Android doesn't support weak symbol override.

    In the recent release android-5.0.2_r1, see the comment at line 539 in linker.cpp source code

    /*
     *
     * Notes on weak symbols:
     * The ELF specs are ambigious about treatment of weak definitions in
     * dynamic linking.  Some systems return the first definition found
     * and some the first non-weak definition.   This is system dependent.
     * Here we return the first definition found for simplicity.
     */
    

    This comment exists from version 2.2_r1 (which is in linker.c) to newest version 5.0.2_r1

    0 讨论(0)
  • 2020-12-10 09:57

    Android dynamic linker does in fact support weak symbols. The problem is this particular case is that library is compiled with -Bsymbolic (to check this run "readelf -d libshared.so").

    The work around this is to use '-Wl,-shared' instead of '-shared' when linking the library.

    Please see https://code.google.com/p/android/issues/detail?id=68956 for details and workaround.

    0 讨论(0)
提交回复
热议问题