使用android ndk编译busybox

busybox下载地址

我使用的版本是v1.20.1

 

android ndk下载安装

下载地址

我使用的是android-ndk-r16b-linux-x86_64.zip

 

安装工具链

解压压缩包后,使用以下命令安装

/home/cyk/OTA/android-ndk-r16b/build/tools/make_standalone_toolchain.py \
    --arch arm \
    --api 16   \
    --install-dir=/home/cyk/android_toolchain

arch 对应架构

api-16 对应安卓版本4.1.x 具体可以查看下面这张图

install-dir对应安装的目录

 

 

 

 

busybox编译

1)环境设置

export PATH=$PATH:/home/cyk/android_toolchain/bin 

2)修改编译配置

打开android2_defconfig

CONFIG_CROSS_COMPILER_PREFIX=" arm-eabi-"

改为

CONFIG_CROSS_COMPILER_PREFIX="arm-linux-androideabi-"

3)修改sysroot路径

在CONFIG_CROSS_COMPILER_PREFIX下再添加一行:

CONFIG_SYSROOT="/home/cyk/android_toolchain/sysroot/"

 

3)编译

make android2_defconfig

make

make install  -> 会安装到当前目录下的_install目录

 

错误解决

编译出现undefined reference to 'srand'等错误

Failed: -Wl,--start-group -lm -Wl,--end-group
Output of:
arm-linux-androideabi-gcc -Wall -Wshadow -Wwrite-strings -Wundef -Wstrict-prototypes -Wunused -Wunused-parameter -Wunused-function -Wunused-value -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement -Wold-style-definition -fno-builtin-strlen -finline-limit=0 -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-guess-branch-probability -funsigned-char -static-libgcc -falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1 -Os --sysroot=/home/cyk/android_toolchain/sysroot/ -o busybox_unstripped -Wl,--sort-common -Wl,--gc-sections -Wl,--start-group applets/built-in.o archival/lib.a archival/libarchive/lib.a console-tools/lib.a coreutils/lib.a coreutils/libcoreutils/lib.a debianutils/lib.a e2fsprogs/lib.a editors/lib.a findutils/lib.a init/lib.a libbb/lib.a libpwdgrp/lib.a loginutils/lib.a mailutils/lib.a miscutils/lib.a modutils/lib.a networking/lib.a networking/libiproute/lib.a networking/udhcp/lib.a printutils/lib.a procps/lib.a runit/lib.a selinux/lib.a shell/lib.a sysklogd/lib.a util-linux/lib.a util-linux/volume_id/lib.a archival/built-in.o archival/libarchive/built-in.o console-tools/built-in.o coreutils/built-in.o coreutils/libcoreutils/built-in.o debianutils/built-in.o e2fsprogs/built-in.o editors/built-in.o findutils/built-in.o init/built-in.o libbb/built-in.o libpwdgrp/built-in.o loginutils/built-in.o mailutils/built-in.o miscutils/built-in.o modutils/built-in.o networking/built-in.o networking/libiproute/built-in.o networking/udhcp/built-in.o printutils/built-in.o procps/built-in.o runit/built-in.o selinux/built-in.o shell/built-in.o sysklogd/built-in.o util-linux/built-in.o util-linux/volume_id/built-in.o -Wl,--end-group -Wl,--start-group -lm -Wl,--end-group
==========
libbb/lib.a(xfuncs.o):xfuncs.c:function tcsetattr_stdin_TCSANOW: error: undefined reference to 'tcsetattr'
mailutils/lib.a(makemime.o):makemime.c:function makemime_main: error: undefined reference to 'srand'
mailutils/lib.a(makemime.o):makemime.c:function makemime_main: error: undefined reference to 'rand'
mailutils/lib.a(makemime.o):makemime.c:function makemime_main: error: undefined reference to 'rand'
mailutils/lib.a(makemime.o):makemime.c:function makemime_main: error: undefined reference to 'rand'
collect2: error: ld returned 1 exit status
Makefile:715: recipe for target 'busybox_unstripped' failed
make: *** [busybox_unstripped] Error 1

对于这个问题,参考这个https://blog.csdn.net/crazyquhezheng/article/details/79034765

主要是由于在NDK15以后,不支持静态库定义

解决方法:

修改android2_defconfig

CONFIG_EXTRA_CFLAGS=" -D__ANDROID_API__=16" //16为api版本

之后重新编译

 

加载到文件系统中运行出现

/bin/sh: busybox: not found

勾选静态编译 make menuconfig

Symbol: STATIC [=y]                                                                                                           │
  │ Prompt: Build BusyBox as a static binary (no shared libs)                                                                     │
  │   Defined at Config.in:463                                                                                                    │
  │   Location:                                                                                                                   │
  │     -> Busybox Settings                                                                                                       │
  │       -> Build Options 

 

加载系统后无法进入sh

需要打开busybox里的配置

打开ash

 Symbol: ASH [=y]                                                                                                              │
  │ Prompt: ash                                                                                                                   │
  │   Defined at shell/Config.in:9                                                                                                │
  │   Depends on: !NOMMU                                                                                                          │
  │   Location:                                                                                                                   │
  │     -> Shells

选择sh为ash 相当于自动创建一个bin/sh -> busybox

 

 

 

udhcpc 运行时出现Segmentation fault

 

/* Call a script with a par file and env vars */
static void udhcp_run_script(struct dhcp_packet *packet, const char *name)
{
	char **envp, **curr;
	char *argv[3];

	envp = fill_envp(packet);

	/* call script */
	log1("Executing %s %s", client_config.script, name);
	argv[0] = (char*) client_config.script;
	argv[1] = (char*) name;
	argv[2] = NULL;
	spawn_and_wait(argv);

    printf("%s 1 \n",__FUNCTION__);    
	for (curr = envp; *curr; curr++) {
		//log2(" %s", *curr);
		printf("%s 2 \n",__FUNCTION__);
		bb_unsetenv_and_free(*curr);
	    printf("%s 3 \n",__FUNCTION__);
	}
	free(envp);
}

void FAST_FUNC bb_unsetenv(const char *var)
{
    printf("%s var=%p *var=%s \n",__FUNCTION__ , var , *var); //无法运行这句printf 出现段错误
	char *tp = strchr(var, '=');

	printf("%s 1 \n",__FUNCTION__);
	if (!tp) {
		unsetenv(var);
		return;
	}

	/* In case var was putenv'ed, we can't replace '='
	 * with NUL and unsetenv(var) - it won't work,
	 * env is modified by the replacement, unsetenv
	 * sees "VAR" instead of "VAR=VAL" and does not remove it!
	 * horror :( */
	tp = xstrndup(var, tp - var);
	printf("%s 2 \n",__FUNCTION__);
	unsetenv(tp);
	free(tp);
}

void FAST_FUNC bb_unsetenv_and_free(char *var)
{
    printf("%s 1 \n",__FUNCTION__);
	bb_unsetenv(var);
	printf("%s 2 \n",__FUNCTION__);
	free(var);
}

这个问题比较奇怪,后续我直接将从ndk r16b转到r17c 编译出来的busybox 可以使用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值