Android 5.0 Binder编译问题及解决方案

本文介绍在将Hookbinder通信的ioctl函数移植到Android 5.0时遇到的问题及其解决方案。主要原因是编译环境默认为64位,而运行环境为32位,导致binder_write_read结构体大小不匹配。通过定义BINDER_IPC_32BIT解决了该问题。


Android 5.0 Binder编译问题及解决方案


       小编最近在把Hook binder通信的ioctl函数部分移植到android5.0时,遇到了以下问题并得到如下解决方案。

       代码如下:

int new_ioctl (int __fd, unsigned long int __request, void * arg)
{
        LOGV("New ioctl called!%x,%x= BINDER_WRITE_READ \n",__request,BINDER_WRITE_READ);
	if ( __request == BINDER_WRITE_READ )
        {
              …
        }
        int res = (*old_ioctl)(__fd, __request, arg);
        return res;
}

       通过log信息可发现程序运行时__request = 0xc0186201,而BINDER_WRITE_READ = 0xc0306201。

       程序是在Ubuntu64 14.04.1 Android 5.0.0源码编译环境下编译的,运行环境是Google Nexus 6 Android 5.0 32位。

       通过查看源码可知,0x18代表binder_write_read结构体在手机运行时的大小,而0x30代表binder_write_read结构体在编译时的大小。

#define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read)
#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
#define _IOC(dir,type,nr,size)   (((dir) << _IOC_DIRSHIFT) |   ((type) << _IOC_TYPESHIFT) |   ((nr) << _IOC_NRSHIFT) |   ((size) << _IOC_SIZESHIFT))
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_TYPEBITS 8
#define _IOC_NRBITS 8
#define _IOC_NRSHIFT 0

       由此可知,在源码编译环境下binder通信部分默认编译为64位。

       从源码http://androidxref.com./5.0.0_r2/xref/bionic/libc/kernel/uapi/linux/binder.h中也可发现android5.0.0新增加以下内容:

#ifdef BINDER_IPC_32BIT
typedef __u32 binder_size_t;
typedef __u32 binder_uintptr_t;
#else
typedef __u64 binder_size_t;
typedef __u64 binder_uintptr_t;
#endif

       因而在编译时需加入 #define BINDER_IPC_32BIT

       最后分享一下android5.0源码编译的classes.jar吧微笑

       http://download.youkuaiyun.com/detail/phoebe_2012/8700753




评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值