【问题标题】:Does Android support weak symbols?Android 是否支持弱符号?
【发布时间】:2015-03-12 04:21:11
【问题描述】:

我一直在研究以下问题:

在我看来,这可以通过weak symbols 解决。也就是说,本机组件可以提供像rand 这样的符号,但用__attribute__((weak)) 装饰它们。如果符号在另一个库中找到,比如标准运行时,那么弱链接符号将 not 被使用。另一方面,如果缺少符号,则将使用本机组件的版本。

我无法在其上查找适用于 Android 的信息(搜索时不相关的噪音过多)。

我打开了我的 Crypto++/JNI 示例项目之一,并将以下内容添加到 CPP 文件中。 AutoSeededRandomPool 只是一个 Crypto++ 随机数生成器对象(下面没有什么特别或棘手的)。

// CPP file

#ifdef __cplusplus
extern "C" {
#endif

int __attribute__((weak)) rand(void)
{
    int r;

    AutoSeededRandomPool& prng = GetPRNG();
    prng.GenerateBlock(&r, sizeof(r));

    return r;
}

#ifdef __cplusplus
}
#endif

尝试编译它会导致redefinition of int rand()。我还尝试了以下方法:

// CPP file

#ifdef __cplusplus
extern "C" {
#endif

int rand(void) __attribute__((weak));

int random(void)
{
   ...
}

#ifdef __cplusplus
}
#endif

int rand(void) __attribute__((weak)); 移动到H 文件会产生相同的redefinition of int rand()

而且我没有收到任何关于未知属性的错误或警告。

我还看到__GXX_WEAK__ 在预处理器中被定义为1,但是SUPPORTS_WEAK没有定义的,所以它的混合信号(可能是一个错误,类似于Define GXX_WEAK to 0 when using -fno-weak) .

我不确定我是不是做错了什么,或者遇到了const and weak attribute with c++ code 之类的问题,或者其他什么。

Android 是否支持弱符号?如果是这样,如何使用它们。


这里有一个没有答案的类似 Stack Overflow 问题:


一些系统细节:

  • 基本系统是 Mac OS X 10.8.5,已完全修补
  • Eclipse 4.4.1 (Luna),已完全修补
  • Android NDK 修订版 10d
  • GCC 4.9 交叉编译器

【问题讨论】:

  • 您使用的是什么 API 级别?在 pre-21 rand() 是一个内联函数,所以这将是你的多重定义。

标签: android c++ android-ndk weak-linking


【解决方案1】:

tl;博士; Android 确实支持弱符号

请注意,这不是特定于 android 的,它同样适用于 ld-linux.so/ld:

这需要澄清一下,因为有两种使用弱符号的情况:

  1. 静态库/目标文件
  2. 动态库/可执行文件

(1) 静态库和目标文件可以定义多个弱符号,并在编译时链接最终对象(.so 或可执行文件)时选择正确的一个(最强或拳头)。

(2) 对于动态库,弱符号的行为方式与默认符号相同,但有一个例外。这意味着共享库不存在弱符号覆盖之类的东西。换句话说,在重定位/dlsym() 期间,将返回第一个找到的 (GLOBAL) 符号:弱或默认。

例如(这里我们假设没有一个对象是-Bsymbolic,这是另一个例外):

| main.executable | -> lib1.so | -> lib2.so

lib2.so 将使用 main.executalbe 的 foo() 实现,尽管 lib1.so 导出 DEFAULT foo() 的速度很快。

例外是在运行时链接过程中允许 WEAK 符号保持未解析,并在大多数有用的情况下导致空引用......当未解析的 DEFAULT 符号运行时链接器失败时。

【讨论】:

    【解决方案2】:

    Android 不支持弱符号覆盖。

    在最近发布的 android-5.0.2_r1 中, 请参阅linker.cpp 源代码中第 539 行的注释

    /*
     *
     * 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.
     */
    

    此评论存在于版本 2.2_r1(位于 linker.c)到最新版本 5.0.2_r1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2019-08-18
      • 2010-12-16
      • 2015-01-03
      • 2018-03-26
      相关资源
      最近更新 更多