交叉编译 gmp

交叉编译 gmp

1 概述

GMP (GNU Multiple Precision Arithmetic Library) 是一个用于任意精度计算设计的数学库,它的主要目标应用是密码学应用和研究、互联网安全应用、代数系统、计算代数研究等。

GMP 经过精心设计,无论是小操作数还是大操作数,都尽可能快,是一个高性能的数学库。自 1991 年首次发布以来,GMP 还在不断开发和维护,大约每年发布一次新版本。

从版本 6 开始,GMP 在双重许可证下发布(GNU LGPL v3GNU GPL v2),这些许可证使库可以自由使用、共享和改进。

GMP 库提供了丰富的算术运算功能,包括整数运算、有理数运算和浮点运算,这些功能的实现都考虑到了提升性能和精度:

  • 整数运算:支持任意精度的整数运算,包括加法、减法、乘法、除法、模运算等。这对于处理大整数计算任务非常重要,如密码学中的大数模运算和幂运算。
  • 有理数运算:支持有理数的加减乘除等基本运算,以及有理数的约分和化简。
  • 浮点运算:虽然 GMP 主要以整数运算著称,但它也提供了对浮点数的高精度计算功能,支持任意精度的浮点数运算,包括加减乘除、取模和开平方等操作。

综上所述,GNU GMP 库是一个功能强大且高效的数学库,适用于处理大整数和高精度浮点数的计算任务。它的广泛应用领域和卓越性能使其成为科学研究、金融分析和密码学等领域的重要工具。

官方网址: https://gmplib.org/

在这里插入图片描述

2 源码下载

2.1 官网下载

在官方网址的入口处其实已经给出了下载链接,点击 Download 后面的版本链接 「gmp-6.3.0.tar.xz」 即可直接下载。在「Download the latest release of GMP」章节,显示了已发布的最新的版本信息及下载链接,选择合适的压缩格式的版本即可。如下图所示:

在这里插入图片描述

也可以使用 wget 命令直接下载:

wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz

GMP 的历史版本可以在 https://gmplib.org/download/gmp/ 路径下找到。

GMP 的源码没有使用 Git 进行版本管理,它使用的是称为 Mercurial 的版本管理器,在 GMP Repository Usage 中有详细的介绍。

2.2 使用 apt source 下载

如果你使用的是 Ubuntu/Debian 系统,可以使用 apt source 指令进行源码下载。

mkdir libgmp
cd libgmp
apt source libgmp10

此处下载的是与 Ubuntu/Debian 系统版本相符的 GMP 源码,并非最新源码。

3 交叉编译

解压缩源码包,如果使用 apt source 下载回来的源码可以忽略这一步。

tar -xvf gmp-6.3.0.tar.xz 

解压缩源码包之后建议先阅读 README 与 INSTALL 文档,里面有关于编译的相关信息。

GMP 支持的是 GNU Build System 编译系统,简单理解就是 Unix 经典编译三部曲:

./configure
make
make install

在进行交叉编译前,首先创建一个环境配置文件 aarch64-environment-setup,配置最重要的交叉编译环境变量:

aarch64-environment-setup:

export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH

export PREFIX=/usr

export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip

export CONFIGURE_FLAGS="--host=aarch64-linux --build=x86_64-linux"

export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig

在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin 目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CCCXXCPPLD 环境变量时指定 --sysroot=<dir> 参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include/usr/lib

cd gmp-6.3.0
source aarch64-environment-setup
./configure --prefix=/usr $CONFIGURE_FLAGS
make
make DESTDIR=$BUILDSYSROOT install
  • 源码包解压后,使用 cd 命令切换到源码路径
  • 在源码目录下创建环境设置文件并调用 source 命令让环境变量生效
  • 执行源码包的 configure 文件,带上 --prefix 参数,指定安装路径。在配置文件中定义了临时的 CONFIGURE_FLAGS 来指定 --host--build 选项的值,具体的说明可以使用 ./configure --help 命令进行查阅
  • 执行 make 命令编译源码
  • 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,详细介绍可以参考 DESTDIR 官方介绍。

最终你就可以在环境变量定义的 $BUILDSYSROOT 目录中找到交叉编译好的 libgmp 的头文件及库文件。

注意

当最后执行完安装语句后,还需要将 .la 文件删除掉,否则在交叉编译 gdb 时会报以下链接错误:

libtool: link: cannot find the library `/usr/lib/libgmp.la' or unhandled argument `/usr/lib/libgmp.la'

关于 libtool.la 的说明详见我的另一篇博文。

手动删除 sysroot 目录下的所有 .la 文件:

rm $BUILDSYSROOT/usr/lib/*.la

4 关于 DESTDIR 的说明

DESTDIR 主要用于在安装时重新定位软件包。以下是一个示例说明:

~/amhello-1.0 $ ./configure --prefix /usr
~/amhello-1.0 $ make
~/amhello-1.0 $ make DESTDIR=$HOME/inst install
~/amhello-1.0 $ cd ~/inst
~/inst $ tar zcvf ~/amhello-1.0-i686.tar.gz .
./
./usr/
./usr/bin/
./usr/bin/hello

通过以上操作,~/amhello-1.0-i686.tar.gz 已经准备好部署到任何机器的 / 根目录下了。

Good luck.

欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iBlackAngel

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值