在独立程序中使用 GMP
Posted
技术标签:
【中文标题】在独立程序中使用 GMP【英文标题】:Using GMP in freestanding programs 【发布时间】:2016-03-26 19:18:23 【问题描述】:是否可以在独立环境中使用 GMP?
我正在开发一个必须在裸机上运行的程序(以减少开销并出于安全目的 - 不允许使用外部代码),迫使我创建一个简约的内核,但是,我还需要使用 GMP任意大的整数。我看过 mini-GMP,但它似乎比真正的(完整)GMP 慢几个数量级。
请注意:我已经查看了this 问题,但是除了 OP 说他对 mini-GMP 感到满意的答案之外似乎没有其他答案。..
【问题讨论】:
您在尝试使用/链接 GMP 时遇到了哪些问题? @OliverCharlesworth GMP 适用于普通程序,但在使用 -ffreestanding 编译的程序中使用时,只要使用 GMP 函数,链接器就会报告未定义的引用错误。 独立环境不一定提供 C 标准库。如果您想在这样的环境中使用标准库函数,或者使用这样做的第三方库,那么您需要准备好提供您自己的所需函数的实现。这当然是可能的,但结果可能需要提供相当多的功能,并且您需要注意您的实现是否符合要求。 @JohnBollinger 我为我的内核构建了一个小的 stdlib.h/c ,它具有所有基本功能(我已尽力符合标准)并且我知道我应该在技术上正在为这样的项目编写我自己的任意精度算术库,但是我写的任何东西都不会像 GMP 或 ARPREC 一样高效 如果链接器抱怨未定义的引用,那是因为您没有提供 GMP 依赖的所有函数。顺便说一句,您是为独立环境构建 GMP,还是尝试使用预先构建的(用于托管环境)?如果是后者,那么请为目标环境构建自己的 GMP——它将帮助您确保满足所有依赖关系,并且可以完全避免对编译器运行时库提供的某些内部函数(不是)的依赖。 【参考方案1】:您应该能够将静态库链接到独立的可执行文件中。就像链接更多的目标文件一样。
所以构建一个静态版本的 GMP(最好使用-march=atom
或任何适合您的目标硬件的东西)。将libgmp.a
放在某处并使用-Ldir
告诉编译器在哪里。
我自己还没有为 GMP 尝试过这个,所以我不能保证构建静态 GMP 没有复杂性,但大多数包的构建脚本都包含构建静态库的选项。 (例如--enable-static
)
【讨论】:
以上是关于在独立程序中使用 GMP的主要内容,如果未能解决你的问题,请参考以下文章