问题标签 [newlib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
9535 浏览

glibc - 寻找 snprintf() 的 C 源代码

我需要将 snprintf() 移植到另一个不完全支持 GLibC 的平台。

我正在寻找 Glibc 2.14 源代码中的底层声明。我遵循了许多函数调用,但卡在 vfprintf() 上。然后它似乎调用了_IO_vfprintf(),但我找不到定义。可能宏正在混淆事物。

我需要查看真正的 C 代码,它扫描格式字符串并计算如果输入缓冲区足够大时它将写入的字节数。

我也尝试查看 newlib 1.19.0,但我被困在 _svfprintf_r() 上。我在任何地方都找不到定义。

有人可以为我指出 snprintf() 的定义或另一个定义吗?

0 投票
4 回答
38911 浏览

c - 对“只有一些 math.h”函数的未定义引用

我有一个奇怪的问题。

数学库已添加到我的 makefile 中。

在输出文件(.map)中,我可以看到所有内容都已正确链接:

当我做

它工作正常。但是,如果我测试另一个功能,例如:

我去拿:

怎么会这样?powasin都在math.h中可用,见下文:

一个如何工作,另一个如何产生链接器问题? 如果我在libm.a上运行-nm ,我会得到以下结果:(对于巨大的输出,我只复制了带有sin一词的部分)

EDIT1: 我又测试了一些,问题如下(不是我上面最初所说的):

当我尝试构建时会发生什么,我在最后一行得到一个“未定义的引用”,这意味着当我使用常量时它很好,但是当我将变量传递给 sin 函数时它不会链接。我还测试了许多其他数学函数,我会得到完全相同的链接器问题。一旦我将变量传递给数学函数,我就无法再链接了。有任何想法吗?

0 投票
1 回答
1836 浏览

embedded - 使用 printf 打印 float/double 会使程序崩溃

我正在为PowerPc进行系统调用实现。我已经测试了一些 gcc 函数,它们似乎都可以工作(例如 sqrt sin cos pow printf malloc ...)

我最近意识到printf存在问题。只要我打印一些整数/字符,它就可以正常工作,但是当我尝试 printf %f/lf打印浮点/双倍时,程序崩溃了。(它似乎在不应该在的地方执行)

我检查了makefile,它使用:

在制作程序时,我可以看到许多nof(无浮点)库被链接。

我也知道我在堆栈/堆中有足够的空间,所以这应该不是问题。 打印浮点数时printf应该崩溃还有一个原因吗?

0 投票
1 回答
6069 浏览

arm - 与 newlib 链接:对 memcpy 的未定义引用

我正在尝试构建一个 arm 引导加载程序,它依靠 newlib 提供一些系统调用(如 memcpy)。

当我运行时:

我得到以下信息:

现在,我正在攻击 memcpy,并希望其他人跟随。当我运行nm /usr/arm-elf/lib/thumb/libc.a(我相信这是 libc 的 newlib 版本)时,它显示:

因此,这表明 memcpy 是在库中定义的。

我运行strace上面的ld命令以确保它实际上正在查看该文件,并且确实如此。

我在这里想念什么?为什么它抱怨未定义的 memcpy?

0 投票
1 回答
252 浏览

porting - newlib 函数的页面错误

我一直在将 newlib 移植到我非常小的内核中,但我很困惑:每当我包含一个引用系统调用的函数时,我的程序都会在执行时出现页面错误。如果我调用一个不引用系统调用的函数,比如rand(),什么都不会出错。

注意:包含,我的意思是只要函数,例如printf()or fopen(),在程序内部的某个地方,即使它不是通过 调用的main()

这个问题我已经有一段时间了,不知道是什么原因造成的:

  • 我已经多次重建 newlib
  • 修改了我的 ELF 加载器以从节头而不是程序头加载代码
  • 尝试单独构建 newlib/libgloss(失败)
  • GROUP使用、gcc 和 ld通过 ld 脚本链接库(libc、libnosys)

我不太确定我应该包含哪些其他信息,但我很乐意包含我可以包含的信息。

编辑:为了验证,发生的页面错误不在失败函数的地址;他们在程序的其他地方。例如,当我调用fopen()位于 0x08048170 的 时,我将在 0xA00A316C 处出现页面错误。

编辑2:加载ELF的相关代码:

编辑3:我注意到如果我调用系统调用,例如write(),然后调用printf()两次或更多次,我会得到一个未知的操作码中断。奇怪的。

0 投票
2 回答
2424 浏览

cygwin - 安装 mips 交叉编译器的问题

我正在做我的硕士论文,我在配置交叉编译器时遇到了问题。我已经阅读了很多文章、常见问题解答、教程等,但我仍然认为我遗漏了一些东西,可能非常愚蠢和基础,但没有这些,我就无法对所有事情有清晰的认识,我也不能让一切正常……所以请随时向我解释一切。让我们来解决问题。

我正在使用 SoClib 设计具有许多 MIPS 和许多 RAM 的 NoC,并且我想在每个 RAM 中加载不同的应用程序,以使每个 MIPS 仅从一个 RAM 读取。我设法使用非常简单的应用程序来做到这一点(比如带中断的 hello word……),所以现在我试图实现一个 JPEG 解码器,以便以更强烈的方式使用 MIPS。问题是我使用的交叉编译器找不到基本的 stdio 函数,因此无法为 mips 编译应用程序。所以基本上我没有设法安装一个工作完整的交叉编译器。

1)让我们从安装 SoClib 的交叉编译器开始:这里有我安装它的指南:http: //www.soclib.fr/trac/dev/wiki/CrossCompiler 现在从我已经阅读这不是一个完整的交叉编译器。我只安装了第一阶段 gcc,它可以为 mips 生成 elf 代码,但不能使用任何 C 函数。有了那个,我应该编译一个 C 库来创建一个新的交叉编译器。所以它不工作是正常的,尽管这并不能回答这个问题:为什么“Hello world”在使用 printf 并包含 stdio.h 的情况下工作?答案应该是我已经看到 SoClib 的头文件 stdio.h 实现了很少的功能(printf 在那里),所以我不能在那个编译器中使用标准 C 库。

