Ndk交叉编译libfuse3.10.0源码

一. ndk生成交叉编译工具链

请参考:Cargo+Ndk实现Android平台的rust源码交叉编译_u011376563的博客-CSDN博客

的3.1~3.2部分内容

二. 下载libfuse3.10.0源码

youthful@youthful-VirtualBox-Ubuntu:~/test$ git clone https://github.com/libfuse/libfuse.git

注意:本文编译的是3.10.0源码,libfuse源码可能已经更新版本,请下载之后切换到release 3.10.0版本。

三. 下载新版本meson编译工具

libfuse3.10.0默认使用meson+ninja编译源码,所以需要安装这2个编译工具。

meson需要使用0.54及以上版本,直接在github上下载即可:

youthful@youthful-VirtualBox-Ubuntu:~$ mkdir ~/work/meson/
youthful@youthful-VirtualBox-Ubuntu:~$ cd ~/work/meson/
youthful@youthful-VirtualBox-Ubuntu:~/work/meson$ git clone https://github.com/mesonbuild/meson.git

下载之后的meson是一个py脚本:~/work/meson/meson/meson.py,后续交叉编译需要使用该脚本工具。

四. 下载ninja编译工具

youthful@youthful-VirtualBox-Ubuntu:~/work/meson$ sudo apt install ninja-build

五. 修改libfuse源码及配置

5.1. 为meson添加交叉编译配置文件arm64.txt

在libfuse工程根目录创建arm64.txt,该文件用于配置交叉编译工具链及库路径:

[binaries]
c = '<your_toolchain_path_prefix>/bin/aarch64-linux-android30-clang'
cpp = '<your_toolchain_path_prefix>/bin/aarch64-linux-android30-clang++'
ar = '<your_toolchain_path_prefix>/bin/aarch64-linux-android-ar'
strip = '<your_toolchain_path_prefix>/bin/aarch64-linux-android-strip'
ld = '<your_toolchain_path_prefix>bin/aarch64-linux-android-ld.gold'

[properties]
skip_sanity_check = true
sys_root = '<your_toolchain_path_prefix>/sysroot'
c_args = ['-L<your_toolchain_path_prefix>/sysroot/usr/lib/aarch64-linux-android/30']

[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'

[target_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'armv8a'
endian = 'little'

其中,

<your_toolchain_path_prefix>替换为你前面保存ndk生成的交叉工具链的目录,本文为:

/home/work/ndk_standalone_21.4.7075529/arm64

5.2. 修改源码及配置

1)删除example/meson.build,因为不需要示例

2)修改lib/fuse.c:

youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ git diff lib/fuse.c
diff --git a/lib/fuse.c b/lib/fuse.c
index 91a4b70..202d212 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -4876,6 +4876,9 @@ void fuse_stop_cleanup_thread(struct fuse *f)
        }
 }
 
+int pthread_cancel(pthread_t thread) {
+    return pthread_kill(thread, SIGUSR1);
+}

3)修改lib/fuse_loop_mt.c:

youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ git diff lib/fuse_loop_mt.c
diff --git a/lib/fuse_loop_mt.c b/lib/fuse_loop_mt.c
index 8fcc46c..ba303a8 100644
--- a/lib/fuse_loop_mt.c
+++ b/lib/fuse_loop_mt.c
@@ -28,6 +28,23 @@
 /* Environment var controlling the thread stack size */
 #define ENVNAME_THREAD_STACK "FUSE_THREAD_STACK"
 
+#define PTHREAD_CANCEL_ENABLE 1
+#define PTHREAD_CANCEL_DISABLE 0
+
+static int pthread_setcancelstate(int state, int *oldstate) {
+    sigset_t   new, old;
+    int ret;
+    sigemptyset (&new);
+    sigaddset (&new, SIGUSR1);
+
+    ret = pthread_sigmask(state == PTHREAD_CANCEL_ENABLE ? SIG_BLOCK : SIG_UNBLOCK, &new , &old);
+    if(oldstate != NULL)
+    {
+        *oldstate =sigismember(&old, SIGUSR1) == 0 ? PTHREAD_CANCEL_DISABLE : PTHREAD_CANCEL_ENABLE;
+    }
+    return ret;
+}
+
 struct fuse_worker {

4)修改lib/meson.build

youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ git diff lib/meson.build
diff --git a/lib/meson.build b/lib/meson.build
index 98461d8..bc95589 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -10,31 +10,42 @@ else
    libfuse_sources += [ 'mount_bsd.c' ]
 endif
 
-deps = [ thread_dep ]
-if cfg.get('HAVE_ICONV')
-   libfuse_sources += [ 'modules/iconv.c' ]
-   libiconv = cc.find_library('iconv', required: false)
-   if libiconv.found()
-      deps += [ libiconv ]
-   endif
-endif
+# deps = [ thread_dep ]
+# if cfg.get('HAVE_ICONV')
+#    libfuse_sources += [ 'modules/iconv.c' ]
+#    libiconv = cc.find_library('iconv', required: false)
+#    if libiconv.found()
+#       deps += [ libiconv ]
+#    endif
+# endif
+
+deps = []
 
 libdl = cc.find_library('dl', required: false)
 if libdl.found()
    deps += [ libdl ]
 endif
 
-if host_machine.system().startswith('netbsd')
-   deps += [ cc.find_library('perfuse'),
-             cc.find_library('puffs') ]
-else
-   # Required for clock_gettime before glibc 2.17
-   deps += cc.find_library('rt')
-endif
+# if host_machine.system().startswith('netbsd')
+#    deps += [ cc.find_library('perfuse'),
+#              cc.find_library('puffs') ]
+# else
+#    # Required for clock_gettime before glibc 2.17
+#    deps += cc.find_library('rt')
+# endif
 
 fusermount_path = join_paths(get_option('prefix'), get_option('bindir'))
