该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以用任意合适的gcc(能产生cpu兼容代码即可)编译在你手机上跑的应用,步骤大体是:
1、拷出/system/lib/下的库
2、弄清手机上动态链接的解释器,readelf -l 某系统组件,INTERP提示的文件就是
3、gcc带参数:-nostdlib(不使用默认的gcc默认的libc和_start实现),-L(指出拷出的库位置),-Wl,--dynamic-linker=xxxxx(根据2,指出解释器路径),-l(各种-l,按需添加)
4、实现_start。简单从bionic拷出一段即可使用:
#include
#include
typedef struct {
void (**preinit_array)(void);
void (**init_array)(void);
void (**fini_array)(void);
} structors_array_t;
extern void __libc_init(void* raw_args,
void (*onexit)(void),
int (*slingshot)(int, char**, char**),
structors_array_t const* const structors);
__attribute__ ((section (".preinit_array")))
void (*__PREINIT_ARRAY__)(void) = (void (*)(void)) -1;
__attribute__ ((section (".init_array")))
void (*__INIT_ARRAY__)(void) = (void (*)(void)) -1;
__attribute__ ((section (".fini_array")))
void (*__FINI_ARRAY__)(void) = (void (*)(void)) -1;
void _start() {
structors_array_t array;
array.preinit_array = &__PREINIT_ARRAY__;
array.init_array = &__INIT_ARRAY__;
array.fini_array = &__FINI_ARRAY__;
void* raw_args = (void*) ((uintptr_t) __builtin_frame_address(0) + sizeof(void*));
__libc_init(raw_args, NULL, &main, &array);
}
不过这样一来,只有考出的库能用,需要新的库,得自己编译生成。怪麻烦的