2)因此,我决定安装一个完整的交叉编译器,并且我已经阅读了很多指南,因此我只会发布我在实践中使用过的两个: http ://www.cse.iitb.ac.in /grc/gcc-workshop-11/downloads/slides/gccw11-config-build.pdf 从第 108 页开始(在解释交叉编译的问题之前)它使用 EGLIBC。唯一的区别是我使用了“mipsel-elf”作为目标。如果我理解正确的话,这个方法需要一个 3 阶段的交叉编译器,因为 eglibc 不能用第一阶段的交叉编译器完全编译。现在的问题是我无法使用第一阶段交叉编译器成功安装 eglibc(它在第 122 页失败)。我附上了日志。我认为问题开始于它说:“mipsel-elf-gcc:错误:无法识别的选项'-V'”和“mipsel-elf-gcc:致命错误:没有输入文件编译终止”。似乎我的编译器有一些问题,并且所有都使用不受支持的平台完成......但它应该可以工作,因为我已经复制了 eglibc/ports 目录,就像指南所说的......</p>

3) 我尝试了另一个使用 newlib 而不是 eglibc 的指南: http://www(dot)cygwin(dot)com/ml/crossgcc/2005-08/msg00114/l-cross-ltr.pdf 本指南仅创建一个两阶段的交叉编译器。我认为这是因为 newlib 可以用第一阶段编译器完全编译……我说的对吗?无论如何,我遇到了同样的问题。我无法编译 newlib 并且收到类似的错误(附加日志)。

所以这是我的问题,在这里我提出了一些疑问,我试图解决它。

4) 问题可能出在目标 = mipsel-elf 上吗?我从 gnu 文档中知道配置 gnu 的名称应该是:cpu-manufacturer-os(或 cpu-manufacturer-kernel-os),但我读过 mipsel-elf 被接受。精灵应该是因为我不想在我的 NoC 平台上加载操作系统,这是第二个疑问……</p>

