1

我一直在研究以下问题:

在我看来,这可以用弱符号来解决。也就是说,本机组件可以提供类似的符号,rand但用__attribute__((weak)). 如果在另一个库中找到该符号,例如标准运行时,则不会使用弱链接符号。另一方面,如果缺少符号,则将使用本机组件的版本。

我无法在其上查找适用于 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未定义,因此它的混合信号(可能是一个错误,类似于使用 -fno-weak 时将GXX_WEAK定义为 0 )。SUPPORTS_WEAK

我不确定我是否做错了什么,或者在 c++ 代码中遇到了 const 和 weak 属性之类的东西,或者其他的东西。

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


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


一些系统细节:

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

2 回答 2

2

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

请注意,这不是 android 特定的,对于 ld-linux.so/ld 也是如此:

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

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

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

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

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

| main.executable <- foo() 的弱 (WEAK) 定义
| -> lib1.so <- foo() 的强(默认)定义
| -> lib2.so <- 使用 foo()

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

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

于 2015-01-15T23:40:17.443 回答
1

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

于 2015-01-15T19:37:40.570 回答