Android Bionic中__LIBC_HIDDEN__宏的作用是什么?
__LIBC_HIDDEN__是Android Bionic libc用于控制符号可见性的宏,核心作用是将修饰的函数/变量标记为仅在libc内部可见,外部程序或库无法直接引用这些符号。
具体细节:
- 它本质上是GCC/Clang的
__attribute__((visibility("hidden")))属性的封装,在Bionic的构建系统中会被展开为对应编译器的可见性属性。 - 被该宏修饰的符号不会被导出到libc的动态符号表中,带来两个关键影响:
- 外部代码无法通过动态链接调用这些函数,也不能通过
dlsym等方式获取它们的地址。 - libc内部可以自由调用这些函数,后续版本中修改函数签名甚至移除该函数,都不会影响依赖libc的外部程序,避免了ABI(应用二进制接口)兼容性问题。
- 外部代码无法通过动态链接调用这些函数,也不能通过
结合你提供的代码场景:
你看到的两个__futex_wait_ex函数:
- 带
static inline的版本是对外的轻量封装,直接调用底层的__futex函数,没有超时参数。 - 带
__LIBC_HIDDEN__的版本是libc内部实现的完整版本,支持超时参数,是libc内部其他模块会调用的实现,但不会暴露给外部程序。崩溃回溯中出现这个函数,说明崩溃发生在libc内部调用这个隐藏函数的过程中。
内容的提问来源于stack exchange,提问作者Mauricio Schalch
相关产品推荐
相关产品推荐