5)问题可能出在操作系统上吗?指南使用 linux 内核头文件……也许带有 mipsel-elf 目标我不应该配置 binutils –with-sysroot?但听起来我很奇怪......应该改变什么?

6) 还有一个可能很愚蠢的问题。stdio 和通常的 C 函数,不需要操作系统,对吗?因为所有这些问题都让我对基础产生怀疑……所以我应该能够使用 mipsel-elf 交叉编译器运行 JPEG 解码 C 应用程序,对吧?

我们将不胜感激每一个考虑、建议和帮助。如果您有关于这些论点的一些文件,请告诉我,我想学习并在这个领域变得更有信心。谢谢

eglibc 日志:

选项“-qlanglvl=extc89”配置:2809:$?= 1

NEWLIB日志

0 投票
2 回答
347 浏览

compilation - 工具链和库

当我们编译一个工具链时,我们需要指定我们使用哪个库来编译这个工具链。例如,我最近为 openRISC 架构编译了工具链。他们让我可以从 uClibc 和 newlib 中进行选择。

有必要用库编译工具链吗?在使用嵌入式 linux 时,我不能只在目标平台上编译一个库,然后使用工具链(在没有库的情况下编译)并将库与用户程序链接起来吗?谢谢!

0 投票
2 回答
1783 浏览

gcc - 将 newlib 移植到交叉编译器中

我正在使用本教程创建一个交叉编译器。

我按照 gcc 交叉编译器教程进行了移植 newlib。一切正常,直到我尝试通过发布来编译它

make all install

当我收到以下错误时:

并且编译停止。

我正在使用 Ubuntu 11.10。

我努力了:

  • 使用不同的 gcc、binutils 和 newlib 版本(大约 5 种不同的组合)

  • 安装 Texinfo

  • 更正 makeinfo 路径

我的交叉编译器在没有 newlib 的情况下完美运行,只是它当然不能包含库。

0 投票
2 回答
1194 浏览

embedded - Newlib 针对代码大小进行了优化

在我的嵌入式应用程序中,它对内存非常敏感,我注意到一些 newlib 函数使用了大量的堆栈空间。通过查看 newlib 的源代码,特别是本例中的 memmem.c,我注意到两个定义,PREFER_SIZE_OVER_SPEED 和 __OPTIMIZE_SIZE__,它们可以大大减少内存使用量。据我了解,这些应该在编译 newlib 以使用“优化大小”库时定义。由于我使用的是 cortex-M3 微控制器,是否有任何 ARM 工具链使用“优化大小”newlib 或提供使用它的选项,或者我应该尝试自己构建它。此外,在构建 newlib 时,我应该也构建 GCC 还是可以只构建库并将其与我当前的工具链一起使用。目前我正在使用 CoIDE 和他们提供的工具链。

0 投票
1 回答
16234 浏览

arm - 在 ARM Cortex-M3 中使用 newlib 的 malloc

我正在为 ARM Cortex-M3(NXP 的 LCP17xx)创建代码。到目前为止,我一直在使用静态内存,一切运行良好。我试图添加动态内存支持,但是一旦我调用 malloc,系统就会卡住。

我正在用 gcc 编译 arm 裸机,并使用 newlib。版本:gcc-arm-none-eabi-4_6-2012q1

为了添加对 malloc 的支持,我实现了一个简单的 _sbrk 函数并修改了我的链接器脚本以为堆腾出一些空间(我已经阅读了许多关于这部分的不同教程,但没有一篇涵盖我接下来遇到的问题)。

在一些 LED 的帮助下,我可以确定代码一直运行到它调用的那一点malloc,然后它就不会继续了。它甚至达不到我的_sbrk功能。sizeof此外,如果我malloc稍后在代码中包含对 的调用,它将卡在对 的调用中。

malloc那么,当调用代码时卡住而没有到达_sbrk或返回时,我会做错什么?

在盯着包含调用和不包含调用时生成的内存映射一段时间后malloc,我怀疑它与malloc.

这是定义 ram 内存的 ld 脚本的一部分:

然后在中断向量表中设置_end_stack。

现在比较不同的地图。在代码中不使用 malloc :

在代码中使用 malloc 的内存映射: