我在用NDK交叉编译qemu的时候,老是报错如下内容:

aarch64-linux-android29-clang  -o subprojects/libvhost-user/link-test subprojects/libvhost-user/link-test.p/link-test.c.o -Wl,--as-needed -Wl,--no-undefined -pie -Wl,--whole-archive -Wl,--start-group subprojects/libvhost-user/libvhost-user.a -Wl,--end-group -Wl,--no-whole-archive -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -pthread
ld: error: undefined symbol: memfd_create
>>> referenced by libvhost-user.c:1670 (../subprojects/libvhost-user/libvhost-user.c:1670)
>>>               libvhost-user.a.p/libvhost-user.c.o:(vu_dispatch) in archive subprojects/libvhost-user/libvhost-user.a
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)

该问题是在编译qemu下面的子模块~/qemu-7.0.0/subprojects/libvhost-user里面的libvhost-user.c文件报的错。我在~/qemu-7.0.0目录下搜索memfd_create这个函数,如下:

find . -name "*"|xargs grep memfd_create 2>/dev/null |grep int 
./include/qemu/memfd.h:int memfd_create(const char *name, unsigned int flags);
./include/qemu/memfd.h:int qemu_memfd_create(const char *name, size_t size, bool hugetlb,
./meson.build:  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
./build2/meson-logs/meson-log.txt:  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }
meson.build:  int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
./util/memfd.c:int memfd_create(const char *name, unsigned int flags)
./util/memfd.c:int qemu_memfd_create(const char *name, size_t size, bool hugetlb,
./util/memfd.c:    int mfd = qemu_memfd_create(name, size, false, 0, seals, NULL);
./util/memfd.c:    int mfd = memfd_create("test", flags | MFD_CLOEXEC);

memfd_create这个函数在memfd.h和memfd.c:文件中都有定义,我在去查看~/qemu-7.0.0/subprojects/libvhost-user/ibvhost-user.c里面根本没有包含该头文件memfd.h,而是包含了#include <sys/mman.h>这个头文件,该头文件是linux定义memfd_create的头文件。所以ibvhost-user.c用的是linux里面的定义。

接下来我们分析为何会报这个错误:

首先我们在linux上面man 一下memfd_create,有如下信息:

VERSIONSThe memfd_create() system call first appeared in Linux 3.17; glibc sup‐port was added in version 2.27.CONFORMING TOThe memfd_create() system call is Linux-specific.

这里我翻译一下,大概意思是说,memfd_create这个函数最早出现在linux3.17版本,glibc2.27版本添加该函数,并且该函数是linux特有的。

我用的qemu构建命令是:

PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig" ../configure --prefix=/home/dubu/installtest --target-list=aarch64-softmmu --cpu=aarch64 --cross-prefix=aarch64-linux-android21- --cc=aarch64-linux-android21-clang --cxx=aarch64-linux-android21-clang++ --host-cc=aarch64-linux-android21-gcc --enable-gettext --enable-iconv --enable-kvm --enable-pie --enable-gio --enable-qcow1 --enable-vhost-user

我用的编译器的api级别是21,后来我在NDK的sysroot目录下搜索那些文件包含该函数:

find . -name "*"|xargs grep memfd_create 2>/dev/null

结果如下:

匹配到二进制文件 ./lib/aarch64-linux-android/33/libc.so
匹配到二进制文件 ./lib/aarch64-linux-android/32/libc.so
匹配到二进制文件 ./lib/aarch64-linux-android/30/libc.so
匹配到二进制文件 ./lib/aarch64-linux-android/libc.a
匹配到二进制文件 ./lib/aarch64-linux-android/31/libc.so
匹配到二进制文件 ./lib/x86_64-linux-android/33/libc.so
匹配到二进制文件 ./lib/x86_64-linux-android/32/libc.so
匹配到二进制文件 ./lib/x86_64-linux-android/30/libc.so
匹配到二进制文件 ./lib/x86_64-linux-android/libc.a
匹配到二进制文件 ./lib/x86_64-linux-android/31/libc.so
匹配到二进制文件 ./lib/i686-linux-android/33/libc.so
匹配到二进制文件 ./lib/i686-linux-android/32/libc.so
匹配到二进制文件 ./lib/i686-linux-android/30/libc.so
匹配到二进制文件 ./lib/i686-linux-android/libc.a
匹配到二进制文件 ./lib/i686-linux-android/31/libc.so
匹配到二进制文件 ./lib/arm-linux-androideabi/33/libc.so
匹配到二进制文件 ./lib/arm-linux-androideabi/32/libc.so
匹配到二进制文件 ./lib/arm-linux-androideabi/30/libc.so
匹配到二进制文件 ./lib/arm-linux-androideabi/libc.a
匹配到二进制文件 ./lib/arm-linux-androideabi/31/libc.so

然后在执行nm -D ./lib/aarch64-linux-android/33/libc.so|grep memfd_create,执行该命令是查看该动态库定义了那些函数,结果如下:

0000000000020940 T memfd_create

此结果表明只有api级别是30以后才支持该函数,所以我就把api级别调到了30以上。

最终构建qemu的命令为:

PKG_CONFIG_PATH="$SYSROOT/usr/lib/pkgconfig" ../configure --prefix=/home/dubu/installtest --target-list=aarch64-softmmu --cpu=aarch64 --cross-prefix=aarch64-linux-android33- --cc=aarch64-linux-android33-clang --cxx=aarch64-linux-android33-clang++ --host-cc=aarch64-linux-android33-gcc --enable-gettext --enable-iconv --enable-kvm --enable-pie --enable-gio --enable-qcow1 --enable-vhost-user

然后该问题就解决了。

NDK交叉编译qemu报错:undefined symbol: memfd_create相关推荐

  1. undefined symbol nvic 报错 undefined symbol TIM_Cmd报错

    目录 undefined symbol nvic 报错 undefined symbol TIM_Cmd报错 undefined symbol nvic 报错 原因是在FWLB文件夹中未加入misc. ...

  2. R语言readxl或者tidyverse安装报错undefined symbol libiconv

    我的生物信息专栏正式开启啦!!!为广大生物信息爱好者提供生信支持:拿来即可免安装部署到服务器的生信pipeline:R,python,C语言等包的debug:优秀文献内容解读等,欢迎订阅关注!!! 文 ...

  3. sslocal 报错undefined symbol: EVP_CIPHER_CTX_cleanup

    sslocal 报错undefined symbol: EVP_CIPHER_CTX_cleanup INFO: loading config from /etc/shadowsocks.json 2 ...

  4. conda安装bowtie2的报错:undefined symbol

    使用conda安装bowtie2遇到undefined symbol报错 /public/home/xuzhougeng/miniconda3/envs/bsseq/bin/bowtie2-build ...

  5. 【2020-06-16】CentOS8下yum安装nginx,systemctl start nginx报错undefined symbol: FT_Done_MM_Var

    这几天自己在家组了个机子,装了带GNOME的CentOS8.昨天整了个一键安装lnmp,中途报错.重启系统的时候发现我GNOME起不来了(不确定这是否与安装lnmp报错有关).于是先直接进入命令行系统 ...

  6. .php on line 0,控制台运行php报错 undefined symbol: gdImageCreateFromJpeg in Unknown on line 0 解决方法...

    之前把homestead中的nginx替换为openresty后就发现php控制台运行时会报一个错: undefined symbol: gdImageCreateFromJpeg in Unknow ...

  7. 编译报错undefined symbol: vtable for

    报错:undefined symbol: vtable for 原因:结构体/类中的某个方法不是纯虚函数,而且没有被定义. 解决方法:找到这个没有被定义的函数,然后定义即可.

  8. PHP扩展undefined symbol,基于phpx的扩展运行报错undefined symbol

    使用phpx写了一个简单的容器,想放到php中运行做点测试.我在这之前已经成功的写了一个dispatch_function注册到了swoole中,而且运行正常. 后面我又写了个C++类,新建了个PHP ...

  9. 报错 undefined symbol: _ZN6caffe26detail36_typeMetaDataInstance_preallocated_7E

    主要是pytorch版本的问题. 重新安装即可. 不需要卸载之前的,安装时会自动覆盖. 我安装了0.4.0的版本,你可以根据自己的情况安装需要的版本. pip install torch==0.4.0 ...

最新文章

  1. MySQL数据库开发常见问题及几点优化!
  2. Linux压缩/解压缩
  3. 冯诺依曼计算机程序及其执行,第4章冯.诺依曼计算机:机器级程序与其执行练习题答案解析...
  4. 【通知】《深度学习之模型设计》第三次重印,欢迎读者支持!
  5. new LayoutParams 使用
  6. 【今晚9点】:对话袁荣喜——一名C程序员的打怪之路
  7. 微信小程序自定义组件方案
  8. 【Java】计算从你的出生日期到现在相隔了多少天,多少时,XX分,XX秒。
  9. 1313 质因数分解
  10. 攻城掠地sdk服务器没有响应,攻城掠地没落的原因及对策
  11. java多个数据库_java – 我们可以有多个dataSources到单个数据库
  12. python通过什么对象连接数据库_干货!python与MySQL数据库的交互实战
  13. [Spring-cloud-eureka]使用 gradle, spring boot,Spring cloud Eureka 搭建服务提供者
  14. WTL学习笔记(5)系统皮肤管理
  15. Linux Oracle卸载步骤
  16. aseprite 中心对称绘制脚本
  17. Android绘制圆形图片的3个方法
  18. 大数据笔记--Hadoop(第五篇)
  19. 企业微信登录不了怎么办 企业微信无法登录的原因及解决方法
  20. C/C++编程:写了placement new也要写placement delete

热门文章

  1. 隔离技术之MUX VLAN
  2. java课程论文_Java课程论文.doc
  3. Dual Graph Attention Networks for Deep Latent Representation of Multifaceted Social...》论文学习笔记
  4. Mybatis最拿得出手的功能之一 SpringBoot整合Mybatis-Plus 实战之动态SQL
  5. 如何用Vue开发前端和网站
  6. uniapp中的分享功能实现(APP,小程序,公众号)
  7. 一种简单的MOS管直流电机驱动电路
  8. 04 cefsharp谷歌浏览器多开页面的实现
  9. 解决 Minecraft 官方启动器 报错找不到 launcher.dll / LoadErrorNotPresent 的解决方法
  10. kinit什么意思_kinit