首页 > 解决方案 > 交叉编译qemu for android错误

问题描述

我正在使用 ndk-10e 编译 qemu2.5.0。我已经成功地为 android 编译了 glib。我的配置命令是这样的:

PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig" ./configure -- 
prefix="$SYSROOT/usr" --target-list=arm-linux-user --disable-system -- 
disable-bsd-user --disable-tools --disable-zlib-test --cross- 
prefix="arm-linux-androideabi-" --cc="$NDK/toolchains/arm-linux- 
androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc" - 
-host-cc="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux- 
x86_64/bin/arm-linux-androideabi-gcc" --cpu="arm" -- 
cxx="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux- 
x86_64/bin/arm-linux-androideabi-g++" --extra-ldflags="-fPIE -pie -- 
sysroot $SYSROOT -L$NDK/toolchains/arm-linux-androideabi- 
4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9/ - 
L$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/ - 
L$NDK/platforms/android-21/arch-arm/usr/lib" --extra-cflags="-fPIE - 
pie --sysroot $SYSROOT -I$NDK/sources/cxx-stl/gnu- 
libstdc++/4.9/include -I$NDK/sources/cxx-stl/gnu- 
libstdc++/4.9/libs/armeabi/include -L$NDK/sources/cxx-stl/gnu- 
libstdc++/4.9/libs/armeabi/" --disable-guest-agent

当我输入“make”时,它给了我这个错误。

> CHK 版本_gen.h
  CC arm-linux-user/linux-user/syscall.o
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:374:16:错误:“gettid”的静态声明遵循非静态声明
 _syscall0(int, gettid)
                ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:303:13:注意:在宏'_syscall0'的定义中
 静态类型名称 (void) \
             ^
