Android 6.0 Libc库中的弱引用使用

关于强弱符号,强弱引用可查看关于C语言中的强符号、弱符号、强引用和弱引用 ,这里记录一下目前更新到Android 6.0 在libc库中遇到的弱引用失效问题。

Libc库编译

可查看android 源码下的\bionic\libc\Android.mk

# Don't re-export new/delete and friends, even if the compiler really wants to.
LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/libc.map

相对之前的5.1多了这个链接FLAGS,传递给链接ld 额外参数用的
看下传下去的 libc.map:

LIBC {
  global:
    __assert;
    __assert2;
    __atomic_cmpxchg; # arm
    __atomic_dec; # arm
    __atomic_inc; # arm
    __atomic_swap; # arm
    __b64_ntop;
    __b64_pton;
    __brk; # arm x86 mips
    __cmpdf2; # arm
    __cmsg_nxthdr;
    __connect; # arm x86 mips
    __ctype_get_mb_cur_max;
    __cxa_atexit;
    __cxa_finalize;
    __cxa_thread_atexit_impl;
    __divdf3; # arm
    __divdi3; # arm x86 mips
    __divsf3; # arm
    __divsi3; # arm
    ...
    }

libc.so中允许出现的符号全部都定义出来了,也就意味着如果不在这个定义表中,最终生成的libc也就不带,无论强弱引用 都不行

nm命令查看符号

最终验证自己的函数有没有被加到库中,可以使用nm命令来查看,像可执行二进制,动静态库都可以
nm命令规则如下:
nm [option(s)] [file(s)]

有用的options:

-A 在每个符号信息的前面打印所在对象文件名称;
-C 输出demangle过了的符号名称;
-D 打印动态符号;
-l 使用对象文件中的调试信息打印出所在源文件及行号;
-n 按照地址/符号值来排序;
-u 打印出那些未定义的符号;

常见的符号类型:

A 该符号的值在今后的链接中将不再改变;
B 该符号放在BSS段中,通常是那些未初始化的全局变量;
D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
T 该符号放在代码段中,通常是那些全局非静态函数;
U 该符号未定义过,需要自其他对象文件中链接进来;
W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

注意几点:

-C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc。
使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值