-libfuse = library('fuse3', libfuse_sources, version: meson.project_version(),
-                  soversion: '3', include_directories: include_dirs,
+# libfuse = library('fuse3', libfuse_sources, version: meson.project_version(),
+#                   soversion: '3', include_directories: include_dirs,
+#                   dependencies: deps, install: true,
+#                   link_depends: 'fuse_versionscript',
+#                   c_args: [ '-DFUSE_USE_VERSION=35',
+#                             '-DFUSERMOUNT_DIR="@0@"'.format(fusermount_path) ],
+#                   link_args: ['-Wl,--version-script,' + meson.current_source_dir()
+#                               + '/fuse_versionscript' ])
+
+libfuse = static_library('fuse3', libfuse_sources,
+                  include_directories: include_dirs,
                   dependencies: deps, install: true,
                   link_depends: 'fuse_versionscript',
                   c_args: [ '-DFUSE_USE_VERSION=35',
@@ -42,13 +53,13 @@ libfuse = library('fuse3', libfuse_sources, version: meson.project_version(),
                   link_args: ['-Wl,--version-script,' + meson.current_source_dir()
                               + '/fuse_versionscript' ])
 
-pkg = import('pkgconfig')
-pkg.generate(libraries: [ libfuse, '-lpthread' ],
-             libraries_private: '-ldl',
-             version: meson.project_version(),
-             name: 'fuse3',
-             description: 'Filesystem in Userspace',
-             subdirs: 'fuse3')
+# pkg = import('pkgconfig')
+# pkg.generate(libraries: [ libfuse, '-lpthread' ],
+#              libraries_private: '-ldl',
+#              version: meson.project_version(),
+#              name: 'fuse3',
+#              description: 'Filesystem in Userspace',
+#              subdirs: 'fuse3')
 
 libfuse_dep = declare_dependency(include_directories: include_dirs,

5)meson.build

youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ git diff meson.build
diff --git a/meson.build b/meson.build
index 8a6587b..135d110 100644
--- a/meson.build
+++ b/meson.build
@@ -47,8 +47,8 @@ foreach func : test_funcs
 endforeach
 cfg.set('HAVE_SETXATTR', 
         cc.has_function('setxattr', prefix: '#include <sys/xattr.h>'))
-cfg.set('HAVE_ICONV', 
-        cc.has_function('iconv', prefix: '#include <iconv.h>'))
+# cfg.set('HAVE_ICONV', 
+#         cc.has_function('iconv', prefix: '#include <iconv.h>'))
 
 # Test if structs have specific member
 cfg.set('HAVE_STRUCT_STAT_ST_ATIM',
@@ -118,7 +118,7 @@ endif
 include_dirs = include_directories('include', 'lib', '.')
 
 # Common dependencies
-thread_dep = dependency('threads') 
+# thread_dep = dependency('threads') 
 
 #
 # Read build files from sub-directories
@@ -128,13 +128,13 @@ if get_option('utils') and not platform.endswith('bsd') and platform != 'dragonf
   subdirs += [ 'util', 'doc' ]
 endif
 
-if get_option('examples')
-  subdirs += 'example'
-endif
+# if get_option('examples')
+#   subdirs += 'example'
+# endif
 
-if get_option('tests')
-  subdirs += 'test'
-endif
+# if get_option('tests')
+#   subdirs += 'test'
+# endif
 
 foreach n : subdirs

6)util/meson.build

youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ git diff util/meson.build
diff --git a/util/meson.build b/util/meson.build
index 577668f..7e2a256 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -14,16 +14,16 @@ executable('mount.fuse3', ['mount.fuse.c'],
            c_args: '-DFUSE_USE_VERSION=35')
 
 
-udevrulesdir = get_option('udevrulesdir')
-if udevrulesdir == ''
-  udev = dependency('udev')
-  udevrulesdir = join_paths(udev.get_pkgconfig_variable('udevdir'), 'rules.d')
-endif
+# udevrulesdir = get_option('udevrulesdir')
+# if udevrulesdir == ''
+#   udev = dependency('udev')
+#   udevrulesdir = join_paths(udev.get_pkgconfig_variable('udevdir'), 'rules.d')
+# endif
 
-meson.add_install_script('install_helper.sh',
-                         join_paths(get_option('prefix'), get_option('sysconfdir')),
-                         join_paths(get_option('prefix'), get_option('bindir')),
-                         udevrulesdir,
-                         '@0@'.format(get_option('useroot')))
+# meson.add_install_script('install_helper.sh',
+#                          join_paths(get_option('prefix'), get_option('sysconfdir')),
+#                          join_paths(get_option('prefix'), get_option('bindir')),
+#                          udevrulesdir,
+#                          '@0@'.format(get_option('useroot')))

六. 编译libfuse源码

youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ ~/work/meson/meson/meson.py arm64-build --cross-file ./arm64.txt
youthful@youthful-VirtualBox-Ubuntu:~/work/fuse/libfuse-3.10$ ninja -C arm64-build

编译结果(<project_root>:libfuse源码根目录):

<project_root>/arm64-build/lib/libfuse3.a(注:如果要编译so,请在5.4步骤修改lib/meson.build时,将library()字段放开,并注释掉static_library()字段!!!

<project_root>/arm64-build/util/fusermount3

<project_root>/arm64-build/util/mount.fuse3

七. 使用方法

当其他库需要依赖libfuse3.a,请指定libfuse3.a所在路径。

运行时:

1)如果是编译的libfuse3.so.*,需要将该so通过adb push到/system/lib64/目录下;

2)将fusermount3和mount.fuse3通过adb push到/system/bin/目录下。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
centos 挂载ntfs所需要的步骤 我就是在挂载2TB的时候发现的 linux挂载NTFS分区移动硬盘2010-09-23 16:35CentOS 挂载NTFS分区移动硬盘 1.uname -r 查看当前的linux内核版本. [root@localhost Desktop]# uname -r 2.6.18-128.el5 2.去http://www.linux-ntfs.org/下载与内核版本相同的ntfs补丁.具体的地址 3.安装补丁:kernel-module-ntfs-2.6.18-128.el5-2.1.27-0.rr.10.11.i686.rpm [root@localhost Desktop]# rpm -ivh kernel-module-ntfs-2.6.18-128.el5-2.1.27-0.rr.10.11.i686.rpm Preparing... ########################################### [100%] 1:kernel-module-ntfs-2.6.########################################### [100%] 4.使用fdisk -l查看硬盘的分区信息. 5.mkdir /mnt/xxx 在mnt文件夹里新建文件夹,分别对应于移动硬盘下的分区(xxx为文文件夹名) 如:mkdir /mnt/name1 对应于叫做name1的盘 6.mount -t ntfs /dev/sdyz /mnt/xxx 将移动硬盘下的各分区挂载在新建的文件夹里(sdyz为硬盘的分区号码) 如: [root@localhost Desktop]# mount -t ntfs /dev/sdc1 /mnt/TheLORD,OurGod 今天将USB移动硬盘挂在CentOS上准备将压缩包拷贝下来的。 结果挂载移动硬盘的时候却提示: mount: unknown filesystem type ‘ntfs’ 原因:Linux无法识别NTFS格式的分区。 解决: 因为刚刚将CentOS升级到了2.6.18-164.el5内核,无法使用Kernel NTFS Module挂载Windows下的NTFS分区(没有在开源站点上找到相应内核包),所以只有使用ntfs-3g来解决了。 打开ntfs-3g的下载站点,将最新稳定版(当前最新版本为ntfs-3g-2010.3.6)下载到CentOS,执行以下命令安装: 1、编译安装ntfs-3g: #./configure #make #make install [/code] 2、查看USB设备点: #fdisk -l Disk /dev/sdb: 60.0 GB, 60011642880 bytes 255 heads, 63 sectors/track, 7296 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 * 1 653 5245191 b W95 FAT32 /dev/sdb2 654 7295 53351865 f W95 Ext'd (LBA) /dev/sdb5 654 1958 10482381 b W95 FAT32 /dev/sdb6 1959 7295 42869421 7 HPFS/NTFS 3、挂载NTFS分区: #mount -t ntfs-3g /dev/sdb6 /mnt/win
NDK交叉编译Boost是将Boost库编译成适用于Android平台的库文件,以便在Android应用中使用Boost库的功能。下面是一般的NDK交叉编译Boost的步骤: 1. 下载NDK:首先,你需要下载并安装Android NDK,可以从官方网站(https://developer.android.com/ndk/downloads)上获取最新版本的NDK。 2. 下载Boost库:接下来,你需要下载Boost库的源代码。你可以从Boost官方网站(https://www.boost.org/users/download/)上下载最新版本的Boost库。 3. 配置Boost库:解压下载的Boost源代码,并进入解压后的目录。在终端中执行以下命令来配置Boost库: ``` ./bootstrap.sh --with-libraries=<library_names> --with-toolset=<toolset_name> --prefix=<install_path> ``` 其中,`<library_names>`是你需要编译的Boost库的名称,可以根据你的需求进行选择;`<toolset_name>`是你要使用的编译工具链,例如`clang`或`gcc`;`<install_path>`是你希望安装Boost库的路径。 4. 编辑user-config.jam文件:在Boost源代码目录下,创建一个名为`user-config.jam`的文件,并添加以下内容: ``` using clang : <ndk_version> : <path_to_ndk>/toolchains/llvm/prebuilt/<host_os>/bin/clang++ ; ``` 其中,`<ndk_version>`是你下载的NDK的版本号,`<path_to_ndk>`是你安装NDK的路径,`<host_os>`是你的操作系统类型(例如`darwin-x86_64`或`linux-x86_64`)。 5. 开始编译Boost库:在终端中执行以下命令来开始编译Boost库: ``` ./b2 toolset=clang-<ndk_version> target-os=android link=static threading=multi variant=release install ``` 这将使用指定的编译工具链和选项来编译Boost库,并将编译结果安装到之前配置的安装路径中。 6. 完成编译:等待编译过程完成,然后你将在之前配置的安装路径中找到编译好的Boost库文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值