在 /home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:27:0 包含的文件中:
/home/sam/Documents/android-ndk-r10e/platforms/android-21/arch-arm/usr/include/unistd.h:57:15:注意:以前的“gettid”声明在这里
 extern pid_t gettid(void) __pure2;
               ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数“gettid”中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:374:1:警告:函数'syscall'的隐式声明[-Wimplicit-function-declaration]
 _syscall0(int, gettid)
 ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:374:1:警告:“系统调用”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'lock_iovec'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2050:30: error: 'IOV_MAX' undeclared (第一次在这个函数中使用)
     如果(计数 IOV_MAX){
                              ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2050:30:注意:每个未声明的标识符对于它出现的每个函数只报告一次
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'target_to_host_ipc_perm'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2703:12:错误:“struct ipc_perm”没有名为“__key”的成员
     host_ip->__key = tswap32(target_ip->__key);
            ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2716:12:错误:“struct ipc_perm”没有名为“__seq”的成员
     host_ip->__seq = tswap16(target_ip->__seq);
            ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'host_to_target_ipc_perm'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2731:39:错误:“struct ipc_perm”没有名为“__key”的成员
     target_ip->__key = tswap32(host_ip->__key);
                                       ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2744:39:错误:“struct ipc_perm”没有名为“__seq”的成员
     target_ip->__seq = tswap16(host_ip->__seq);
                                       ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在顶层:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2815:7:错误:重新定义'union semun'
 工会semun {
       ^
在 /home/sam/Documents/android-ndk-r10e/platforms/android-21/arch-arm/usr/include/sys/sem.h:32:0 包含的文件中,
                 来自/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:59:
/home/sam/Documents/android-ndk-r10e/platforms/android-21/arch-arm/usr/include/linux/sem.h:55:7:注意:最初定义在这里
 工会semun {
       ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'target_to_host_semarray'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2840:5:警告:函数'semctl'的隐式声明[-Wimplicit-function-declaration]
     ret = semctl(semid, 0, IPC_STAT, semun);
     ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2840:5:警告:'semctl'的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_semop'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3002:5:警告:函数'semop'的隐式声明[-Wimplicit-function-declaration]
     返回 get_errno(semop(semid, sops, nsops));
     ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3002:5:警告:“semop”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'target_to_host_msqid_ds'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3041:12:错误:“struct msqid_ds”没有名为“__msg_cbytes”的成员
     host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes);
            ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'host_to_target_msqid_ds'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3062:46:错误:“struct msqid_ds”没有名为“__msg_cbytes”的成员
     target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes);
                                              ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_msgctl'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3114:9:警告:函数'msgctl'的隐式声明[-Wimplicit-function-declaration]
         ret = get_errno(msgctl(msgid, cmd, &dsarg));
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3114:9:警告:“msgctl”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_msgsnd'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3157:5:警告:函数'msgsnd'的隐式声明[-Wimplicit-function-declaration]
     ret = get_errno(msgsnd(msqid, host_mb, msgsz, msgflg));
     ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3157:5:警告:“msgsnd”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_msgrcv'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3177:5:警告:函数'msgrcv'的隐式声明[-Wimplicit-function-declaration]
     ret = get_errno(msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
     ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3177:5:警告:“msgrcv”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_shmctl'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3302:9:警告:函数'shmctl'的隐式声明[-Wimplicit-function-declaration]
         ret = get_errno(shmctl(shmid, cmd, &dsarg));
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3302:9:警告:'shmctl'的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_shmat'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3343:9:警告:函数'shmat'的隐式声明[-Wimplicit-function-declaration]
         host_raddr = shmat(shmid, (void *)g2h(shmaddr), shmflg);
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3343:9:警告:“shmat”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3343:20:警告:赋值使指针从整数而不进行强制转换
         host_raddr = shmat(shmid, (void *)g2h(shmaddr), shmflg);
                    ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3353:24:警告:赋值使指针从整数而不进行强制转换
             host_raddr = shmat(shmid, g2h(mmap_start), shmflg | SHM_REMAP);
                        ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_shmdt'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3391:5:警告:函数“shmdt”的隐式声明[-Wimplicit-function-declaration]
     返回 get_errno(shmdt(g2h(shmaddr)));
     ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3391:5:警告:“shmdt”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_ipc'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3413:9:警告:函数'semget'的隐式声明[-Wimplicit-function-declaration]
         ret = get_errno(semget(第一,第二,第三));
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3413:9:警告:'semget'的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3426:9:警告:函数'msgget'的隐式声明[-Wimplicit-function-declaration]
         ret = get_errno(msgget(first, second));
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3426:9:警告:“msgget”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3484:2:警告:函数'shmget'的隐式声明[-Wimplicit-function-declaration]
  ret = get_errno(shmget(第一,第二,第三));
  ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:3484:2:警告:“shmget”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:在函数'do_syscall'中:
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6241:13:警告:函数“时间”的隐式声明 [-Wimplicit-function-declaration]
             ret = get_errno(stime(&host_time));
             ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6241:13:警告:“时间”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6318:13:警告:函数'futimesat'的隐式声明[-Wimplicit-function-declaration]
             ret = get_errno(futimesat(arg1, path(p), tvp));
             ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6318:13:警告:“futimesat”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6686:13:警告:函数'sigorset'的隐式声明[-Wimplicit-function-declaration]
             sigorset(&set, &set, &cur_set);
             ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6686:13:警告:'sigorset'的嵌套外部声明[-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6870:13:警告:函数'sigtimedwait'的隐式声明[-Wimplicit-function-declaration]
             ret = get_errno(sigtimedwait(&set, &uinfo, puts));
             ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6870:13:警告:“sigtimedwait”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6908:9:警告:函数'sethostname'的隐式声明[-Wimplicit-function-declaration]
         ret = get_errno(sethostname(p, arg2));
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:6908:9:警告:“sethostname”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:7627:9:警告:函数'vhangup'的隐式声明[-Wimplicit-function-declaration]
         ret = get_errno(vhangup());
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:7627:9:警告:'vhangup'的嵌套外部声明[-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:7794:9:警告:函数“setdomainname”的隐式声明 [-Wimplicit-function-declaration]
         ret = get_errno(setdomainname(p, arg2));
         ^
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:7794:9:警告:“setdomainname”的嵌套外部声明 [-Wnested-externs]
/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:9280:9:警告:函数“预读”的隐式声明 [-Wimplicit-function-declaration]
         ret = get_errno(预读(arg1,((off64_t)arg3

有一些奇怪的东西,比如

/home/sam/Documents/qemu-2.5.0/linux-user/syscall.c:2703:12:错误:“struct ipc_perm”没有名为“__key”的成员 host_ip->__key = tswap32(target_ip->__key) ; 我不知道如何解决它。任何人都可以帮忙吗?

标签: androidcross-compilingqemu

解决方案


这将是以下各项的混合:

  • 2.5 是一个相当老的 QEMU 版本;您可能会在使用上游已修复的较新/不同版本的 libc 进行编译时遇到错误。从使用较新的版本开始。
  • 您正在针对 Android libc(仿生)构建,它不是经过测试或支持的 libc 构建。与 glibc(标准 Linux libc)相比,它存在差异或特性的地方,您需要更改 QEMU 以解决这些问题。

例如关于 __key 的错误,问题是 Bionic 在 struct ipc_perm 中将该字段的版本命名为“key”,而不是“__key”。


推荐阅读